2013-02-15 69 views
0

下面的代码将达到“之前”和“之间”警报,但不是“之后”警报。JavaScript中的Xpath评估不相对于某些元素工作

alert("before") 

var test = document.evaluate('.//*',document,document.createNSResolver(document),XPathResult.ANY_TYPE,null) 
alert(element.tagName)//alerts "TABLE" 
alert("between") 
test = document.evaluate('.//*',element,document.createNSResolver(document),XPathResult.ANY_TYPE,null) 
alert("after") 

这写成硒扩展的一部分。代码中的alert(document)给出的结果与在萤火虫中运行时的alert(document)不同。 [object XULDocument] vs [object HTMLDocument]。

回答

0

解决了。

document不引用硒扩展中的HTML文档。然而每个元素都有对拥有它的文档的引用。在这种情况下

test = document.evaluate('.//*',element,document.createNSResolver(document), 
XPathResult.ANY_TYPE,null) 

成为

test = element.ownerDocument.evaluate('.//*',element, 
element.ownerDocument.createNSResolver(element.ownerDocument), 
XPathResult.ANY_TYPE,null) 

等等...

0

你的第二个测试有一个未定义的变量element

+0

它不是未定义的,它只是没有在我发布的内容中定义。只是假设它是文档中的某个元素。 – Zackkenyon 2013-02-15 23:20:47

+0

我添加了一行来使这个更清晰。 – Zackkenyon 2013-02-15 23:31:13

+0

hm ...看着这个页面并输入控制台'var element = document.getElementById('footer'); test = document.evaluate('.//*',element,document.createNSResolver(document),XPathResult.ANY_TYPE,null);'返回一个可用的'XPathResult'对象。 – Jerry 2013-02-16 00:08:27

0

Zackkenyon答案的一个变体,而解析器似乎工作。

var rangee = table.ownerDocument.evaluate("./tbody/tr", table, null, 
XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 
+0

这是一个答案。你不需要为此道歉。 – Drew 2016-02-25 14:48:41