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

JQuery trigger ('click') не запускается .click event on checkbox

У меня есть таблица с флажком check-all в заголовке, который проверяет все флажки в этом столбце таблицы:

<input class="check-all" type="checkbox" id="masterCheck" />

Однако на одной из моих страниц я хочу автоматически проверить флажок check-all на загрузке страницы.

Для этого я попытался запустить триггер ('click'), как показано ниже:

$(document).ready(function () {
    if ($("#masterCheck").attr('checked')) {
    } else {
        $("#masterCheck").trigger('click');
    }
});

Это проверяет флажок в порядке, но не запускает мое пользовательское событие click для флажков с классом .check-all (ниже):

$(function () {
    $('.check-all').click(function () {
        $(this).parents('table:eq(0)').find(':checkbox').attr('checked', this.checked);
    });
});

Я также попробовал добавить Javascript setTimeout, считая, что пользовательская функция щелчка еще не загружалась, но по-прежнему не запускала пользовательскую функцию щелчка после ожидания 1, 2 и 3 секунды.

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

Должен ли я добавить что-то особенное в мой jQuery на Document.ready, чтобы он мог запускать пользовательское событие click?

*** EDIT1:

Хорошо, я попытался добавить пользовательское событие click прямо над функцией document.ready на моей странице, чтобы обеспечить его загрузку (поскольку предыдущее пользовательское событие click находится в файле .js мастера, который используется в моем _Layout). В дополнение к этому, я изменил класс моего флажка, чтобы соответствовать моему новому пользовательскому клик-событию, поэтому я не конфликтую с тем, что находится в моем главном файле .js.

<input class="check-allx" type="checkbox" id="masterCheck" />


// Check all checkboxes when the one in a table head is checked:
    $(function () { 
        $('.check-allx').click(function () {
            $(this).parents('table:eq(0)').find(':checkbox').attr('checked', this.checked);
            alert(this);
        });
    });
// Check for unchecked masterCheck
    $(document).ready(function () {
        if ($("#masterCheck").attr('checked')) {
        } else {
            //$("#masterCheck").trigger('click');
            $("#masterCheck").click();
        }
    });

Кажется, что мое предупреждение появляется в пользовательском событии клика, который является прогрессом, но безрезультатно все мои флажки проверяются так, как должны. Примечание. Я также сменил триггер ('click') на .click(), которые оба делают то же самое в моей ситуации.

4b9b3361

Ответ 1

Обновление: это относится только к jQuery 1.8 и ниже. Это было исправлено в jQuery 1.9.

Проблема заключается в том, что ручной вызов click() в jQuery работает иначе, чем фактический щелчок.

Когда вы на самом деле нажимаете, сначала изменяется состояние флажка, вызывается ваш обработчик кликов.

Когда вы вызываете click(), сначала вызывается обработчик кликов, а затем изменяется состояние флажка.

Поэтому, когда вы вызываете click, в вашем обработчике кликов this.checked все равно будет false. Вы можете исправить это, сделав его обработчиком change вместо обработчика click, например:

$('.check-allx').change(function () {
    $(this).parents('table:eq(0)').find(':checkbox').attr('checked', this.checked);
});

См. В jQuery, почему программный запуск "click()" на флажке не сразу проверяет его? для более полного объяснения разницы между фактическими щелчками вручную и jquery активировал клики.

Ответ 2

Пример:

$("#recurrence").trigger('click');

Ниже будет выполнено изменение состояния флажка.

$("#recurrence").click(function () {
    $(this).change(function(){
        if (this.checked) {
            $(".recurr-section").show();
        } else {
            $(".recurr-section").hide();
        }
    });        
});

Ответ 3

Задание проверенного атрибута программным способом не вызывает соответствующее событие клика, поэтому при установке атрибута вам придется добавить свой собственный .trigger('click').

Ответ 4

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

После кофе этим утром это было немного яснее для меня. Я добавил этот код как обход.

$(document).ready(function () {
        $('table#OHTable input[type=checkbox]').attr('checked', 'checked');
    });

Это просто проверяет все мои флажки в моей таблице, и надлежащее событие клика по-прежнему запускается, когда мой мастер проверяется после факта.