Подтвердить что ты не робот

Обработчик события jQuery вызывается дважды для флажка

У меня есть проблема со следующим кодом на странице ASPX:

<script type="text/javascript">
$(document).ready(function() {
    $('.test').click(function() {
        alert("click")
    })
});
</script>

<asp:CheckBox runat="server" Text="Checkbox XYZ" CssClass="test" ID="cb1" />

В браузере (FF3.5/IE8) у меня возникает следующая проблема:

  • Если я нажму на флажок (маленький квадрат), он будет работать как ожидалось
  • если я нажму на значок флажка ( "Checkbox XYZ" ), тогда событие click будет запущено дважды, а предупреждение будет показано дважды.

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

<span class="test">
 <input id="ctl00_c1_cb1" type="checkbox" name="ctl00$c1$cb1" checked="checked"/>
 <label for="ctl00_c1_cb1">Checkbox XYZ</label>
</span>

Как правильно настроить обработчик события клика, чтобы он не вызывался дважды?

4b9b3361

Ответ 1

После того, как я снова прочитал свой вопрос, я нашел способ его решения.

Просто добавьте "enter" в селектор jQuery:

<script type="text/javascript">
$(document).ready(function() {
        $('.test input').click(function() {
                alert("click")
        })
});
</script>

Ответ 2

Я только что испытал одно и то же, но не уверен, что пузырь событий вызывает мою проблему. У меня есть настраиваемый элемент управления деревом, и когда элемент открывается, я использую $(id).click() для присоединения обработчика ко всем элементам определенного типа.

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

$('img.load_expand').unbind("click").click(function()
{
  // handler
});

Ответ 3

Я думаю, потому что a <label> с атрибутом for вызывает событие click элемента <input type="radio"> или <input type="checkbox">, которое связано при нажатии.

Итак, в вашем коде jQuery вы настроили обработчик события щелчка для <label> и <input> внутри <span class="test">. При нажатии на <label> будет выполняться обработчик события клика, который вы настроили на метке, тогда обработчик события клика, настроенный на <input>, будет выполняться, когда метка вызывает событие click на <input>.

Ответ 4

$(document).ready(function() {
    $('.test').click(function(event) {
                    event.stopImmediatePropagation();
                    alert("Click");
                    })
                 }
              );

Мне удалось заставить мой код работать, остановив событие "Распространение". Это не повлияло на изменение статуса флажка.

Ответ 5

Просто используйте .mouseup, а не .click

Ответ 6

То, что вы видите, это пузырь событий. Событие click сначала обрабатывается меткой, а затем передается в этот флажок. Вы получаете одно предупреждение для каждого. Чтобы предотвратить пузырьки событий, вам нужно вернуть false в обработчик кликов.

$(document).ready(function() {
        $('.test').click(function() {
                alert("Click");
                return false;
        })
});

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

Ответ 7

Решено: это работать с Firefox 3.6.12 и IE8.

$(function(){
        $("form input:checkbox").unbind("click")
        .click(function(){
            val = $(this).val();
            alert(val);
        })
    }

Фокус в unbind("click"). перед привязкой к .click(fn); это отключит одно и то же событие для двухкратного запуска.

Обратите внимание, что событие "change" не будет проверяться в первый раз. Поэтому я использую "click".

Ответ 8

Я столкнулся с той же проблемой с событием click и нашел эту статью. В сущности, если у вас есть несколько функций, поддерживающих документ jQuery, внутри   <body></body> теги, вы можете получить несколько событий. Исправить это, конечно, не делать этого, или отменить событие щелчка и переустановить его, как указано выше. Иногда, с несколькими библиотеками javascript, может быть трудно избежать нескольких document.ready(), поэтому unbind - хороший способ обхода.

<code>
$('#my-div-id').unbind("click").click(function()
  {
    alert('only click once!');
  }
</code>

Ответ 9

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

При добавлении ASP-кода, например:

<asp:CheckBox runat="server" Text="Checkbox XYZ" CssClass="test" ID="cb1" />

проблема заключается в том, что <asp:CheckBox ...> не является элементом управления html, а только что-то ASP , составленным из закрученного ума какого-то психопата, поэтому браузер получит что-то еще.

Браузер получит что-то вроде:

<span class="test">
    <input id="garbageforYourId_cb1" type="checkbox" name="garbage$moregarbage$cb1"/>
    <label for="evenMoreGarbage_cb1">Checkbox XYZ</label>
</span>

Одно из многих возможных решений:

Браузер получает диапазон, содержимое которого содержит входной флажок и метку для него с текстом. Поэтому мое решение для этого было бы чем-то вроде:

$('.test > :checkbox').click(function() {
    if ($(this).attr("checked")) {
        alert("checked!!!");
    } else {
        alert("non checked!!!");
    }
});

Что там произошло? Этот селектор $('.test > :checkbox') означает: найти элементы с классом "test" и принести любой флажок, который он содержит.

Ответ 10

Функция выполняется дважды. Один раз изнутри, а затем он снова вызван изнутри. Просто добавьте оператор возврата в конец.

<script type="text/javascript">
$(document).ready(function() {
    $('.test').click(function() {
        alert("click");
        return false;
    })
});
</script>

<asp:CheckBox runat="server" Text="Checkbox XYZ" CssClass="test" ID="cb1" />

Это отлично сработало для меня.