javascript - 访问深度嵌套 DOM 节点的智能方法

标签 javascript dom xpath

我即将为 Google Chrome 浏览器编写一个扩展程序。这是一个更改表格宽度的内容脚本。这是上述表的 XPath:

/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[3]

/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[3]/fieldset/div[1]/div[2]
/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[3]/fieldset/div[2]/div[2]
/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[3]/fieldset/div[3]/div[2]

遗憾的是,无法使用 getElementByIdgetElementsByName 或类似方法访问该表。我找到了以下解决方案:

document.getElement("body").childNodes[7].childNodes[1].childNodes[0].childNodes[3].childNodes[9].childNodes[1].childNodes[0].childNodes[5].width=500

document.getElement("body").childNodes[7].childNodes[1].childNodes[0].childNodes[3].childNodes[9].childNodes[1].childNodes[0].childNodes[5].childNodes[3].childNodes[3].childNodes[3].style.width="300px"
document.getElement("body").childNodes[7].childNodes[1].childNodes[0].childNodes[3].childNodes[9].childNodes[1].childNodes[0].childNodes[5].childNodes[3].childNodes[7].childNodes[3].style.width="300px"
document.getElement("body").childNodes[7].childNodes[1].childNodes[0].childNodes[3].childNodes[9].childNodes[1].childNodes[0].childNodes[5].childNodes[3].childNodes[5].childNodes[3].style.width="350px"

虽然这个解决方案有效,但我对此并不满意。有更聪明的方法吗?

最佳答案

Chrome 支持 document.evaluate 函数,可以通过 XPath 选择元素。

签名:

var xpathResult = document.evaluate(
 xpathExpression, 
 contextNode, 
 namespaceResolver, 
 resultType, 
 result
);

在你的情况下,这将是

var expr = "/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[3]";
var td = document.evaluate(expr, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

您还可以使用 XPathResult.UNORDERED_NODE_ITERATOR_TYPE 通过迭代器获取节点列表。

编辑:您还可以使用将 XPath 转换为 CSS3 选择器并使用 document.querySelector:

var expr = "body > table > tbody > tr > td > table:nth-of-type(2) > tbody > tr > td:nth-of-type(3)";
var td = document.querySelector(expr);

关于javascript - 访问深度嵌套 DOM 节点的智能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23686108/

相关文章:

javascript - 当连接速度较慢时,缓存 list 会减慢应用程序的速度

javascript - 将部分应用的函数暴露给应用程序

javascript - 将实时音频流式传输到 Node.js 服务器

javascript - 处理 Javascript 中的内存膨胀

java - 如何从表中获取属性

XPath:将函数应用于所有匹配项?

javascript - onclick 或内联脚本在扩展中不起作用

javascript - 使用 JQuery 编辑特定 DOM 元素上的数据属性

xml - XSL 转换后删除空元素

java - 如何为启用的项目编写 xpath