document.evaluate allways在某些pages \ sites上的singleNodeValue中返回null

时间:2013-10-02 20:16:48

标签: javascript google-chrome firefox document.evaluate

页面: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

1 个答案:

答案 0 :(得分:4)

您在问题中显示的页面使用的是xhtml命名空间,您可能会看到其他页面。

由于您为命名空间解析程序参数设置null,因此无法找到元素。

MDN Using XPath

  

注意: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

.evaluate doc

Creating Resolver

如果您想在不知道命名空间的情况下获取节点,可以使用local-name() XPath函数作为表达式的一部分

document.evaluate("//*[local-name()='img']",document,null,9,null).singleNodeValue