jQuery拖放使用直播活动

dev*_*ett 41 jquery drag-and-drop jquery-ui draggable livequery

我有一个应用程序,其中包含经常更改的长列表,我需要该列表中的项目可拖动.

我一直在使用jQuery UI draggable插件,但添加到400多个列表项很慢,每次添加新列表项时都必须重新添加.

有没有人知道一个类似于使用jQuery 1.3 .live()事件的jQuery UI draggable插件的插件?这将解决这两个问题.

stl*_*oug 44

Wojtek的解决方案非常适合我.我把它改成了一点点让它扩展jQuery ......

(function ($) {
   $.fn.liveDraggable = function (opts) {
      this.live("mouseover", function() {
         if (!$(this).data("init")) {
            $(this).data("init", true).draggable(opts);
         }
      });
      return this;
   };
}(jQuery));
Run Code Online (Sandbox Code Playgroud)

现在而不是像下面那样调用它:

$(selector).draggable({opts});
Run Code Online (Sandbox Code Playgroud)

......只是使用:

$(selector).liveDraggable({opts})
Run Code Online (Sandbox Code Playgroud)

  • 现在你应该使用`this.on('mouseover',selector,...)`而不是`this.live('mouseover',...)` (3认同)
  • 比在元素中存储数据更好,为什么不依赖于.ui-draggable CSS类的存在呢?我认为这更轻 (2认同)

Jas*_*med 21

这是一个完美适合我的代码示例

$('.gadgets-column').live('mouseover',function(){
    $(this).draggable();
});
Run Code Online (Sandbox Code Playgroud)

  • 这是一个简单的解决方案,但是每次使用gadgets-column class*在所有DOM元素上执行draggable*你将其中一个悬停... (3认同)
  • @Morg:我同意你所说的一切,你只是不明白我的意思.每次你悬停一个具有类"gadgets-column"的元素时,代码都会执行.代码是`$(this).draggable();`这并不是你每次悬停时都想要执行的. (2认同)

woj*_*ekk 10

你可以像这样制作包装函数:

function liveDraggable(selector, options){
  jQuery(selector).live("mouseover",function(){
    if (!jQuery(this).data("init")) {
      jQuery(this).data("init", true);
      jQuery(this).draggable(options);
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

(我使用jQuery原型 - 这就是为什么我放置jQuery()而不是$())

而现在使用liveDraggable(selector,{opts})代替$(selector).draggable({opts})


小智 7

Stldoug的代码对我有用,但是没有必要在每个mouseover事件上继续检查元素的.data("init").此外,最好使用"mousemove",因为当.live功能启动时,如果鼠标已经在元素上,则"鼠标悬停"并不总是被触发.

(function ($) {
    $.fn.liveDraggable = function (opts) {
        this.live("mousemove", function() {
            $(this).draggable(opts);
        });
    };
}(jQuery));
Run Code Online (Sandbox Code Playgroud)

以下是您使用它的方式:

$('.thing:not(.ui-draggable)').liveDraggable();
Run Code Online (Sandbox Code Playgroud)

诀窍是在选择器中添加":not(.ui-draggable)".由于jQuery会在你的元素变为可拖动时自动添加"ui-draggable"类,因此.live函数将不再以它为目标.换句话说,它只触发一次,不像其他解决方案,当你移动东西时,它会反复触发.

理想情况下,你可以只是.unbind"mousemove",但遗憾的是,这不适用于.live.

  • 是的,绝对更干净.你怎么看待在插件函数中移动"ui-draggable"的检查......就像"if(!this.hasClass('ui-draggable')){...}"之类的? (2认同)