gpt4 book ai didi

javascript - 具有多个作用域的 JQuery UI 可拖放?

转载 作者:数据小太阳 更新时间:2023-10-29 04:12:59 28 4
gpt4 key购买 nike

我想要几类 draggables,每类对应一类 droppables。但除此之外,我还想有一个单独的“垃圾箱”,所有的可拖拽物都可以被丢弃,直到找到合适的可拖放物为止。

现在,这可以通过接受函数轻松实现。但是,我可能有多达 20 个类,每个类有 30-40 个可拖动/可放置的对象。因此,如果我为此使用“接受”功能,当我拿起一个可拖动对象时,我的 chrome 会卡住,因为它会为屏幕上的每个可放置对象运行测试:(

如果我使用“scope”属性就可以解决这个问题,因为它似乎使用了一些不同的方式。但是,当我使用范围时,我似乎无法实现“垃圾桶”的概念,因为它只能有一个范围!

有什么方法可以绕过这个问题吗?给 draggable 多个作用域,还是给垃圾桶多个作用域?或者我想不到的其他解决方案?

最佳答案

每当您开始拖动 draggable 时,jQuery UI 将在内部运行以下代码以确定哪些 droppable 有资格接收 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 小部件,这将使您快速跳出上面的代码块。您可以通过在 draggable 上使用 start 事件来执行此操作,该事件将首先触发。

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

这实质上让您自己实现accept/scope 逻辑,性能影响取决于您的算法。不过实现起来应该不会那么糟糕。插件这么慢的原因是因为它们必须处理很多不同的情况。

jQuery UI 不支持向单个 draggable/droppable 元素添加多个作用域,但您可以自己滚动该功能。

我在这里举了一个例子来说明这一点 - http://jsfiddle.net/tj_vantoll/TgQTP/1/ .

关于javascript - 具有多个作用域的 JQuery UI 可拖放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11066497/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com