Javascript jquerydraggable—如果对一个元素应用两次,会发生什么?

Javascript jquerydraggable—如果对一个元素应用两次,会发生什么?,javascript,jquery,jquery-ui-draggable,Javascript,Jquery,Jquery Ui Draggable,直到最近,我才建立了这个系统,它被多次称为: $('.rsh') .draggable('destroy') .draggable({ blah blah details }); destroy用于阻止类上累积的多个可拖动处理程序。AJAX正在创建新元素,类的draggable的初始附件不会涉及随后创建的元素 但是,当我更

直到最近,我才建立了这个系统,它被多次称为:

                $('.rsh')
                    .draggable('destroy')                               
                    .draggable({ blah blah details });
destroy
用于阻止类上累积的多个可拖动处理程序。AJAX正在创建新元素,类的
draggable
的初始附件不会涉及随后创建的元素

但是,当我更新到jQuery UI的1.9.2版时,它开始出现以下错误:

错误:无法在初始化之前对draggable调用方法;试图调用方法“destroy”

所以我去掉了破坏线,很甜蜜。除了我怀疑我现在可能正在向类添加越来越多的处理程序(这就是为什么
destroy
一开始就存在的原因)

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

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

两个问题:(1)每次我启动draggable设置行时,是否会有越来越多的处理程序附加到类中?(2) 如果是这样,有什么解决方案可以移除它们吗

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

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

如您所见,尝试在同一元素上初始化新的可拖动实例后,不会更改附加的handlers对象


编辑:带有参数的后续调用不会被忽略,相反,它们将扩展现有的小部件,如@Jason Sperske的回答所示。

.draggable()
的后续调用在附加到同一对象时扩展以前的调用(而不是像我最初认为的那样替换它们)。看这个例子(从法布里西奥·马特的扩展而来)()


哦,很好,我忘了考虑当前部件的扩展。1.作为补充。
$('div').draggable();
console.log( $._data($('div')[0], 'events') );
$('div').draggable();
console.log( $._data($('div')[0], 'events') );
<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>
drag 1 <- on start
drag 2 <- on stop