我用AJAX加载页面。该页面包含以下代码(对于div'运动动画,#1将其移至左侧,#2将其再次移回)
#1
$('#flipper').click(function () {
$(".l-l").animate({ "left": -267 }, 600, function () {
$('#flipper').addClass('flipper-h');
});
});
#2
$('#flipper.flipper-h').die(); //to prevent .live() event bubbling. I guess
$('#flipper.flipper-h').live('click', function () {
$(".l-l").animate({ "left": 0 }, 600, function () {
$('#flipper').removeClass('flipper-h');
});
});
使用该代码我遇到了一些问题:
1)首页加载后,代码#2在动画开始前有一点冻结
2)在第二次(和更多)页面加载后,#2代码不会触发。为什么?
我注意到代码#2被无限次调用(这很奇怪)。但是,我已经通过代码修复了1)案例:
$('#flipper').click(function () {
if(!$(this).hasClass('flipper-h')) {
$(".l-l").animate({ "left": -267 }, 600, function () {
$('#flipper').addClass('flipper-h');
});
} else {
$(".l-l").animate({ "left": 0 }, 600, function () {
$('#flipper').removeClass('flipper-h');
});
}
});
但问题2)仍未解决。有什么想法吗?
答案 0 :(得分:1)
EDIT3:请考虑以下两个代码:
在第一个示例中,当您使用“删除”按钮时,元素将被删除,其元素看起来相同,但它们不是。事件丢失了。
在第二个元素中,删除了元素,但在此之后再次绑定了click事件...
EDIT2 :根据您的修改,尝试使用此功能。它表现得更好......
$('#flipper').click(function () {
if ($(this).hasClass('flipper-h')) {
$(this).removeClass('flipper-h');
$(".l-l").animate({
"left": 0
}, 600);
} else {
$(this).addClass('flipper-h');
$(".l-l").animate({
"left": -267
}, 600);
}
});
编辑:我建议你仍然使用jQuery 1.7,所以我做了一些调查。
首先,您将事件onclick放在#flipper上。
然后你在#flipper.flipper -h元素上调用die。哪个应该销毁所有直播活动。
之后,您在#flipper.flipper -h元素上创建了一个实时事件,这意味着存在且将存在的所有元素都将具有此事件。
现在先点击: 动画左:-267发生, 然后回调#flipper成为#flipper.flipper-h, 然后将直播事件绑定到新的#flipper.flipper-h,
第二次点击: 动画左:-267发生了,但它已经存在,所以没有任何反应 然后回调#flipper成为#flipper.flipper-h,所以没有再发生, 现在事件还在冒泡,所以剩下的第二个动画:在600ms后触发0(这可能是你的冻结) 现在回调删除.flipper-h
现在我不知道你的ajax究竟是如何工作的,但似乎die函数会永久地从#flipper中删除实时事件。所以它不能再被触发......
die
功能不会阻止冒泡。它删除了直播活动。
return false
或event.stopPropagation