JQuery的UI拖/投掷的多个领域?(JQuery UI Drag/Droppable with

2019-07-29 23:51发布

我想有几类拖拽元素,每一个都对应一个类droppables的。 但除此之外,我想有一个单独的“垃圾桶”,所有的拖拽元素可以被丢弃,直到合适的可投放能为他们找到。

现在,这可以很容易地与接收功能的实现。 然而,我可以具有多达20个类,每一个与30-40拖拽元素/ droppables。 所以,如果我使用“接受”功能,对于这一点,那一刻我拿起一个可拖动的,我的铬冻结,因为它运行的每一个可投放在屏幕上的测试:(

这可如果我使用“范围”属性来解决,因为它似乎是使用一些不同的方式。 然而,当我使用范围,我似乎无法实施“废物箱”的概念,因为它只能有一个范围!

有没有一些方法来绕过这个问题? 给拖拽元素不止一个范围,或给予垃圾桶诸多范畴? 或者一些其他的解决方案,我想不出?

Answer 1:

内部jQuery UI的运行每次启动拖动下面的代码draggable ,以确定哪些droppable s为资格获得draggable

var m = $.ui.ddmanager.droppables[t.options.scope] || [];
var type = event ? event.type : null; // workaround for #2317
var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();

droppablesLoop: for (var i = 0; i < m.length; i++) {

    if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;   //No disabled and non-accepted
    for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
    m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue;                                   //If the element is not visible, continue

    if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables

    m[i].offset = m[i].element.offset();
    m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };

}

正如你所看到的代码是不平凡的,并会解释为什么你每次启动拖动时看到性能下降。

有一点需要注意的是,在检查的第一件事droppablesLoop是是否droppable被禁用。

因此,为了提高性能,你总是可以手动禁用相应的droppable小部件,这将让你迅速跳出上面的代码块。 您可以通过使用做到这一点start对事件draggable ,这将首先开火。

$('.draggable').draggable({
    start: function() {
        $('.invalid-droppable-elements').droppable('option', 'disabled', true);
    },
    stop: function() {
        $('.invalid-droppable-elements').droppable('option', 'disabled', false);
    }
});

这实质上是让你实现accept / scope逻辑自己和对性能的影响到你的算法。 它不应该是不好的,虽然实现。 究其原因,插件是因为他们是慢,是因为他们有来处理不同的情况很多。

jQuery用户界面不支持添加多个范围个人draggable / droppable的元素,但你可以滚你自己该功能。

我把一个例子一起在这里展示这一点- http://jsfiddle.net/tj_vantoll/TgQTP/1/ 。



文章来源: JQuery UI Drag/Droppable with multiple scopes?