• 使用jQuery开发tab选项卡插件(可以右键关闭多个标签)


    在前一篇“使用jQuery开发tab选项卡插件”的基础上添加了tab标签右键关闭菜单功能,菜单主要包括:关闭当前标签、关闭左侧标签、关闭右侧标签、关闭其他、关闭全部。

    一、插件效果

      

    二、实现思路

    为window对象添加右键菜单事件监听:

    当事件源对象为tab标签时,取消默认的右键菜单,显示菜单div即设置display: block,并为每一个菜单项添加事件监听;

    当事件源对象不为tab标签时,关闭菜单div即设置display: none

    为window对象添加单击事件监听:关闭菜单div即设置display: none

    三、主要元素样式

    .tab-contextmenu {
        display: none;
        position: absolute;
        width: 140px;
        height: 125px;
        padding: 5px;
        overflow: hidden;
        border: 1px solid #dddddd;
        box-shadow: 1px 1px 1px #888;
        background: #FFFFFF;
    }
    .tab-contextmenu .tab-contextmenu-item {
        width: 120px;
        height: 25px;
        padding: 0 10px;
        font-size: 14px;
        line-height: 25px;
        cursor: pointer;
    }
    .tab-contextmenu .tab-contextmenu-item:hover {
        color: #FFFFFF;
        background: #999;
    }

    四、函数和事件监听

    1、生成菜单div函数
    /**
     * 初始化标签右键菜单
     */
    function initContextMenu() {
        var contextMenu = $("body .tab-contextmenu");
        if (!contextMenu[0]) {
            $("<div class='tab-contextmenu'></div>")
                .append(createContextMenuItem("关闭当前标签", "current"))
                .append(createContextMenuItem("关闭左侧标签", "prevAll"))
                .append(createContextMenuItem("关闭右侧标签", "nextAll"))
                .append(createContextMenuItem("关闭其他", "other"))
                .append(createContextMenuItem("关闭全部", "all"))
                .appendTo("body");
        }
        // 创建一个右键菜单项
        function createContextMenuItem(text, target) {
            return $("<div class='tab-contextmenu-item'></div>").html(text).attr("target", target);
        }
    }
    2、window事件监听
    /**
     * 初始化tab标签的右键菜单功能
     */
    function initWindowContextMenu() {
        // 给body绑定两个事件
        $("body")
        // 右键菜单显示
        .bind("contextmenu", contextMenuHandler)
        // 关闭右键菜单
        .on("click", function() {
            $(".tab-contextmenu").css("display", "none");
        });
    
    }
    
    /**
     * body元素的contextmenu事件执行函数
     * @param {Object} ev
     */
    function contextMenuHandler(ev) {
        
        // 获取事件对象,需要兼容IE
        var e = ev || window.event;
        
        // 获取自定义的右键菜单
        var menu = $(".tab-contextmenu");
        
        // 获取事件源
        // e.srcElement,兼容IE、360、chrome
        // e.target,兼容Firefox
        src = $(e.srcElement || e.target);
        
        // 如果事件源对象是tab标签才显示右键菜单、绑定事件
        if (src.hasClass("tab-header-item")) {
            // 获取tab组件
            var tab = src.parent().parent();
            // 选中点击的标签
            tab.tab("selectTab", src.attr("target"));
            // 取消默认的浏览器右键菜单
            e.preventDefault();
            // 根据事件对象中鼠标点击的位置,进行定位
            // 之后根据点击的标签进行事件绑定
            menu
                .css({"left": e.clientX + 'px', "top": e.clientY + 'px', "display": "block"})
                .children().unbind("click").bind("click", function() {
                    // 判断关闭类型:关闭当前标签、关闭左侧标签、关闭右侧标签、关闭其他、关闭全部
                    switch($(this).attr("target")){
                        case 'current':
                            return removeTabs(tab, src);
                        case 'prevAll':
                            return removeTabs(tab, src.prevAll());
                        case 'nextAll':
                            return removeTabs(tab, src.nextAll());
                        case 'other':
                            return removeTabs(tab, src.siblings());
                        case 'all':
                            return removeTabs(tab, src.parent().children());
                    }
                });
        } else {
            menu.css("display", "none");
        }
    }
    3、批量关闭标签
    /**
     * 批量删除tab选项卡
     * @param {Object} $tab
     * @param {Object} items
     */
    function removeTabs($tab, items) {
        // 遍历需要关闭的标签对象,逐一进行关闭
        items.each(function() {
            // 调用removeTab函数关闭一个需要关闭的标签
            removeTab($tab, $(this).attr("target"));
        });
    }
  • 相关阅读:
    MyEclipse中的几种查找方法
    WebLogic初学笔记
    CountDownLatch源码分析
    linux--句柄相关
    linux命令--wc
    Spring源码解析(九)--再来说说三级缓存
    定位JVM内存泄漏常用命令和方法
    Mybatis整合Spring之MapperFactoryBean怎么拿到的SqlSessionFactory
    Mybatis3.3.0 Po类有LocalDateTime字段报错
    时间范围查询优化技巧
  • 原文地址:https://www.cnblogs.com/xugf/p/7754058.html
Copyright © 2020-2023  润新知