今天项目里又应用到了jqgrid这个插件,实现应用shitf键多选值。
jqgrid功能的强大是有目共睹,但是当我使用api中的
multiselect: true, multikey:'shiftKey'
时并没有如我所想象的那样实现多选功能,而只是单纯的点击项的多选。
于是在网上查找一番,终于找到牛人实现的一个简单方法(但是代码复杂),不需要改动源代码等,只需要添加beforeSelectRow的方法,代码如下:
beforeSelectRow:function multiSelectHandler(sid, e) { var grid = $(e.target).closest("table.ui-jqgrid-btable"); var ts = grid[0], td = e.target; var scb = $(td).hasClass("cbox"); if ((td.tagName == 'INPUT' && !scb) || td.tagName == 'A') { return true; } var sel = grid.getGridParam('selarrrow'); var selected = $.inArray(sid, sel) >= 0; if (e.ctrlKey || (scb && (selected || !e.shiftKey))) { grid.setSelection(sid,true); } else { if (e.shiftKey) { var six = grid.getInd(sid); var min = six, max = six; $.each(sel, function() { var ix = grid.getInd(this); if (ix < min) min = ix; if (ix > max) max = ix; }); while (min <= max) { var row = ts.rows[min++]; var rid = row.id; if (rid != sid && $.inArray(rid, sel)<0) { grid.setSelection(row.id, false); } } } else if (!selected) { grid.resetSelection(); } if (!selected) { grid.setSelection(sid,true); } else { var osr = grid.getGridParam('onSelectRow'); if ($.isFunction(osr)) { osr(sid, true); } } } }
说实话,限于本人功力不够,只能照搬牛人的代码了,结果确实实现了我所想要做到的功能。先点选第2行,再按住shift键,点选第6行,则选中了从第2行到第6行的所有行。
以下是完整的测试代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>jqgrid test</title> <link href='css/jquery-ui-1.8.21.custom.css' rel='stylesheet'> <!-- jqGrid --> <link rel="stylesheet" type="text/css" media="screen" href="jqueryGrid/src/css/ui.jqgrid.css" /> <link rel="stylesheet" type="text/css" media="screen" href="jqueryGrid/src/css/ui.multiselect.css" /> </head> <body> <table id="entrysTable"></table> <!-- jQuery --> <script src="js/jquery-1.7.2.min.js"></script> <!-- jQuery UI --> <script src="js/jquery-ui-1.8.21.custom.min.js"></script> <!-- jqGrid js --> <script src="jqueryGrid/src/i18n/grid.locale-cn.js" type="text/javascript"></script> <script src="jqueryGrid/js/jquery.jqGrid.min.js" type="text/javascript"></script> <script type="text/javascript"> jQuery("#entrysTable").jqGrid({ datatype : "local", height : 200, colNames : [ '序号', '词条', '用户', '状态' ], colModel : [ { name : 'id', index : 'id', width : 60, sorttype : "int" }, { name : 'word', index : 'word', width : 90 }, { name : 'checkUser', index : 'checkUser', width : 90 }, { name : 'status', index : 'status', width : 90 } ], multiselect : true, multikey : 'shiftKey', caption : "Manipulating Array Data", beforeSelectRow : function multiSelectHandler(sid, e) { var grid = $(e.target).closest("table.ui-jqgrid-btable"); var ts = grid[0], td = e.target; var scb = $(td).hasClass("cbox"); if ((td.tagName == 'INPUT' && !scb) || td.tagName == 'A') { return true; } var sel = grid.getGridParam('selarrrow'); var selected = $.inArray(sid, sel) >= 0; if (e.ctrlKey || (scb && (selected || !e.shiftKey))) { grid.setSelection(sid, true); } else { if (e.shiftKey) { var six = grid.getInd(sid); var min = six, max = six; $.each(sel, function() { var ix = grid.getInd(this); if (ix < min) min = ix; if (ix > max) max = ix; }); while (min <= max) { var row = ts.rows[min++]; var rid = row.id; if (rid != sid && $.inArray(rid, sel) < 0) { grid.setSelection(row.id, false); } } } else if (!selected) { grid.resetSelection(); } if (!selected) { grid.setSelection(sid, true); } else { var osr = grid.getGridParam('onSelectRow'); if ($.isFunction(osr)) { osr(sid, true); } } } } }); var mydata = [ { id : "1", word : "bick", checkUser : "S", status : "stop" }, { id : "2", word : "bike", checkUser : "C", status : "start" }, { id : "3", word : "bird", checkUser : "B", status : "running" }, { id : "4", word : "cake", checkUser : "D", status : "stop" }, { id : "5", word : "cat", checkUser : "O", status : "stop" }, { id : "6", word : "catch", checkUser : "P", status : "start" }, { id : "7", word : "desk", checkUser : "W", status : "running" }, { id : "8", word : "dict", checkUser : "B", status : "running" }, { id : "9", word : "task", checkUser : "A", status : "start" }, { id : "10", word : "tick", checkUser : "F", status : "running" }, { id : "11", word : "user", checkUser : "H", status : "stop" } ]; for ( var i = 0; i <= mydata.length; i++) jQuery("#entrysTable").jqGrid('addRowData', i + 1, mydata[i]); </script> </body> </html>
如果有需要,可以试试哦!