Правильная обработка .live () в jQuery - PullRequest
0 голосов
/ 17 ноября 2010

Я сейчас пытаюсь попасть в jQuery.И мне трудно (-;

Сейчас я пытаюсь загрузить страницу с помощью .load ()

scan_music  : function ()
{
 var target = $('#crawl_results');

 target.load('/admin/scanner/crawl_product_ids/de/music #product_ids', function()
 {
  admin.hide_loading();
 });
 return false;
}

Это работает довольно хорошо, и все отображается правильноНа странице, которую я загружаю, есть много флажков, и я хочу иметь возможность переключать их все с помощью одного специального флажка (#check_all проверяет .to_be_checked).

Хорошо, эта функция работает хорошо. Но онане работает с контентом, загруженным ajax.

check_all_boxes : function ()
{
 var check_all  = $('#check_all'),
     to_be_checked = $('.to_be_checked');

 check_all.live('click', function ()
 {
  to_be_checked.attr('checked', check_all.is(':checked'));
 });
}

Я знаю, что должен использовать .live () для выбора загруженного контента (работает нормально с check_all.live ()). Проблема в том, чтоклассы .to_be_checked не затронуты, и я понятия не имею, как использовать функцию live () для их выбора в этом случае.

Я надеюсь, что вы, ребята, можете мне помочь (:

С наилучшими пожеланиями!

Ответы [ 3 ]

4 голосов
/ 17 ноября 2010

Вам необходимо снова запустить запрос DOM в обработчике live:

check_all.live('click', function ()
{ 
   $('.to_be_checked').attr('checked', check_all.is(':checked'));
});

Это связано с тем, что на момент назначения to_be_checked он содержит результат запроса DOM на тот моментприсваивания, что не является желаемым поведением.

Если вы снова запустите запрос в обработчике, вы получите желаемые результаты.

0 голосов
/ 17 ноября 2010
check_all_boxes : function ()
{
 var check_all  = $('#check_all'),
     to_be_checked = $('.to_be_checked');

 check_all.live('click', function ()
 {
  to_be_checked.attr('checked', check_all.is(':checked'));
 });
}

В этом коде вы кешируете свой селектор ".to_be_checked". Обычно это хорошая идея для селекторов, но не при загрузке через AJAX. Здесь происходит то, что когда определено «to_be_checked», оно ищет в DOM все элементы этого класса, создает и возражает, и все.

То, что вы хотите сделать, это просто:

check_all.live('click', function () {
      $('.to_be_checked').attr('checked', check_all.is(':checked'));
     });
    }
0 голосов
/ 17 ноября 2010

В вашей проблеме есть стандартная проблема закрытия, to_be_checked определяется вне функции live и, таким образом, устанавливается в то время, когда событие live () изначально связано и не обновляется позже.Используйте селектор снова внутри вызова live ().

check_all_boxes : function ()
{
 var check_all  = $('#check_all');

 check_all.live('click', function ()
 {
    $('.to_be_checked').attr('checked', check_all.is(':checked'));
 });
}
...