`
tory320
  • 浏览: 34164 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

document.evaluate

阅读更多

使用 Greasemonkey 时会遇到的功能最为强大的一个工具就是 evaluate 函数。通过使用XPath这种查询语言,它可以用来寻找页面中的元素,属性和文本。

举个例子来说,如果您想获得某个页面上的全部链接。您也许会想到使用document.getElementsByTagName('a');但是如果您还要继续检查是否每个链接都具有href属性,因为<a>还可以用来作为锚名称使用,这时,您需要使用Firefox内建的 XPath 支持去获取全部具有href属性的<a>元素。

例子: 获取页面上的全部链接

var allLinks, thisLink;
allLinks = document.evaluate(
     '//a[@href]',
     document,
     null,
     XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
     null);
for (var i = 0; i < allLinks.snapshotLength; i++) {
     thisLink = allLinks.snapshotItem(i);
     // do something with thisLink
}

这里,document.evaluate 是关键的部分。 它把 XPath 查询语句作为一个字符串,其它的参数稍后再做解释。 这条 XPath   查询语句可以找到全部具有href属性的<a>元素,并将它们按照随机的顺序依次返回。(这就是说,第一个被返回的元素并一定也是页面上的第一个这样的元素。) 随后,您就可以用 allLinks.snapshotItem(i) 函数访问每一个元素。


XPath表达式所能做到的甚至会使您惊讶。请看下面这个例子,它获取了全部具有title属性的元素。




例子: 获取全部具有title属性的元素

var allElements, thisElement;
allElements = document.evaluate(
     '//*[@title]',
     document,
     null,
     XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
     null);
for (var i = 0; i < allElements.snapshotLength; i++) {
     thisElement = allElements.snapshotItem(i);
     switch (thisElement.nodeName.toUpperCase()) {
         case 'A':
             // this is a link, do something
             break;
         case 'IMG':
             // this is an image, do something else
             break;
         default:
             // do something with other kinds of HTML elements
     }
}




如果您已经引用了某个元素(例如上面的 thisElement),您就可以用 thisElement.nodeName 来替代它所对应的在   HTML 页面中的标签名称。如果被访问的这个页面是以 text/html 的方式被服务器执行, 那么标签名称总是用大写子母返回,不论它在原始页面是如何定义的。 如果页面是 application/xhtml+xml 方式的, 那么标签名称就会以小写子母返回。 不论哪种情况,我总是用   thisElement.nodeName.toUpperCase() 得到大写的标签名称。 


这是另外一个 XPath 查询,它返回了 div 中的一个特殊的类。


例子: 获取 div 中的 sponsoredlink 类

var allDivs, thisDiv;
allDivs = document.evaluate(
     "//div[@class='sponsoredlink']",
     document,
     null,
     XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
     null);
for (var i = 0; i < allDivs.snapshotLength; i++) {
     thisDiv = allDivs.snapshotItem(i);
     // do something with thisDiv
}

注意我在 XPath 查询语句外使用了双引号,这样在语句内部就可以使用单引号。


在 document.evaluate 函数中有很多参数。第二个参数 (在前两个例子中都是docoment) 可以是一个元素, XPath 查询只返回包含在这个元素内的元素。所以,如果您已经引用了一个元素(比如, 通过 document.getElementById 或者 通过   document.getElementsByTagName 得到的数组中的一个元素), 那么您就可以限制查询只返回这个元素的子元素。


第三个参数是对一个叫做 namespace resolver 函数的引用, 它只有在工作在 application/xhtml+xml 类型的页面上的用户脚本中是有效的。即使您对它不是很了解也没有关系,因为那种类型的页面不是很多,您可能一次也遇不到。如果您很想知道它是如何使用的,请参考   Mozilla XPath documentation (http://www-jcsu.jesus.cam.ac.uk/~jg307/mozilla/xpath-tutorial.html),那里解释了它的用法。


第四个参数是结果的返回方式。在前面的两个例子中都使用了 XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 它将结果以随机的方式返回。我使用的几乎全部都是这种方式,但是,出于某种原因,您想让结果以它们在页面上出现的顺序返回,您可以使用   XPathResult.ORDERED_NODE_SNAPSHOT_TYPE 这种方式。 Mozilla XPath documentation (http://www-jcsu.jesus.cam.ac.uk/~jg307/mozilla/xpath-tutorial.html)还给出了另外的一些用例。


第五个参数用来合并两次 XPath 查询的结果。 在获得第一次调用 document.evaluate 得到的结果之后,它将两次查询的结果一起返回。在前面的两个例子中,这个参数都用了null,这意味着我们只想获得本次查询的结果。


现在您明白了吗?XPath 既可以很简单,也可以很难,这取决于您要如何使用它。在此我强烈推荐您尽快去阅读 http://www.w3school.com.cn/xpath/xpath_syntax.asp,从而了解更多的 XPath 语法。至于 document.evaluate 函数的其它参数, 我几乎从来不使用它们。事实上,您可以自己定义一个函数来封装它们。


例子: 自定义的 xpath 函数

function xpath(query) {
     return document.evaluate(query, document, null,
         XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}


在定义了这个函数之后,您就可以调用 xpath('//a[@href]') 来获得某个页面上的全部链接, 或者调用 xpath('//* [@title]') 来获得具有 title 属性的元素。您仍然需要通过 snapshotItem 函数来访问结果中的每一项,这个函数的类型并不是一个规则的Javascript数组。
分享到:
评论

相关推荐

    准确找到DOM树的元素

    使用`document.evaluate()`方法结合XPath表达式来定位元素,如`var element = document.evaluate('//div[@id="myDiv"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue`。...

    XPath 教程 关于 XML语言解析

    var result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); var node = result.singleNodeValue; ``` 这段代码选取了作者为 "John Doe" 的第一个 "book" 元素。 三、...

    JavaScript

    var result = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null); var node = result.iterateNext(); while (node) { console.log(node.nodeName); node = result.iterateNext(); } ```...

    javascript XPath 实现

    `document.evaluate()`是JavaScript中用于执行XPath查询的关键方法。这个方法接收多个参数,包括XPath表达式、上下文节点、命名空间解析器(可选)、返回类型以及结果对象引用。查询结果可以是节点集、字符串、数字...

    js-xml.rar_javascript_javascript xml_js xml_js解析xml_xml js

    JavaScript提供了`document.evaluate()`方法来执行XPath表达式,返回一个`NodeList`,可以进一步遍历和操作节点。 6. E4X(ECMAScript for XML): 在一些旧的浏览器环境中,如Firefox,支持E4X,这是一种将XML...

    xpath-helper工具

    例如,`document.evaluate()`方法可以执行XPath查询,并返回一个迭代器,用于遍历匹配到的所有节点。此外,`document.createNSResolver()`可以创建命名空间解析器,处理包含命名空间的XML文档。 在提供的压缩包文件...

    ajax返回字符串

    var node = xmlDocument.evaluate('//' + nodeName, xmlDocument, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; ``` 至于标签中的“源码”和“工具”,这可能指的是实现上述功能时可能会...

    XML增删改查经典示例--.rar

    var title = document.evaluate("//book[@id='789']/title", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent; console.log(title); // 输出书名 ``` 3. **XML解析...

    JavaScript操作XML

    JavaScript中的`document.evaluate`方法可以执行XPath表达式,返回一个节点集或单一节点。 5. **jQuery和库的支持**:jQuery和其他JavaScript库(如Zepto、Dojo等)提供了简化XML操作的API。例如,jQuery的`$(xml)....

    prototype_PrototypeJS1.6_源码.zip

    8. **XPath支持**:PrototypeJS提供了对XPath查询的支持,通过`document.evaluate`可以执行XPath表达式,查找XML或HTML文档中的节点。 9. **浏览器兼容性**:PrototypeJS致力于跨浏览器兼容,通过抽象化不同浏览器...

    JavaScript与Xpath

    7. JavaScript 中的 XPath 应用:了解如何使用 `document.evaluate()` 或第三方库(如 xpath.js)来执行 XPath 查询。 在实际项目中,JavaScript 和 XPath 的结合可能涉及到网页自动化、数据抓取、页面元素的定位与...

    xsoup:当jsoup遇到XPath时

    Xsoup 基于Jsoup的XPath选择器。 开始使用: @Test public void testSelect() { ... " &lt;table&gt;&lt;tr&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;... evaluate(document) . get(); Assert . assertEquals

    第31章 XPath1

    在非IE浏览器中,通常使用`document.evaluate()`方法来执行XPath查询,这在W3C DOM Level 3中被定义。因此,为了确保代码的广泛兼容性,开发者可能需要使用不同的方法来处理不同浏览器环境中的XPath操作。

    xml.rar_javascript_javascript xml_xml javascript_xml文件

    XPath是一种在XML文档中查找信息的语言,JavaScript可以通过`document.evaluate()`来执行XPath查询。 9. **XML事件处理**: 在SAX解析中,可以注册事件监听器来处理如“开始元素”、“结束元素”等事件。 10. **...

    谷歌xpath插件

    - **动态内容处理**:在JavaScript中,可以使用XPath API(如`document.evaluate()`)来查找和操作XML或HTML文档中的动态内容。 总的来说,"谷歌xpath插件"为开发者和测试人员提供了一个强大的辅助工具,通过它,你...

    xPath(简单教程)

    例如,在JavaScript中,我们可以使用`document.evaluate()`方法来执行XPath表达式,选取XML或HTML文档中的特定节点。 学习XPath时,初学者应该从理解基本的路径表达式和节点类型开始,然后逐步掌握轴的概念、函数...

    JS中常用的xpath特性

    XPath,全称XML Path Language,是一种在XML文档中查找...例如,Internet Explorer支持`selectNodes()`和`selectSingleNode()`方法,而其他浏览器如Firefox、Chrome等则通常使用`document.evaluate()`来执行XPath查询。

    js实现对xml文件的解析

    JS可以通过`document.evaluate()`方法使用XPath表达式。 - XSLT(XSL Transformations)用于转换XML。虽然在纯JS中使用XSLT不太常见,但可以借助`xmldom`等库实现。 总结来说,JS解析XML文件涉及多种技术和方法,...

    Ajax 解析XML+json总结

    3. **XPath查询**:XPath是一种在XML文档中查找信息的语言,通过`document.evaluate()`方法可以选取XML节点,简化对XML数据的操作。 **三、解析JSON** 1. **JSON格式**:JSON是一种轻量级的数据交换格式,易于人...

Global site tag (gtag.js) - Google Analytics