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传递的数据(希望这足够清楚)
- 更改$('.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('');注意这一点?不是真的。每次单击时,“显示”都会向“下一步”添加另一个单击事件。因此,创建新的“下一步”元素继承了创建它之前的所有单击事件。请记住,它不是将事件附加到特定元素,而是附加到元素的概念。创建该元素时,它会附加事件我同意