我有一个长列表的应用程序,其内容经常变化,我需要该列表中的项目具有可拖动功能。
我一直在使用jQuery UI draggable插件,但是将其添加到400多个列表项速度较慢,并且每次添加新的列表项时都必须重新添加。
是否有人知道类似于jQuery UI拖放插件的插件,它使用jQuery 1.3的.live()事件?这将解决这两个问题。
我有一个长列表的应用程序,其内容经常变化,我需要该列表中的项目具有可拖动功能。
我一直在使用jQuery UI draggable插件,但是将其添加到400多个列表项速度较慢,并且每次添加新的列表项时都必须重新添加。
是否有人知道类似于jQuery UI拖放插件的插件,它使用jQuery 1.3的.live()事件?这将解决这两个问题。
Wojtek的解决方案对我完美地起作用了,我稍微改动了一下,使其扩展了jQuery...
(function ($) {
$.fn.liveDraggable = function (opts) {
this.live("mouseover", function() {
if (!$(this).data("init")) {
$(this).data("init", true).draggable(opts);
}
});
return this;
};
}(jQuery));
现在不再像这样调用:
$(selector).draggable({opts});
只需使用:
$(selector).liveDraggable({opts})
this.on('mouseover', selector, ...)
替代 this.live('mouseover', ...)
。 - Dehalion这是我完美运行的代码示例
$('.gadgets-column').live('mouseover',function(){
$(this).draggable();
});
gadgets-column
的元素上时,代码将执行。代码是$(this).draggable();
,这不是你想要每次悬停时都执行的内容。 - Michal B.
function liveDraggable(selector, options){
jQuery(selector).live("mouseover",function(){
if (!jQuery(this).data("init")) {
jQuery(this).data("init", true);
jQuery(this).draggable(options);
}
});
}
(我在使用Prototype和jQuery - 这就是为什么我把jQuery()放在$()的位置)
现在,不要使用$(selector).draggable({opts}),而是使用liveDraggable(selector, {opts})。
Stldoug 的代码对我很有效,但是没有必要在每次 mouseover 事件中检查元素的 .data("init")。同时,最好使用 "mousemove",因为如果你的鼠标已经悬停在元素上时 .live 函数启动时,"mouseover" 并不总是会触发。
(function ($) {
$.fn.liveDraggable = function (opts) {
this.live("mousemove", function() {
$(this).draggable(opts);
});
};
}(jQuery));
这里是使用方法:
$('.thing:not(.ui-draggable)').liveDraggable();
将@john和@jasimmk的最佳答案结合起来:
使用.live
:
$('li:not(.ui-draggable)').live('mouseover',function(){
$(this).draggable(); // Only called once per li
});
.live
已经被弃用,更好的选择是使用.on
:
$('ul').on('mouseover', 'li:not(.ui-draggable)', function(){
$(this).draggable(); // Only called once per li
});
正如 @john 所解释的那样,.ui-draggable
自动添加到可拖动方法中,因此通过使用选择器排除该类,您可以确保在每个元素上只调用一次 draggable()。而使用 .on
可以缩小选择器的范围,提高性能。
<div id="diyalogKutusu">
<div id="diyalog-baslik">..baslik..</div>
<div id="icerik">..icerik..</div>
</div>
$(document).on("mouseover", "#diyalogKutusu", function() {
$(this).draggable({ handle: '#diyalog-baslik' });
});
English:
<div id="dialogBox">
<div id="dialogBox-title">..title..</div>
<div id="content">..content..</div>
</div>
$(document).on("mouseover", "#dialogBox", function() {
$(this).draggable({ handle: '#dialogBox-title' });
});
on()
代替live()
或delegate
。 on()
比其他方法具有更好的性能。$("html divs to drag").appendTo("#layoutDiv").draggable(options);
的英译中,保留了HTML格式,不做解释。另一种选择是将mouseover处理程序与可移除类混合使用,如下所示:
$('.outer-container').on('mouseover', '.my-draggable.drag-unbound', function(e) {
$(this).draggable().removeClass('drag-unbound');
});
这很简单,解决了其他答案在鼠标悬停时反复重新绑定的一些问题。
一个已更新的版本,不再使用已被弃用的 live:
function liveDraggable(selector, options) {
$(document).on('mouseover', selector, function () {
if (!$(this).data("init")) {
$(this).data("init", true);
$(this).draggable(options);
}
});
}
if (!jQuery(this).data("init")) { jQuery(this).data("init", true);}
的作用是什么? - user593838