Javascript 从IE 6 7 8中不起作用的元素创建XPath

Javascript 从IE 6 7 8中不起作用的元素创建XPath,javascript,dom,xpath,Javascript,Dom,Xpath,我的函数在IE9下运行,任何版本9下的东西都会出现裂缝 我使用它来获取已知的DOM元素的XPath 有人知道一个函数可以代替我的吗 function createXPathFromElement(elm) { var allNodes = document.getElementsByTagName('*'); for (segs = []; elm && elm.nodeType == 1; elm = elm.parentNode) {

我的函数在IE9下运行,任何版本9下的东西都会出现裂缝

我使用它来获取已知的
DOM元素的
XPath

有人知道一个函数可以代替我的吗

function createXPathFromElement(elm) {
    var allNodes = document.getElementsByTagName('*'); 
    for (segs = []; elm && elm.nodeType == 1; elm = elm.parentNode) 
    {
        if (elm.hasAttribute('id')) { 
            var uniqueIdCount = 0; 
            for (var n=0;n < allNodes.length;n++) { 
                if (allNodes[n].hasAttribute('id') && allNodes[n].id == elm.id) uniqueIdCount++; 
                if (uniqueIdCount > 1) break; 
            }; 
            if ( uniqueIdCount == 1) { 
                segs.unshift('id("' + elm.getAttribute('id') + '")'); 
                return segs.join('/'); 
            } else { 
                segs.unshift(elm.localName.toLowerCase() + '[@id="' + elm.getAttribute('id') + '"]'); 
            } 
        } else if (elm.hasAttribute('class')) { 
            segs.unshift(elm.localName.toLowerCase() + '[@class="' + elm.getAttribute('class') + '"]'); 
        } else { 
            for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) { 
                if (sib.localName == elm.localName)  i++;
            }; 
            segs.unshift(elm.localName.toLowerCase() + '[' + i + ']'); 
        }; 
    };
    return segs.length ? '/' + segs.join('/') : null; 
}
函数createXPathFromElement(elm){
var allNodes=document.getElementsByTagName('*');
对于(segs=[];elm&&elm.nodeType==1;elm=elm.parentNode)
{
if(elm.hasAttribute('id')){
var uniqueIdCount=0;
对于(var n=0;n1)中断;
}; 
如果(uniqueIdCount==1){
segs.unshift('id('+elm.getAttribute('id')+'));
返回segs.join('/');
}否则{
segs.unshift(elm.localName.toLowerCase()+”[@id=“”+elm.getAttribute('id')+“]);
} 
}else if(elm.hasAttribute('class')){
segs.unshift(elm.localName.toLowerCase()+”[@class=“”+elm.getAttribute('class')+“]);
}否则{
对于(i=1,sib=elm.previousSibling;sib;sib=sib.previousSibling){
if(sib.localName==elm.localName)i++;
}; 
segs.unshift(elm.localName.toLowerCase()++'['+i+']');
}; 
};
返回segs.length?'/'+segs.join('/'):null;
}
您可能会寻找解决方案

至于为什么你的失败在早期IE:。我不清楚为什么要检查整个DOM中的重复ID属性,因为有多个元素具有相同的ID是无效的。但我知道现实世界中的HTML并不总是有效的。也就是说,您应该能够使用
if(elm.id&&elm.id.length)
检查id属性的存在。与
类相同

如果希望在早期版本的IE中使用XPath,您也会遇到问题,因为我认为HTML文档不支持XPath。我相信互联网上有解决方案,所以我将留给你(或其他更善良的灵魂)去发现