FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 4639|回复: 4
打印 上一主题 下一主题

实现关闭用户已经打开的标签!

[复制链接]
跳转到指定楼层
楼主
发表于 2012-5-2 11:04:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  首先谢一下,亭长先生的提示!{:soso_e144:},先说一下我为什么要实现这一的效果,
            因为我的项目左边的导航菜单式动态生成的,第一次进来的时候,加载满足条件的菜单,用户点击,然后相关标签在,右边的Main区域显示相关页面,然后用户点击搜索,左边菜单又不一样了,但是菜单里的每个选项是一样的,比如(man下面有tab1,tab2)因为之前第一次进来的时候,tab1,tab2用户已经打开了,如果现在再次点击的话,页面时不会有相应的,所以,只有在点击搜索的时候,就把用户上一次已经打开的标签都关闭掉。

好了原因说完,下面直接上代码,
  var mainTabStrip = Ext.getCmp('<%= mainTabStrip.ClientID %>');
                    var tabID = 'dynamic_added_tab' + node.id.replace('__', '-');
                    tabIdLists += tabID+",";
                    document.getElementById("tabIdArry").setAttribute("value", "" + tabIdLists + "");
                    mainTabStrip.addTab({
                        'id': tabID,
                        'url': href,
                        'title': node.parentNode.text + ' -> ' + node.text,
                        'closable': true,
                        'bodyStyle': 'padding:0;',
                        //'iconCls': 'icon_' + href.replace(/[^.]+\./, ''),
                        'tbar': new Ext.Toolbar({
                            items: ['->', openNewWindowButton, '-', refreshButton]
                        })
                    });
                }这里是动态添加标签,并且给标签的Id赋值的,tabIdList是申明的一个var变量,把每次打开的tabId给tablists,然后在把tablists给隐藏域tabIdArry,这样我们在后台就能获得用户已经打开的标签的Id了



下面后台的就简单了

string tabs = tabIdArry.Text;
            string [] tabIdArrys=tabs.Split(',');
            foreach (var tabid in tabIdArrys)
            {
                PageContext.RegisterStartupScript(mainTabStrip.GetRemoveTabReference(tabid));
            }
代码我就不分析了,大家都看得懂,
好了到此结束虽然不是什么鸟不起的分享,但毕竟是自己想办法解决的,所以想分享一下,望广大高手多多提意见。

沙发
发表于 2013-5-22 15:57:00 | 只看该作者
我可以发言么,给出客户端的实现 方式
板凳
发表于 2013-5-22 16:03:20 | 只看该作者
在DEAULT.JS中增加以下行

window.removeTab = function (id) {
        mainTabStrip.removeTab(id);
    };
    window.removeOtherTabs = function (id) {
        document.getElementById('tabIdArry').value.split(",").forEach(function (e) {
            if (e != id)
                mainTabStrip.removeTab(e);
        });

在DEFAULT.ASPX中增加

   <x:HiddenField  ID="tabIdArry" runat="server">
        </x:HiddenField>

同时增加全局变量
  var tabIdLists = '';

当然,最关键的,还要用FINEUI的源码,修改X.UTIL.JS,按楼主所说的增加两行代码,然后重新执行JS.BAT,再重新编译后更新项目引用(注意清除浏览器的缓存,否则JS可能不会重新加载)

最后服务器端调用方式如下:

//PageContext.RegisterStartupScript("parent.removeTab('dynamic_added_tabfindDevice');");
            PageContext.RegisterStartupScript("parent.removeOtherTabs('dynamic_added_tabfindDevice');");
            
客户端直接调用就不用说了吧

嗯,如果想让标签有编号,请在MENU.XML中为各节增加属性NodeID,如

<TreeNode NodeID="findDevice" Text="查找设备" NavigateUrl="~/deviceManager/findDevice.aspx">
    </TreeNode>
    <TreeNode NodeID="baseInfo" Text="基本信息" NavigateUrl="~/deviceManager/baseInfo.aspx" >
    </TreeNode>

最后强烈建议 FINEUI将此功能增加到代码中去(目前它只增加了移除功能,对ID没有记录,不过记不记录都无所谓,即使不修改X.UTIL.JS,也一样可以直接去遍历所有可能打开的ID(即使它实际没有打开),然后发出关闭指令)
地板
发表于 2013-5-24 15:20:42 | 只看该作者
看不懂是什么功能
5#
发表于 2013-5-24 16:14:57 | 只看该作者
语言 描述能力太差~!  鉴定完毕 ,而且点击 搜索 为什么左侧的菜单会没有呢? 搜索不应该刷新整个界面才是
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-11-23 11:17 , Processed in 0.045573 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表