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浏览器兼容性问题解决方案