Подозреваемая проблема параллелизма события щелчка JavaScript - PullRequest
1 голос
/ 03 мая 2011

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

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

Это прекрасно работает, или, по крайней мере, я так думал, пока не обнаружил, что в Opera я все еще могу установить несколько флажков из одной группы, если я настаиваю. Быстро переключаясь между некоторыми флажками (щелкая как маньяк), я в конечном итоге получаю два (или более) проверенных.

Обычно считая JavaScript однопоточным, я был удивлен этим. Тем не менее, я знаю, что JavaScript не всегда однопоточный, как кажется (см. этот ответ ), и я предполагаю, что это как-то вызывает такое поведение. Как иначе может случиться?

Если мое предположение верно, может ли кто-нибудь объяснить, что происходит? В ответе, который я на вас ссылаюсь, можно прочитать:

Аналогичным образом, вызывая click () для элемента, который его предоставляет, немедленно вызывает обработчик onclick во всех браузерах (по крайней мере, это соответствует!).

Это представляется актуальным, за исключением того, что это происходит только с Opera (я пробовал с IE (8), FF, Chrome и Safari).

Любой вклад приветствуется!

1 Ответ

1 голос
/ 03 мая 2011

Если вы нажмете здесь очень быстро, http://jsfiddle.net/RxbW6/1/

Вы увидите, что, когда 2 флажка заканчиваются одновременно (спамом), событие щелчка не срабатывает для второго флажка.Так что это не проблема многопоточности с вмешательством событий 2 кликов, скорее, опера, похоже, вообще не запускает событие onclick.

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

Однако,

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

Исправит вашу проблему. [Редактировать] mouseup, вероятно, будет лучше, так что вы можете mousedown, а затем отойти и сохранить предыдущую проверку.

...