如何使用标准javascript方法选择节点数组
How to select a array of nodes using standard javascript methods
我有一个元素数组,我想从列表中检索,我无法更改元素,我通常使用jQuery,调用将是:
$("//div/ol/li/h3/a");
然而,我无法就此起诉jquery或其他选择器框架,应该如何做到这一点。
注意://div/ol/li/h3/a
似乎是一个XPath表达式,jQuery afaik不再支持它。
如果您的目标浏览器支持它,您可以简单地使用querySelectorAll
[MDN]:
var links = document.querySelectorAll('div > ol > li > h3 > a');
否则,直接转换为:
// root is the element you start with, e.g. `document.body`
var selector = ['ol', 'li', 'h3', 'a'],
set = root.getElementsByTagName('div');
for(var i = 0, len = selector.length; i < len; i++) {
var tag = selector[i],
new_set = [];
for(var j = 0, lenj = set.length; j < lenj; j++) {
for(var child = set[j].firstChild; child; child.nextSibling) {
if(child.nodeName.toLowerCase() === tag) {
new_set.append(child);
}
}
}
set = new_set;
}
最后,set
将包含所有链接。如果提供了更多关于HTML结构的信息,也可以编写递归函数或简化代码。
根据我对您问题的理解,您希望在一个数组中从文档中获得所有div、ol、li、h3或a元素,而不依赖于任何javascript框架。
我想我会做这样的事。
http://jsfiddle.net/UP3nH/
更新
@Felix Kling指出,OP试图在问题中使用XPath选择器(这在JQuery的最新版本中已被弃用)
要创建一个与XPath查询//div/ol/li/h3/a
匹配的元素数组,可以执行此操作。
var tags = ['ol', 'li', 'h3', 'a'];
var result = [];
var leafs = document.getElementsByTagName(tags[tags.length - 1]);
for (var i = 0; i < leafs.length; i++) {
var a = leafs[i],
j = (tags.length - 1);
while (a && a.nodeName.toLowerCase() == tags[j].toLowerCase()) {
j--;
a = a.parentNode;
if (j < 0) {
result.push(leafs[i]);
break;
}
}
}
console.log(result);
相关文章:
- d3基于用户选择动态更新节点
- 选择<李>使用普通JavaScript的子节点,而不是孙节点
- XPath以基于另一个节点按位置选择节点's的位置
- 从 d3.js 中的树中选择节点的子节点
- Dynatree.js如何使用dyna.js在html中选择节点
- 地集.Tree + JsonRestStore - 使用 tree.set(“path”) 以编程方式选择节点
- 按属性从子节点中选择节点
- 如何在动态树中选择节点
- ngjstree:自动选择节点时出错
- JSNI (GWT-GWTP):jQuery在就绪事件触发后不会在“文档就绪”函数中选择节点
- 花式树jQuery插件 - 选择节点
- 在角度IVH树视图中选择节点时检查所有父节点
- 在d3中多次选择节点强制布局
- jstree:通过id选择节点
- 如何在ie8 +中从对象中选择节点,然后将这些节点重新定位到我的文档中?
- 根据下一级节点的文本选择节点
- 如何在spring .js中选择节点?
- jsTree:刷新后如何选择节点
- Parsehub选择节点语法
- 我如何在聚合物中选择节点而不使用ID