在使用AJAX和某些其他jQuery函数(如“绑定”和“克隆”)编写“添加到收藏夹”功能时,出现了一个问题。我将首先解释一下这个功能:
我有两个内容领域:
将产品添加到收藏夹时,我会以编程方式将“添加到收藏夹”按钮更改为“从收藏夹中删除”按钮。另外,我将整个产品(包括“从收藏夹中移除”按钮)克隆到“收藏夹”区域。
现在,如果我切换到“收藏夹”-area并尝试删除喜欢的产品,它就不起作用。如果我然后刷新页面,删除工作完美..
我认为,这与刷新DOM结构或重新绑定函数或类似的东西有关。 我很高兴能对这个问题提供任何帮助或解释。
这是我的代码(脚本放在页面的末尾):
// ACTION: Favorites
$JQuery('.katoverview_media').find('.prod_action_favorit').bind("click", function(){
//Split data and set variables
var type = $JQuery(this).attr("rel").split('%')['0'];
var objid = $JQuery(this).attr("rel").split('%')['1'];
var favs = parseInt($JQuery('#count_favoriten').html());
if($JQuery(this).hasClass("active")){
$JQuery(this).removeClass("active");
var action = 'delete';
var favs_new = favs-1;
$JQuery.each($JQuery('.katoverview_media_fav').find('.prod_action_favorit'), function() {
var checkObjid = $JQuery(this).attr("rel").split('%')['1'];
if(checkObjid == objid){
if($JQuery(this).hasClass("active")){
$JQuery(this).parent().parent().parent().remove();
}
}
});
} else {
$JQuery(this).addClass("active");
var action = 'add';
var favs_new = favs+1;
$JQuery(this).parent().parent().parent().clone().appendTo('.katoverview_media_fav');
}
var pars = 'type='+type+'&objid='+objid+'&action='+action;
$JQuery.ajax({url: "ajax/fav.php?"+pars});
$JQuery('#count_favoriten').html(favs_new).css({color: 'red'}).delay('500').animate({color: '#333'}, 1000);
})
$JQuery('.katoverview_media_fav').find('.prod_action_favorit').bind("click", function(){
//Split data and set variables
var type = $JQuery(this).attr("rel").split('%')['0'];
var objid = $JQuery(this).attr("rel").split('%')['1'];
var favs = parseInt($JQuery('#count_favoriten').html());
if($JQuery(this).hasClass("active")){
$JQuery(this).parent().parent().parent().remove();
var action = 'delete';
var favs_new = favs-1;
}
var pars = 'type='+type+'&objid='+objid+'&action='+action;
$JQuery.ajax({url: "ajax/fav.php?"+pars});
$JQuery('#count_favoriten').html(favs_new).css({color: 'red'}).delay('500').animate({color: '#333'}, 1000);
$JQuery.each($JQuery('.katoverview_media').find('.prod_action_favorit'), function() {
var checkObjid = $JQuery(this).attr("rel").split('%')['1'];
if(checkObjid == objid){
if($JQuery(this).hasClass("active")){
$JQuery(this).removeClass("active");
}
}
});
})
答案 0 :(得分:6)
.clone([withDataAndEvents] [,deepWithDataAndEvents])
通常,绑定到原始元素的任何事件处理程序都不会复制到克隆。可选的 withDataAndEvents 参数允许我们更改此行为,并改为将所有事件处理程序的副本绑定到元素的新副本。从jQuery 1.4开始,所有元素数据(由 .data()方法附加)也会复制到新副本。
从jQuery 1.5开始, withDataAndEvents 可以选择使用 deepWithDataAndEvents 进行增强,以复制克隆元素的所有子项的事件和数据。
例如
$JQuery(this)
.parent()
.parent()
.parent()
.clone(true, true) /* with withDataAndEvents and deepWithDataAndEvents */
.appendTo('.katoverview_media_fav');
可能就是您所需要的。
否则,使用.live()(或者优选.on()代替jQuery 1.7+)而不是.bind()。
$('.katoverview_media_fav .prod_action_favorit').live("click", function(){
...
});