在jQuery UI Selectable中启用Shift-Multiselect

时间:2012-02-21 09:07:13

标签: javascript jquery jquery-ui multi-select jquery-ui-selectable

我想通过按住 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(...)

2 个答案:

答案 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
        }
    }
});

这是现场演示:http://jsfiddle.net/mac2000/DJFaL/1/embedded/result/

答案 1 :(得分:13)

我为该功能编写了简单的插件。它不依赖于jQuery ui Selectable插件,据我所知它可以正常工作。

您可以在此处找到插件代码和简单示例:http://jsfiddle.net/bMgpc/170/

在下面写下简单的描述。

基本用法:

$('ul').multiSelect();

如果按住“Ctrl”或“Command Key”,则可以逐个选择/取消选择元素。

ul - 包含要选择的内部元素的父级。

有多种选择:

  • keepSelection - true | false - 非常重要的标志。如果设置为true(默认值),那么如果单击已选择的元素(因为它适用于多个道具),则不会清除选择。
  • multiselect - true | false - 如果为false,则只能选择一个元素
  • selected - 'selected' - 将添加到所选元素的类
  • 过滤器: - '&gt; *' - 我们将选择哪些元素
  • unselectOn - false |'selector' - 如果设置则单击set selector selectio将被删除
  • start:false | function - 启动时回调
  • 停止:false |功能 - 停止回调
  • 取消选择:false | function - 单击set“unselectOn”选项时的回调

这是一个开发版本的插件,所以要小心使用