Javascript 何时';展开';在循环的子节点中,引用会变得混乱 var thumbs=document.getElementsByClassName('thumbnailImage'); 对于(var i=0,len=thumbs.length;i

Javascript 何时';展开';在循环的子节点中,引用会变得混乱 var thumbs=document.getElementsByClassName('thumbnailImage'); 对于(var i=0,len=thumbs.length;i,javascript,Javascript,将循环更改为: var thumbs = document.getElementsByClassName('thumbnailImage'); for(var i=0,len=thumbs.length;i<len;i++){ var p = thumbs[i].parentNode; alert('i: '+i+',thumbs[i]: '+thumbs[i].id+',p.t

将循环更改为:

var thumbs = document.getElementsByClassName('thumbnailImage');
                for(var i=0,len=thumbs.length;i<len;i++){
                    var p = thumbs[i].parentNode;
                    alert('i: '+i+',thumbs[i]: '+thumbs[i].id+',p.tagName: '+p.tagName+',p.class: '+p.className);
                    //unpackchild(thumbs[i]);
                }

function unpackchild(c) {
    var g=c.parentNode.parentNode;g.appendChild(c);
}

这将确保系统不会混淆,即使您有具有该类名的嵌套元素(在本例中可能没有,但一般情况下最好了解)
HTMLCollection
GetElementsByCassName
返回的对象是活动的-这意味着它可能会在底层DOM文档更改时更改。

将上述两个答案结合在一起,在循环时,我移动元素后发生的任何事情都会破坏对thumbs的引用。因此在原始(为了回答这个问题,我删除了它)我在调用unpackchild后添加了一个eventlistener。在更改为Niet建议的反向计数循环后,eventlistener实际上只在thumbs中的第一个元素上添加了5次。通过将addeventlistener移动到unpackchild之前,它被正确地添加到每个元素

因此,点击拇指[0]会导致5次点击事件触发所有引用拇指[0]

for( var i=thumbs.length-1; i>=0; i--) {
…而这将导致每个拇指[i]引用拇指[i]时正确触发1个事件

                    var thumbs = document.getElementsByClassName('thumbnailImage'),i=0,len=thumbs.length,c=0,el=[],p;
                    for(i=len-1;i>=0;i--){
                        p = thumbs[i].parentNode;
                        //alert('i: '+i+',thumbs[i]: '+thumbs[i].id+',p.tagName: '+p.tagName+',p.class: '+p.className);
                        thumbs[i].addEventListener('click',(function(t){return function(e){mzremix(t,e);};})(thumbs[i]),false);
                        if(p.tagName == 'A'){ unpackchild(thumbs[i]);p.parentNode.removeChild(p); }
                        thumbs[i].addEventListener('click',(function(t){return function(e){mzremix(t,e);};})(thumbs[i]),false);
                    }

实际上,您可能需要考虑使用<代码>文档.QueRealStudioAL(“.thopnIaVIIGATION”)< /COD>。它是快照而不是活生生的集合,这意味着您可以在任何方向上循环,没有问题。此外,IE8将工作(即支持QSA但不支持GEBCN)。是的,这正是我所怀疑的。颠倒顺序,使用黑暗势力所建议的循环式Niet解决了这个问题。
                var thumbs = document.getElementsByClassName('thumbnailImage'),i=0,len=thumbs.length,c=0,el=[],p;
                for(i=len-1;i>=0;i--){
                    p = thumbs[i].parentNode;
                    //alert('i: '+i+',thumbs[i]: '+thumbs[i].id+',p.tagName: '+p.tagName+',p.class: '+p.className);
                    thumbs[i].addEventListener('click',(function(t){return function(e){mzremix(t,e);};})(thumbs[i]),false);
                    if(p.tagName == 'A'){ unpackchild(thumbs[i]);p.parentNode.removeChild(p); }
                }