2013-02-15 110 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