JS组件系列——Bootstrap右键菜单解决方案:ContextMenu

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS组件系列——Bootstrap右键菜单解决方案:ContextMenu相关的知识,希望对你有一定的参考价值。

前言:有段时间没发表随笔了,过个年人都变得懒了。新年刚来上班,今天正好得空,将去年遗留的两个小组件总结记录下。有朋友跟我说:你的bootstrap组件要能够形成一个可以满足一般项目需求的系列组件,才有真正的实用价值。想想说得在理。这不今天来总结下bootstrap的一个小组件的应用。好了,不说废话,进入正题吧。

一、ContextMenu介绍

年前,博主接到一个需求:表格行调序,支持多选调序,并且可以不连续多选。什么意思呢?先来看看需要实现的效果图:

技术分享

需求是:需要将选中的6、8、9行移动到第2行和第3行之间。撇开业务不说,单纯从技术层面来说,要想使用最少操作达到上述效果,博主想到了右键功能,如果能够在第2行或者第3行上面点击鼠标右键,通过右键菜单功能将选中的行移动到相应的位置,这样是不是最简单呢。说做咱就做,于是找组件,搜索“bootstrap 右键菜单”。最终找到了我们的ContextMenu组件,仔细研究之后,觉得效果还行,所以在此分享出来供需要使用的园友参考。

ContextMenu开源地址:https://github.com/sydcanem/bootstrap-contextmenu

ContextMenu使用Demo:http://sydcanem.com/bootstrap-contextmenu/

二、ContextMenu效果

初始右键效果

技术分享

运用到项目中

技术分享

执行菜单功能后

技术分享

三、ContextMenu代码示例

其实就这么一个简单的东东,我们来看看如何使用它。

1、引用相应的文件。关键的就两个bootstrap-contextmenu.js和prettify.js

<script src="/Scripts/jquery-1.9.1.min.js"></script>
<script src="/Content/bootstrap/js/bootstrap.min.js"></script>
<script src="/Content/boostrap-contextmenu/bootstrap-contextmenu.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/prettify/r224/prettify.js"></script>

2、html准备

    <div id="context-menu">
        <ul class="dropdown-menu" role="menu">
            <li><a tabindex="-1" href="#" operator="top">插入此行上面</a></li>
            <li><a tabindex="-1" href="#" operator="bottom">插入此行下面</a></li>
        </ul>
    </div>

3、JS初始化

$(function () {
    var oTable = new TableInit();
    oTable.Init();
});

var TableInit = function () {
    var oTableInit = new Object();

    var m_pagerow = 0;
    oTableInit.Init = function () {
        $(‘#tb_order‘).bootstrapTable({
            url: ‘/apiaction/Order/OrderApi/get‘,
            method: ‘get‘,
            toolbar: ‘#toolbar‘,
            striped: true,
            cache: false,
            striped: true,
            pagination: true,
            uniqueId: "TO_ORDER_ID",
            sidePagination: "server",
            pageSize: 10,
            pageList: [10, 25, 50, 100],
            columns: [{
                checkbox: true
            },
            {
                title: ‘序号‘,
                align: ‘center‘,
                formatter: function (value, row, index) {
                    return m_pagerow + index + 1;
                },
            },
            {
                field: ‘ORDER_NO‘,
                title: ‘订单号‘
            },
            {
                field: ‘BODY_NO‘,
                title: ‘车身号‘
            }, {
                field: ‘VIN‘,
                title: ‘VIN码‘
            }, {
                field: ‘TM_MATERIAL_NAME‘,
                title: ‘整车编码‘
            },
            {
                field: ‘ORDER_TYPE_NAME‘,
                title: ‘订单类型‘
            },
            {
                field: ‘ORDER_STATUS_NAME‘,
                title: ‘订单状态‘
            }
            ],
            onPageChange: function (number, size) {
                m_pagerow = (number - 1) * size;
            },
            onLoadSuccess: function () {
                //表格加载完成之后再初始化表格行的右键功能
                oTableInit.InitContextMenu();
            }
        });
    };

    oTableInit.InitContextMenu = function () {
        $(‘#tb_order‘).find("tbody").find("tr").contextmenu({
            target: ‘#context-menu‘,
            before: function (e) {
                e.preventDefault();
                this.getMenu().find("li").eq(2).find(‘a‘).html("This was dynamically changed");
                return true;
            },
        //这个就对应着选择菜单功能之后的处理事件
            onItem: function (context, e) {
          //获取当前选中菜单li的operator属性
                var stroperator = $(e.target).attr("operator");
                var insertuniqueid = $(context).attr("data-uniqueid");
                //得到表格选中行
                var arrSelection = $("#tb_order").bootstrapTable("getSelections");
                //依次删除选中行
                for (var i = 0; i < arrSelection.length; i++) {
                    $(‘#tb_order‘).bootstrapTable("removeByUniqueId", arrSelection[i].TO_ORDER_ID);
                }
                var arrData = $("#tb_order").bootstrapTable("getData");
                $("#tb_order").bootstrapTable("load", arrData);
                
                var rowIndex = $("#tb_order").find("tbody").find("tr[data-uniqueid=‘" + insertuniqueid + "‘]").attr("data-index");
                rowIndex = parseInt(rowIndex, 10);
                if (stroperator == "bottom") {
                    rowIndex += 1;
                }
                //依次插入选中行
                for (var i = 0; i < arrSelection.length; i++) {
                    $("#tb_order").bootstrapTable("insertRow", { index: rowIndex++, row: arrSelection[i] });
                }
                oTableInit.InitContextMenu();
            }
        });
    }

    return oTableInit;
};

代码不难,就是些表格行操作的逻辑。需要说明的地方:

(1)表格行执行remove和insert之后,需要重新初始化右键菜单功能,否则,右键一次之后,就不再起作用。

(2)如果菜单功能项比较多,需要使用分割线来分组。只需要加<li class="divider"></li>就能搞定。

    <div id="context-menu2">
          <ul class="dropdown-menu" role="menu">
              <li><a tabindex="-1">Action</a></li>
              <li><a tabindex="-1">Another action</a></li>
              <li><a tabindex="-1">Something else here</a></li>
              <li class="divider"></li>
              <li><a tabindex="-1">Separated link</a></li>
          </ul>
        </div>

(3)如果想要实现鼠标移动到菜单上面显示蓝色背景,则需要引用另一个css文件即可。

<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">

效果如下:

技术分享

四、总结

以上就是bootstrap-ContextMenu组件的一些简单用法。可能不够完美,但是对于一般的右键菜单需求能很好的解决。

 

以上是关于JS组件系列——Bootstrap右键菜单解决方案:ContextMenu的主要内容,如果未能解决你的问题,请参考以下文章

JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有)

JS组件系列——Bootstrap Select2组件使用小结

JS组件系列——表格组件神器:bootstrap table

JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案

bootstrap treeview 和Table 击右键弹出菜单

JS组件系列——两种bootstrap multiselect组件大比拼