正确处理jQuery的.live()

时间:2010-11-17 20:32:40

标签: javascript jquery load live

我目前正在尝试进入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 个答案:

答案 0 :(得分:4)

您需要在live处理程序中再次运行DOM查询:

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

这是因为在分配to_be_checked时,它包含分配时DOM查询的结果,这不是所期望的行为。

如果在处理程序内再次运行查询,您将获得所需的结果。

答案 1 :(得分:0)

您的问题存在标准的闭包问题,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'));
 });
}

答案 2 :(得分:0)

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'));
     });
    }