我正在写一个小的Chrome扩展来操纵谷歌的搜索结果' DOM添加一组小问题来询问用户为什么他/她选择遵循该链接;在润色过程中,我决定环顾页面,以防有旧的投票已经显示出来,然后删除它(就像,如果用户在点击一个结果后决定关注另一个结果),这时我开始注意到一个奇怪的行为:我第一次点击一个链接,在能够继续进入所选页面之前,我看到了投票;第二次(不离开页面)旧的民意调查得到正确删除,新的一个添加到DOM,但这个新元素得到slideDown()
的目标只有当它被插入之前的旧的(即,如果我点击链接上面的前一个)。
$('li.g a') // all the results' link
.bind('click', function(event) {
event.preventDefault(); // avoid going to destination right away
var oldpoll = $('#extension');
if (oldpoll.length)
oldpoll.slideUp('fast', function(){
$(this).remove();
}); // remove (eventual) old poll
...
$(this).parents('.g').append(element);
$('#extension').slideDown();
});
正如你所看到的,我认为有某种缓存正在进行,并试图通过声明一个变量来保存旧元素来"强制"避免它,但这不起作用;最终,我设法通过强迫$('#extension a').parent().slideDown();
新的DOM遍历来绕过它,但现在我真的很好奇这是我的错,还是Chrome的错,还是JQuery的错。谢谢。
我认为问题可能是因为您插入了多个id为'extension'的元素。id在文档中应该是唯一的,但是在slideUp运行期间,会有两个'#extension'元素。
因此,如果你把它插入到旧元素的上面,然后运行slideDown,它会尝试在新的元素上执行它,但如果你把它插入到旧元素的后面,那么你的slideDown会在旧元素上运行,因为$('#extension')会取页面中第一个具有该id的元素
正如上面的评论所说,在使用.bind()时有相当多的怪癖:
http://api.jquery.com/bind/所以我绝对推荐使用。live()(也已被弃用…)或新的。on()