页面:http://h4z.it/View/-20100729_designtea.jpg
在控制台中执行的代码:
document.evaluate("//img",document,null,9,null).singleNodeValue
或
document.evaluate("//a",document,null,9,null).singleNodeValue
甚至
document.evaluate("//html",document,null,9,null).singleNodeValue
结果(使用Chrome和Firefox测试):null
我认为该页面覆盖了document.evaluate,但它显示了
document.evaluate
function evaluate(){[native code]}
并且delete document.evaluate
没有帮助,那么还有什么可以打破document.evaluate
?
答案 0 :(得分:4)
您在问题中显示的页面使用的是xhtml命名空间,您可能会看到其他页面。
由于您为命名空间解析程序参数设置null
,因此无法找到元素。
注意:XPath定义的QNames没有前缀,只匹配中的元素 null命名空间。在XPath中无法获取默认值 应用于常规元素引用的名称空间(例如, p [@id ='_ myid']表示xmlns ='http://www.w3.org/1999/xhtml')。匹配 非null命名空间中的默认元素,您必须参考 使用诸如的形式的特定元素 ['namespace-uri()='http://www.w3.org/1999/xhtml'和name()='p'和 @id ='_ myid'](这种方法适用于动态XPath的地方 名称空间可能不知道)或使用前缀名称测试,并创建 将前缀映射到命名空间的命名空间解析器。
因此,如果你设置一个解析器,你可以通过为它们添加前缀来正确访问该元素:
function resolver(prefix){
return prefix === "xhtml" ? 'http://www.w3.org/1999/xhtml' : null;
}
document.evaluate("//xhtml:a",document,resolver,9,null).singleNodeValue
如果您想在不知道命名空间的情况下获取节点,可以使用local-name()
XPath函数作为表达式的一部分
document.evaluate("//*[local-name()='img']",document,null,9,null).singleNodeValue