jquery.live()的bug?

jquery.live()的bug?,jquery,Jquery,有人能解释一下发生了什么事吗 因此,“实现”缺陷的方法是: 单击“显示父项”或“显示父项2” 单击“下一步”以发出警报 单击隐藏以隐藏(我甚至使用html(“”)删除内容) 再次单击“显示父项”或“显示父项2” 单击下一步 砰!出现两个警报 重复此操作将出现越来越多的警报 我知道我用小提琴写的代码不好,因为它只是我昨天发现的问题的简化版本。所以基本上我想做的是: Show Parent和Show Parent 2实际上是一个调用AJAX来显示相册内容的按钮(当然可以超过2个) next是

有人能解释一下发生了什么事吗

因此,“实现”缺陷的方法是:

  • 单击“显示父项”或“显示父项2”
  • 单击“下一步”以发出警报
  • 单击隐藏以隐藏(我甚至使用html(“”)删除内容)
  • 再次单击“显示父项”或“显示父项2”
  • 单击下一步
  • 砰!出现两个警报
  • 重复此操作将出现越来越多的警报
我知道我用小提琴写的代码不好,因为它只是我昨天发现的问题的简化版本。所以基本上我想做的是:

  • Show Parent和Show Parent 2实际上是一个调用AJAX来显示相册内容的按钮(当然可以超过2个)
  • next是从AJAX请求返回的数据的表示形式
  • 这些数据中的每一个都可以与AJAX返回的数据一起单击以执行某些操作。在这把小提琴上,我只是用Show Parent/Show Parent 2(应该是“相册”)的标题提醒“aaa”。这就是为什么我在show click事件中包含jquery click事件,因为我需要在show click事件中请求的AJAX传递的数据(希望这足够清楚)
我已经尝试了一些方法来解决这个问题,但我的代码正在生成bug(?),这仍然让我感到非常困扰。其中包括:

  • 更改$('.parent').html('');到$('.parent')。删除();但是,当然div类的父类将消失,我将不得不重新创建它,这不是我想要的。也许我可以做$('.parent*').remove();删除父div中的所有元素,但这是我最后的选择。这是一个令人困惑的问题,因为firebug一次只显示一个

    实例

  • 将下一个单击事件移到显示单击事件之外。show click事件将AJAX请求返回的数据存储在某个div中,下一个click事件将从该div获取数据。这是一个解决方法,但有更好的方法吗

希望这足够清楚。谢谢

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


因此,每次在您的小提琴中点击这一行:
$('.next').live('click',function()){
,您正在为每个曾经存在的类为
next
的对象安装另一个处理程序,即使该对象尚未创建。

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

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;
    });
因此,每次在你的提琴中点击这一行:
$('.next').live('click',function(){
),你都在为每个对象安装另一个处理程序,该对象具有类
next
,即使该对象尚未创建。

var title
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;
    });
$('.show').live('click',function()){ title=$(this.attr('title'); $('

).text('next').appendTo($('.parent')); $('

).text('hide').appendTo($('.parent')); $('.parent').fadeIn(500,函数(){ }); }); $('.hide').live('click',function()){ $('.parent').empty(); }); $('.next').live('单击',函数()){ 警报(“aaa”+标题); 返回false; });

var title
$('.show').live('click',function()){
title=$(this.attr('title');
$('

).text('next').appendTo($('.parent')); $('

).text('hide').appendTo($('.parent')); $('.parent').fadeIn(500,函数(){ }); }); $('.hide').live('click',function()){ $('.parent').empty(); }); $('.next').live('单击',函数()){ 警报(“aaa”+标题); 返回false; });


进一步了解@cory的答案,看看上面的代码,我已经将.next live event移出了你的.show live event。是的,我也是这么做的。但是我使用了一个额外的标记来存储AJAX返回的数据。我想这是这种情况下的最佳选择。进一步了解@cory的答案,看看上面的代码,我已经移动了.nex我也这么做了。但是我用了一个额外的标记来存储AJAX返回的数据。我想这是这种情况下最好的选择。是的,我也这么认为。但是它将一个处理程序附加到已消失的元素上,这不是很奇怪吗?我没有删除

但是没有$('.parent').html('');注意这一点?不是真的。每次单击时,“显示”都会向“下一步”添加另一个单击事件。因此,创建新的“下一步”元素继承了创建它之前的所有单击事件。请记住,它不是将事件附加到特定元素,而是附加到元素的概念。创建该元素时,它会附加事件是的,我也这么认为。但是它将一个处理程序附加到已消失的元素上,这不是很奇怪吗?我没有删除

但是没有删除$('.parent').html('');注意这一点?不是真的。每次单击时,“显示”都会向“下一步”添加另一个单击事件。因此,创建新的“下一步”元素继承了创建它之前的所有单击事件。请记住,它不是将事件附加到特定元素,而是附加到元素的概念。创建该元素时,它会附加事件我同意