选择其他特定元素之外的元素

时间:2016-06-13 11:46:49

标签: javascript angularjs selenium-webdriver css-selectors jqlite

我试图选择一个或多个不是另一个特定元素后代的元素。

<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,但可以使用jqLit​​e - jqLit​​e没有not() - 函数。欢迎使用jqLit​​e解决方案! 没有重复的迭代和比较,是否可以做到这一点?

编辑:为了澄清,我不希望我的i元素有任何div-ancestors,不仅没有直接的div-parent。

类似的XPath看起来像这样:

//i[not(ancestor::div)]

2 个答案:

答案 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