我无法让选择器正常工作。
我有这个HTML:
<div.wrapper>
<div.ui-controlgroup-controls>
<form>
<div.ui-btn></div>
</form>
<div.ui-btn></div>
<div.ui-btn></div>
<div.ui-btn></div>
<div.ui-btn></div>
</div>
</div>
并且我正在尝试选择div
这些ui-controlgroup-controls
的子项,这意味着排除表单中的内容。
这就是我正在尝试的:
// el is my div.wrapper element
el.children[0].getElementsByTagName("div");
但是这不起作用,因为表单中的div最终会出现在选择中。
问题:
当我不想使用jQuery时,如何正确选择元素?
答案 0 :(得分:4)
执行此操作的一种方法是迭代生成的节点列表并检查父级:
var nodes = el.children[0].getElementsByTagName("div");
nodes = Array.prototype.slice.call(nodes);
nodes = nodes.filter(function(v, i){
return v.parentElement === el.children[0];
});
以下是此方法的演示:http://jsfiddle.net/WLhY2/
更简单(尽管效率较低)的方法是使用querySelectorAll
使用选择器表达式检索相关节点:
var divs = document.querySelectorAll('div.ui-controlgroup-controls > div')
答案 1 :(得分:2)
对于支持querySelectorAll的浏览器:
var divs = el.children[0].querySelectorAll("div");
对于支持在NodeList上使用slice的浏览器(例如,不是IE,至少不是IE&lt; 9):
var slice = Function.call.bind(Array.prototype.slice);
var divs = slice(el.children[0].children).filter(function(node) {
return node.tagName === "DIV"
});
对于既不支持的浏览器:
var nodes = el.children[0].children;
var divs = [];
for (var l = nodes.length, node; node = nodes[--l];) {
if (node.tagName === "DIV")
divs.push(node);
}
答案 2 :(得分:1)
在大多数浏览器中,您可以执行以下操作:
el.querySelectorAll(".ui-controlgroup-controls > div")
但如果你想避免更深层次的嵌套".ui-controlgroup-controls"
,这可能会产生误报。
如果是这种情况,只需迭代.children
,并构建一组嵌套的div。
var divs = [];
for (var i = 0, len = el.children.length; i < len; i++) {
if (el.children[i].classname === "ui-controlgroup-controls") {
for (var j = 0, lenj = el.children[i].children.length; j <, lenj; j++) {
if (el.children[i].children[j].nodeName === "DIV") {
divs.push(el.children[i].children[j])
}
}
}
}
如果已知您只有一个ui-controlgroup-controls
元素,则可以摆脱外部循环,只需使用children[0]
。
var divs = [];
for (var j = 0, lenj = el.children[0].children.length; j <, lenj; j++)
if (el.children[0].children[j].nodeName === "DIV")
divs.push(el.children[o].children[j])
答案 3 :(得分:0)
<your-element>.querySelectorAll(":scope > div");
:scope
是表示父元素的伪类。在IE中没有支持,但有一个shim。