4

直到最近我才进行了这个设置,它被多次调用:

                $('.rsh')
                    .draggable('destroy')                               
                    .draggable({ blah blah details });

destroy那里是为了阻止多个可拖动的处理程序在类上累积。AJAX 正在创建新元素,并且draggable对类的初始附加不会触及随后创建的元素。

但是,当我更新到 jQuery UI 的 1.9.2 版时,它开始给我这个错误:

错误:在初始化之前无法调用可拖动的方法;试图调用方法“销毁”

所以我删除了破坏线,它很甜蜜。除了......我怀疑我现在可能会在类中添加越来越多的处理程序(这就是为什么destroy首先存在的原因)。

我试过这个,但它不喜欢它:

if ($('.rsh').length) {
    $('.rsh').draggable('destroy'); 
}

两个问题:(1)每次我触发可拖动设置线时,是否会有越来越多的处理程序附加到类?(2)如果是这样,任何关于如何删除它们的解决方案?

4

2 回答 2

7

不,不会绑定额外的处理程序。jQuery 将初始化的实例注册到元素,并且不会为同一个元素创建同一个小部件的新实例。

由于您担心处理程序,这里有一个快速检查(jQuery 1.8+ 和 UI 1.9+):

$('div').draggable();
console.log( $._data($('div')[0], 'events') );
$('div').draggable();
console.log( $._data($('div')[0], 'events') );

小提琴

如您所见,在尝试在同一元素上初始化新的可拖动实例后,附加的处理程序对象不会改变。

编辑:尽管不会忽略带有参数的后续调用,而是它们将扩展现有小部件,如@Jason Sperske 的答案所示。

于 2013-01-09T23:41:15.140 回答
5

附加到同一个对象时的后续调用以.draggable()扩展先前的调用(而不是像我最初想象的那样替换它们)。请参阅此示例(从 Fabrício Matté 的扩展)(演示

<div>foo</div>
<script>
 $('div').draggable({
  start: function () {
    console.log("drag 1");
  }
 });
 console.log($._data($('div')[0], 'events'));
 $('div').draggable({
  stop: function () {
    console.log("drag 2");
  }
 });
 console.log($._data($('div')[0], 'events'));
</script>

console.log您只看到以下消息:

drag 1 <- on start
drag 2 <- on stop
于 2013-01-09T23:55:50.390 回答