JQuery "cache" DOM 元素吗?还是铬?



我正在写一个小的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()

最新更新