JavaScript: как решить это условие гонки - PullRequest
0 голосов
/ 16 декабря 2010

У меня есть пользовательский интерфейс, который позволяет сортировать ul из li.Для этого я использую jQuery-интерфейс sortable.Однако сортировка по умолчанию отключена и активируется только по нажатию кнопки.В то же время у меня есть событие click для каждого li, которое отображает предварительный просмотр абзаца, который li представляет на экране сортировки.Это работает нормально, за исключением того, что если я активно сортирую, событие click также запускается.

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

jQuery('ul.wiki_ul_layout_coloumns>li:not(.no_preview)').live('click', function() {
   //show preview
})

jQuery('ul.wiki_ul_layout_coloumns').sortable({
   connectWith: 'ul.wiki_ul_layout_coloumns',
   start: function(event, ui) {
      jQuery(ui.item).addClass('no_preview');
   },
   stop: function(event, ui) {
      jQuery(ui.item).removeClass('no_preview');
   }
});

Тестируя это новое решение, я увидел, что создал условие гонки (поскольку оба реагируют на keyup).Теперь я могу решить эту проблему, добавив таймер к jQuery(ui.item).removeClass('no_preview'), но я считаю, что это решение скорее для взлома.Есть ли правильный способ (или, по крайней мере, более хороший) для решения этой проблемы?

РЕДАКТИРОВАТЬ 1

Я обновил код, чтобы показать, что я использую несколько списков, которые связаны между собой.До сих пор я думал, что это не имеет отношения к проблеме.

1 Ответ

1 голос
/ 16 декабря 2010

Похоже, ошибка была исправлена ​​в связанных списках. Посмотрите примечания к выпуску для 1.8.7 под сортируемым: jqueryui.com/docs/Changelog/1.8.7

Если бы вы застряли с 1.8.6 или меньше, вы, вероятно, могли бы взломать его, добавив event.preventImmediatePropagation () в обработчик событий остановки. Не уверен, хотя, поскольку я не проверял это, но это должно работать в теории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...