我想通过按住 shift 在jQuery UI可选表中启用多选功能。
如果在鼠标点击下按住 shift ,我可能应该这样做
但是我找不到如何以干净的方式做到这一点......
目前我在可选择的配置中得到了这个:
start: function(e)
{
var oTarget = jQuery(e.target);
if(!oTarget.is('tr')) oTarget = oTarget.parents('tr');
}
所以oTarget
是点击的元素(而e.currentTarget
是整个表格),但现在是什么?我怎样才能找到哪些元素已经被选中,可以告诉我点击的元素是否超过所选元素并选择其中的所有元素?
我现在已经解决了这个问题,添加到了可选元素中:
jQuery(table).mousedown(function(e)
{
//Enable multiselect with shift key
if(e.shiftKey)
{
var oTarget = jQuery(e.target);
if(!oTarget.is('.ui-selectee')) oTarget = oTarget.parents('.ui-selectee');
var iNew = jQuery(e.currentTarget).find('.ui-selectee').index(oTarget);
var iCurrent = jQuery(e.currentTarget).find('.ui-selectee').index(jQuery(e.currentTarget).find('.ui-selected'));
if (iCurrent < iNew) {
iHold = iNew;
iNew = iCurrent;
iCurrent = iHold;
}
if(iNew != '-1')
{
jQuery(e.currentTarget).find('.ui-selected').removeClass('ui-selected');
for (i=iNew;i<=iCurrent;i++) {
jQuery(e.currentTarget).find('.ui-selectee').eq(i).addClass('ui-selected');
}
e.stopImmediatePropagation();
e.stopPropagation();
e.preventDefault();
return false;
}
}
}).selectable(...)
答案 0 :(得分:27)
你可以在没有这样的插件的情况下做到这一点:
var prev = -1; // here we will store index of previous selection
$('tbody').selectable({
selecting: function(e, ui) { // on select
var curr = $(ui.selecting.tagName, e.target).index(ui.selecting); // get selecting item index
if(e.shiftKey && prev > -1) { // if shift key was pressed and there is previous - select them all
$(ui.selecting.tagName, e.target).slice(Math.min(prev, curr), 1 + Math.max(prev, curr)).addClass('ui-selected');
prev = -1; // and reset prev
} else {
prev = curr; // othervise just save prev
}
}
});
答案 1 :(得分:13)
我为该功能编写了简单的插件。它不依赖于jQuery ui Selectable插件,据我所知它可以正常工作。
您可以在此处找到插件代码和简单示例:http://jsfiddle.net/bMgpc/170/
在下面写下简单的描述。
基本用法:
$('ul').multiSelect();
如果按住“Ctrl”或“Command Key”,则可以逐个选择/取消选择元素。
ul - 包含要选择的内部元素的父级。
有多种选择:
这是一个开发版本的插件,所以要小心使用