JavaScript:如何解决这种竞争条件

时间:2010-12-16 09:23:42

标签: javascript jquery jquery-ui race-condition

我有一个允许对ul li进行排序的用户界面。为此,我使用jQuery-UI的sortable。但是,默认情况下禁用排序,仅在单击按钮时激活。同时,我在每个li上都有一个click事件,它显示li在排序屏幕上表示的段落的预览。这很好,除非我正在积极排序,也会触发点击事件。

发生的事情是,每次我对li进行排序时,我都会自动看到预览,我不想发生这种情况。我已采取以下措施来阻止它:仅当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');
   }
});

测试这个新的解决方案,我看到我创建了一个竞争条件(因为两者都在一个密钥上做出反应)。现在,我可以通过向jQuery(ui.item).removeClass('no_preview')添加一个计时器来解决这个问题,但我认为这个解决方案更像是一个黑客攻击。是否有正确的方法(或至少更好的方法)来解决这个问题?

编辑1

我已更新代码以显示我使用多个互连的列表。到目前为止,我认为这与问题无关。

1 个答案:

答案 0 :(得分:1)

似乎修复了有关连接列表的错误。在sortable下查看1.8.7的发行说明:jqueryui.com/docs/Changelog/1.8.7

如果你坚持使用1.8.6或更低版本,你可能会通过在stop事件处理程序中添加event.preventImmediatePropagation()来解决它。不确定,虽然我没有测试它,但它应该在理论上工作。