我试图选择一个或多个不是另一个特定元素后代的元素。
<html>
<body>
<div>
<p>
<b>
<i> don't select me </i>
</b>
</p>
</div>
<div>
<i>don't select me either </i>
</div>
<i> select me </i>
<b>
<i> select me too </i>
</b>
</body>
</html>
在上面的例子中,我想选择div元素中不的所有'i'元素。 另一种方式是简单的,使用('div i'),但是使用它:not()是不可能的。
如何选择div元素之外的所有i元素? 通常建议使用jQuery,如:
nondiv_i = all_i.not(all_div.find("i"))
我不能使用jQuery,但可以使用jqLite - jqLite没有not() - 函数。欢迎使用jqLite解决方案! 没有重复的迭代和比较,是否可以做到这一点?
编辑:为了澄清,我不希望我的i元素有任何div-ancestors,不仅没有直接的div-parent。
类似的XPath看起来像这样:
//i[not(ancestor::div)]
答案 0 :(得分:0)
function isDescendant(parent, child) {
var all = parent.getElementsByTagName(child.tagName);
for (var i = -1, l = all.length; ++i < l;) {
if(all[i]==child){
return true;
}
}
return false;
}
针对您的具体情况;
is = document.getElementsByTagName("i");
divs = document.getElementsByTagName("div");
nondivs = [];
var contains;
for(i=0;i<is.length;i++){
contains = false;
for(j=0;j<divs.length;j++){
if(isDescendant(divs[j],is[i])){
contains = true;
j = divs.length;
}
}
if(!contains){
nondivs.push(is[i]);
}
}
答案 1 :(得分:-2)
为所有<i>
标记添加一个类(例如,“itag”)。从那里,您可以通过拨打getElementsByClassName
:
var r = document.getElementsByClassName("itag");
console.log("length" + r.length);
然后您可以通过索引获取它们:
console.log(r[0]);
console.log(r[1].innerHTML); // get text of i tag