多页面的标签支持 - 前台架构

单页面的方式,并不能充分的表达业务的丰富性,相反的是,限制了页面的展现内容。不同业务相关性不强的情况下,尽可能的支持多个页面的同时操作,保存页面操作结果以及状态,增强可操作的灵活性,多页面之间的关联性。

标签多页

传统前台框架,并没有考虑多页面的显示方式,指通过一个单页的重复加载或者不同页面的直接访问来完成页面内容的展现。但是,对于部分需要多页面协同操作,或者前台操作过程的需要多页的场景下,支持多页面共同存在成为需求。

多页面的支持,需要容器持有的同时,提供切换的方式成为一种必然的选择。通过切换的方式,可以实现不同或者相同页面之间的切换,实现多页面功能场景的实现。而切换的方式中,标签方式直观的体现,不同于菜单切换的方式,可以在原菜单作为功能模块的功能支持下,不至于混淆页面与模块功能,达到较好的融合效果。

标签多页实现的过程中,首先需要页面框架能够支持多标签功能样式,作为基础功能。通过样式的持之,可以通过具体的功能来实现标签切换的过程实现标签的激活状态以及页面显示的内容加载过程,同时未激活的标签页面处于的状态以及是否需要提供重新加载功能和删除标签的功能。

此外,标签页面可以组成标签组,标签组可以提供相关操作的功能。例如:全部删除,删除激活页右侧标签页等。

  • 加载

标签页面加载的过程,需要完成标签页面新增的过程,包括标签以及页面样式。标签页面加载完成之后,可以根据标签页面作为基础,增加一些自定义的功能,比如重新加载,删除标签页面等,还可以提供标签页面批处理功能,比如批量删除等。

加载标签页面的过程,可以根据需求来验证当前标签页是否可以加载。比如,标签页的数量,加载标签页是否已经存在等规则,约束标签页面的加载过程。

引用代码,框架为JQuery作为基础,控件为Layer作为功能

...
/**
 * @param page 页面路径 不可为空 如./views/index.html
 * @param features 显示内容
 */
core.loadPage: function (page, feature){

    // 判断加载页面 , 不存在不进行标签页加载
    if (!page) return false;

    if ($('.page.nav-tab').length > 10) {
        core.alert(core.warning, "标签页加载过多");
        return false;
    }

    // 获取当前加载页面的索引
    var menuId = feature.attr("mid");

    // 判断加载页面是否存在 , 如果存在激活标签页面 , 其他标签页调整激活状态
    if ($("#homeNav .page.nav-tab a#tab_"+ menuId +"").length > 0 ) {

        var _tab = $("#tab_"+ menuId +"");
        var _tabPane = $("#"+ menuId +"");

        _tab.parent().siblings().removeClass("active");
        _tab.parent().addClass("active");
        _tabPane.siblings().removeClass("active");
        _tabPane.addClass("active");

        return false;
    }

    // 标签页面包括的各个元素 , 比如标签 , 加载页面 , 删除标签页面 , 重新加载标签页面
    var opearteTab = $("#homeNav > #operateTab");
    var deleteBtn = $('<div class="removePage"><i class="icon-remove"></i></div>');
    var refreshBtn = $('<div class="removePage"><i class="icon-refresh"></i></div>');
    var tabLi = $('<li class="page nav-tab active" data-page="'+ page +'"></li>');
    var taba = $('<a></a>').html(feature.attr("menuText")).attr({
        "data-toggle": "tab",
        "href": "#'+ menuId,
        "id": "tab_" + menuId
    }).append(refreshBtn).append(deleteBtn);
    var tabPane = $('<div id="'+ menuId +'" class="page tab-pane in active"></div>').attr({
        'icon': feature.attr('icon'),
        'helpKey': feature.attr('helpKey'),
        'text': feature.attr("menuText"),
        'parentText': $(feature.parents('li').find('a:first')).attr("menuText")
    });

    var tabClose = $("#dropdown");

    // 其他页面设置为未激活状态
    $(".page.nav-tab").removeClass("active");
    $(".page.tab-pane").removeClass("active");

    opearteTab.before(tabLi.append(taba));
    $(".page.tab-content").append(tabPane);

    tabPane.load(page);

    // 删除功能 , 需要判断删除标签页面是否处于激活状态
    tabDel.on("click", function(){

        var _btn = $(this);
        var _tab = _btn.parents('li.page');

        var _pageId = _btn.parent("a").attr("href");
        var _page = $(_pageId);

        if(_tab.hasClass("active")){
            params['urlLoadParams'] = core.splitUrl(_tab.prev().attr('data-page'));

            _tab.prev('li.page').addClass('active');
            _page.prev('div.page').addClass('active');
        }

        _tab.remove();
        _page.remove();
    });

    // 
    taba.on("click", function(){
        tabClose.removeClass('show');
        params['urlLoadParams'] = core.splitUrl(page);
    });

    // 刷新功能
    refreshBtn.on("click", function(){
        var target = $($(this).parent().attr("href"));

        setTimeout(function(){
            tabPane.load(page);
            target.removeClass("tab-mask");
        }, 1200);
    });

},
...

  • 切换

虽然多页面的标签方式来完成页面的加载过程,但存在场景需要在标签页面内完成不同页面的加载过程。所以,标签页面内切换加载不同的页面进行支持。

...
/**
* 加载页面 , 切换页面功能
* @param url 页面地址
* @param data 页面携带参数
* @param callback 成功回调
*/
core.switchPage: function (url, notTab, data, callback) {
    var container = $(".page.tab-pane.active").attr("id");
    $("#" + container).load(url, data, function (response, status, xhr) {
        callback && callback(response, status, xhr);
    });
},
...

  • 获取元素

不同标签页面之间,可能存在相同属性的元素,获取元素的过程存在冲突的现象,导致问题发生。所以,利用一个独立获取激活状态标签页面中元素的方法进行提供。通过识别激活状态的标签页面来获取可见标签元素,避免获取到其他标签页面元素,对于使用者来说,与操作独立页面相同。

...
/**
 * 获取当前使用标签页面对应选择器内容的页面元素
 * @param selecter 选择器
 * @param contianer 指定元素内
 * @return 元素对象
 */
focusPage: function(selecter, contianer){
    if(!contianer){ return $('.page.tab-pane.active').find(selecter); }
    else { return $('.page.tab-pane.active').find(contianer).find(selecter); }
},
...

JQuery更多使用说明,参考JQuery官方网站。
LayUI(Layer)所有使用方式,参考LayUI官方网站,了解更多功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容