0

我的功能适用于IE99 版以下的任何东西,破解;

我用它来获取XPath已知的DOM Element

有谁知道替代我的功能?

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; 
}
4

1 回答 1

1

您可能会查看此答案以寻求解决方案。

至于你为什么在早期的 IE 中失败:hasAttribute直到 IE8 才引入。我不确定为什么要检查整个 DOM 是否有重复的 ID 属性,考虑到拥有多个具有相同 ID 的元素是无效的。但我知道现实世界的 HTML 并不总是有效的。也就是说,您应该能够只使用if (elm.id && elm.id.length)来检查 id 属性的存在。同上class

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

于 2012-10-17T14:57:01.083 回答