Почему не устанавливается .attr («проверено», «проверено»)? - PullRequest
4 голосов
/ 08 апреля 2010

У меня есть следующий фрагмент кода (я использую jQuery 1.4.2):

$.post('/Ads/GetAdStatsRow/', { 'ad_id': id }, function(result) {
    $('#edit_ads_form tbody').prepend(result);
    $(result).find('td.select-ad input').attr('checked','checked').click();
});

Предположим, что запись работает правильно и возвращает правильную предварительно собранную <tr> с некоторыми <td> с. Вот странность: строка $(result).find() находит правильный ввод (который является флажком, так как он является единственным входом в ячейке) и правильно запускает цепочечную функцию click(), но она ОТКАЗЫВАЕТСЯ установить флажок как отмеченный, что я должно случиться.

Вот еще и сумасшедший поворот ... когда я получаю супер-специфичные данные и меняю строку $(result).find() на эту (идентификатор флажка):

$('#ad_' + id).click();

Он устанавливает флажок, но не запускает функцию click()! Если я установлю его на

$('#ad_' + id).attr('checked','checked').click();

он запускает функцию щелчка, как если бы флажок был установлен, но флажок остается не отмеченным, и если я сделаю

$('#ad_' + id).click().attr('checked','checked');

он вообще ничего не делает.

Что в мире может быть с этим? У меня кончаются волосы ....

Спасибо!

EDIT

Вот как я устанавливаю свое событие нажатия на вызове $(function()):

$('td.select-ad input').live('click',AdPreview.selectAd);

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

РЕДАКТИРОВАТЬ 2

После некоторого копания я обнаружил, что это:

$('#ad_' + id).click();

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

var input = $(this);
console.log(input.is(':checked'));

журнал возвращает false, хотя флажок на самом деле установлен! GAH WTF

Ответы [ 5 ]

4 голосов
/ 08 апреля 2010

Я думаю, это потому, что вы делаете поиск по какому-то html, которого нет в DOM.

$.post('/Ads/GetAdStatsRow/', { 'ad_id': id }, function(result) {
    // the "result" html is copied into the DOM
    $('#edit_ads_form tbody').prepend(result);

    // now you're doing a find on some HTML which isn't in the DOM.
    $(result).find('td.select-ad input').attr('checked','checked').click();
});

Это объясняет, почему выполнение определенных вещей работает, в некоторой степени.Вот отдельные проблемы:

$('#ad_' + id).click();

Это щелкнет по полю (делает его отмеченным), но к нему не прикреплено никаких событий.

$('#ad_' + id).attr('checked','checked').click();

Это устанавливает для атрибута значениепроверил, а затем щелкнул, сразу сняв галочку.

2 голосов
/ 08 апреля 2010

http://www.electrictoolbox.com/check-uncheck-checkbox-jquery/

jQuery (или DOM браузера? Я забыл) ожидают истинное или ложное значение для атрибута «checked», несмотря на тот факт, что в HTML-источнике это «check = 'checked'».

НТН.

1 голос
/ 08 апреля 2010

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

Во-первых, вместо того, чтобы устанавливать флажки для запуска на click(), я обновил их для запуска на change(). После того, как я это сделал, я использовал следующую строку вместо другой:

$('#ad_' + id).click().change();

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

Еще раз спасибо всем!

1 голос
/ 08 апреля 2010

Я подозреваю, что здесь происходит то, что Click фактически снимает флажок. Это потому, что, как вы говорите, метод Find возвращает флажок.

Попробуйте удалить звонок.

Вот пример кода

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
    </head>

    <body>

        <script type="text/javascript">
            function clicked() {
                console.log('clicked');
            }

            $(document).ready(function() {

                var result = '<tr><td><input type="checkbox" id="chkbx" onclick="clicked()" /></td></tr>';

                $('#edit_ads_form tbody').prepend(result);

                $('#edit_ads_form tbody').find("input").click();
            });
        </script>

        <table id="edit_ads_form">
        <tbody>

        </tbody>
        </table>
    </body>
</html>
0 голосов
/ 08 апреля 2010

Не собирается ли $(result).find('td.select-ad input').attr('checked','checked').click(); проверить его (.attr('checked','checked')), а затем снять его, нажав (.click())?

Простите, если что-то мне не хватает, но яЯ вполне уверен, что это так.Вот почему $('#ad_' + id).click(); работает, а другие примеры - нет.

...