如何刷新 jquery (ui) 中元素的事件

how to refresh events on element in jquery (ui)

有没有办法 "refresh" 应该应用于具有 jquery 的元素的事件?

为了更好地解释这里是我的案例。 我有一个 document.ready() 函数,可以在两个列表上完成它的工作:

列表 A 包含 class a 的元素,列表 B 包含 class b.

的元素

我想让用户使用 draggable/droppable 元素从列表 A 移动到列表 B,但是它使用 .clone(true,true) 克隆元素到列表 B 和 classes 被替换为 .removeClass("a").addClass("b")。另一种方式 - 将 B 中的元素拖到列表 A 时从 B 中删除

上面解释的场景仅适用于页面加载时列表中任一列表中的元素,但是当我将对象从 A 克隆到 B 时,它仍然可以拖动,但它的行为与元素 A 一样,到在某种程度上,当尝试拖动它时,拖动阴影从列表 A 中的原始位置开始,而不是我在列表中实际开始拖动的位置。 考虑到这一点,我需要找到一种方法 "refresh" 列表 B 中新克隆的元素表现得像列表 B 元素。

感谢您的支持。

A 从你的问题可以看出,你需要关闭某些元素的事件。为此,您可以使用 off() method

例如,请看下面的代码:

HTML

List A
<ul>
  <li class="draggable">item1</li>
  <li class="draggable">item2</li>
</ul>

List B
<ul class="droppable">

</ul>

JS

$('.draggable').draggable({
  helper: 'clone'
}).click(function() {
  alert($(this).text());
});


$('.droppable').droppable({
  drop: function(ev, ui) {
    // Add element with all events
    var dropElement = ui.draggable.clone(true, true);
    $(this).append(dropElement);

    // Add element without any events
    var dropElementWithoutEvents = ui.draggable.clone(true, true).off();       
    $(this).append(dropElementWithoutEvents);
  }
});

ui.draggable.clone(true, true).off() 删除您拖动的元素的所有事件并且 click 事件不会通过单击它来触发,但对于 dropElement,它会被触发。

Online demo (jsFiddle)

我已经通过另一个 draggable() 调用 运行 克隆的元素设法解决了这个问题。

在初始化时我有:

$( ".a" ).draggable({ 
    //...settings
});

$( ".b" ).draggable({ 
    //...settings
});

然后在完成所有操作后在 droppable 中,我将再次为 B 调用相同的 draggable:

 $("#B").droppable({
     accept: ".a",
     //...settings
     drop: function(event, ui) {
         var clone = $(ui.draggable).clone()
         clone.removeClass("a");
         clone.addClass("b");
         $("#B").append(clone);
         $(clone).draggable({ 
             //...sameSettings
         });
     }
 });

现在克隆的元素作为原生 B 元素使用,一切正常。