JQuery Droppable перетаскивают удалить DnD более одного - PullRequest
0 голосов
/ 28 января 2012

Ранее я публиковал проблему с DnD, которая теперь решена, но во время тестирования я обнаружил, что в другом коде произошла ошибка: действие «удалить».
Я уверен, что это абсолютно логично, и яотсутствует логическое объяснение этому, но я не могу найти ни ответов в интернете (пока), ни в книгах, где DnD почти не затрагивается.

Проблема в том, что, когда цель сбрасывается с цельюболее одного (> 1) сбрасывания, это приведет к возврату ВСЕХ ранее отброшенных при УДАЛЕНИИ над ним.

Смотрите сами: http://jsfiddle.net/BCnyU/

Следуйтеэти шаги:

1) «перетащите 2» на «падение 3»
2) «перетащите 1» на «падение 4»
3) «перетащите 4» на «падение 5»"
Ничего особенного, просто чтобы убрать их с дороги.
Теперь сделайте это:
4)" перетащите 3 "на" drop 1 "
5) нажмите" отменить "из" перетаскивания "3 "
6)" перетащите 5 "на" падение 1 "
7)" перетащите 3 "на" падение 2 "

Что произошло, у нас было ДВА(2) сбросить события на «падение 1».
Когда вы щелкаете сейчас по «отмене» из «перетаскивания 5», вы можете ожидать, что только «перетаскивание 5» вернется.появиться !!!

Кто может мне это объяснить, а также дать решение?

1 Ответ

0 голосов
/ 28 января 2012

Каждый раз, когда элемент перетаскивается в область перетаскивания, вы присоединяете обработчик щелчка к этой области перетаскивания. Эти обработчики кликов никогда не удаляются, поэтому они остаются в области в дополнение к добавляемому новому. Чем больше вы добавляете и удаляете элементы, тем больше обработчиков кликов связываются.

Самый простой способ исправить это без изменения кода - это изменить click на one. one позволяет подключить обработчик, который будет выполняться только один раз.

http://jsfiddle.net/BCnyU/101/

      .one("click",function(){
        $(ui.draggable).show();
        $(this).css("color","black");
        $(this).text(oldvalue);
        $(this).droppable({disabled:false});
        $(this).removeClass('OK NOK');
        var numItems = $('.OK').length;
        $('.counter').html('Correct: '+numItems +'/5'); 
      });

Другой вариант - добавить обработчик кликов к тегу привязки UNDO, а не ко всей области перетаскивания. Затем, когда якорь UNDO будет удален, обработчик также будет удален.

...