疑似JavaScript点击事件并发问题

时间:2011-05-03 14:11:14

标签: javascript jquery opera

我正在使用这段jQuery向复选框添加单选按钮行为,即只允许检查每个组中的一个。

$("input:checkbox").click(function()
{
    $("input:checkbox:checked[name='" + this.name + "']")
        .not(this).removeAttr("checked");
});

它很好用,或者至少我这么认为,直到我发现在Opera中我仍然可以检查来自同一组的多个复选框,如果我坚持的话。通过快速切换一些复选框(点击像疯子)我最终得到两个(或更多)检查。

通常将JavaScript视为单线程我对此感到有些惊讶。但是,我知道JavaScript并不像看起来那样单线程(参见this answer),我认为这会导致这种行为。怎么会发生呢?

如果我的假设是正确的,任何人都可以解释会发生什么吗?在我给你链接的答案中可以阅读:

  

同样地,在提供它的元素上调用click()会立即在所有浏览器中调用onclick处理程序(至少这是一致的!)。

这似乎是相关的,除了这只发生在Opera(我尝试过使用IE(8),FF,Chrome和Safari)。

非常感谢任何输入!

1 个答案:

答案 0 :(得分:1)

如果你真的很快点击这里, http://jsfiddle.net/RxbW6/1/

您会看到,当同时检查2个复选框时(通过发送垃圾邮件),第二个复选框不会触发click事件。因此,2点击事件干扰不是线程问题,而Opera似乎根本没有触发onclick事件。

我建议只使用一个广播组来设置风格,这种情况就是这里的。

然而,

$("input:checkbox").mouseup(function()
{
    $("input:checkbox:checked[name='" + this.name + "']")
        .not(this).removeAttr("checked");
});

将解决您的问题。 [编辑] mouseup可能会更好,所以你可以mousedown然后离开并保持之前的检查。