2011-09-29 52 views
0

任何人都可以向我解释发生了什么事?错误与jquery.live()?

http://jsfiddle.net/K5yvp/2/

所以,以“实现”的错误的方法是:

  • 单击显示家长或显示父2
  • 单击下一步提醒
  • 点击躲来躲去(我甚至使用html('')删除内容
  • 再次单击显示父项或显示父项2
  • Cli ck Next
  • Bam!发生两个警报!发生
  • 重复了越来越多的警报

我知道我在小提琴写的代码是没有好处的,因为这是我昨天发现只是问题的一个简化版本。所以基本上我的意思做的是:

  • 显示父和显示父2实际上是一个按钮来调用AJAX显示专辑的内容(可超过2当然)
  • 的< P类= “next”> Next </p>表示从AJAX请求返回的数据。
  • 每个这些数据都可以通过点击来完成AJAX返回的数据。在这个小提琴中,我简单地提醒'aaa'显示父母/显示父母2(应该是“专辑”)的标题。这就是为什么我包括jQuery的单击事件里面的表演,点击事件,因为我需要请求该节目点击事件中由AJAX传递的数据(希望这是不够清楚)

我已经尝试了一些方法来解决这个问题,但它仍然让我烦恼,我的代码正在产生错误(?)。其中一些是:

  • 更改$('。parent')。html('');到$('。parent')。remove();但当然div类的父母将会消失,我将不得不重新创建它,这不是我想要的。也许我可以做$('。parent *')。remove();删除父div内的所有元素,但这是我的最后一招。这是一个令人困惑的问题,因为萤火虫一次只显示一个存在于p class =“next”>中的实例。
  • 在显示点击事件之外移动下一个点击事件。 show click事件会将AJAX请求返回的数据存储在某个div中,并且下一个click事件将从该div中获取数据。解决方法,但有没有更好的方法?

希望这个已经够清楚了。谢谢!

回答

1
var title 
$('.show').live('click',function(){ 
    title = $(this).attr('title'); 
    $('<p class="next" />').text('next').appendTo($('.parent')); 
    $('<p class="hide" />').text('hide').appendTo($('.parent')); 
    $('.parent').fadeIn(500,function(){ 

}); 
});  

$('.hide').live('click',function(){ 
    $('.parent').empty(); 
}); 

$('.next').live('click',function(){ 
     alert('aaa '+title); 
     return false; 
    }); 
+0

除了@cory的回答,看上面的代码,我已经将.next现场活动从你的.show现场活动 – griegs

+0

是啊,这就是我所做的。但我做了一个额外的标记来存储AJAX返回的数据。我想这是这种情况的最佳选择。 – Henson

2

错误可能在于您对live的理解。 Live不会运行一次,并将处理程序附加到找到的每个元素。相反,它允许您将处理程序附加到可能尚未存在的元素

所以每到这条线在你的提琴打时间:$('.next').live('click',function(){,你正在安装其他处理程序中的每个对象与next曾经存在,即使该对象尚未建立。

+0

是的,想通了。但是它将一个处理程序附加到已经消失的元素上并不奇怪吗?那么我没有删除

但没有$('。parent')。html('');照顾呢? – Henson

+0

不是。每次点击.show它都会向.next添加另一个点击事件。因此创建一个新的.next元素会在创建之前继承所有的点击事件。请记住,它不是将事件附加到特定元素,而是附加到元素的想法。当你创建这个元素时,它有附加的事件 – griegs