23

我想在 jQuery UI 可选表中启用多选功能,方法是按住shift.

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(...)
4

3 回答 3

29

你可以在没有这样的插件的情况下做到这一点:

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/

于 2013-01-22T22:39:39.360 回答
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' - 将添加到选定元素的类
  • filter: - ' > *' - 我们要选择什么元素
  • unselectOn - false|'selector' - 如果已设置,则如果单击设置,则选择器将被删除
  • start: false|function - 开始时回调
  • stop: false|function - 停止时回调
  • 取消选择:false|function - 单击设置“unselectOn”选项时的回调

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

于 2012-02-21T09:30:30.457 回答
5

环顾四周后,我在仍然使用 jQuery UI 的 Selectable 功能时无法找到解决此问题的方法,所以我写了一个。本质上,它利用 Selectable 的选定/未选定回调来管理 DOM 状态,同时仍然按照标准 Selectable API 尊重回调。它支持以下用例:

  • 单击列表中任意位置的元素之一(shift+click、cntl+click 或 click+drag)
  • Shift+单击列表中的另一个元素
  • 加上两个端点之间的所有元素都被选中

表的用法:

$('table').shiftSelectable({filter: 'tr'});

一些笔记。(1) 目前只支持兄弟元素。(2) 它将通过配置选项,如您将在表示例中看到的那样,以及 Selectable 方法。(3) 我喜欢 underscore.js,所以它被使用,即使它不是必需的。如果您不想使用这个很棒的库,请随意更换它的简单检查和扩展。不,我与 underscore.js 没有任何关系。:)

表小提琴示例

列出小提琴示例

希望这对其他人有帮助!干杯。

于 2012-09-19T01:23:41.697 回答