0

我想選擇一個或多個不是另一個特定元素的後代的元素。在另一個特定元素之外選擇元素

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

在上面的例子我想選擇所有的「i」的元素,是div元素內不。 其他方法很容易,('div i'),但是在not()中使用它是不可能的。

如何選擇div元素之外的所有i元素? 往往是建議使用jQuery的,這將是這樣的:

nondiv_i = all_i.not(all_div.find("i")) 

我不能使用jQuery,但可以使用jqLit​​e - jqLit​​e沒有一個不是() - 功能。 jqLit​​e解決方案也是受歡迎的! 有沒有可能做到這一點沒有重複的迭代和比較?

編輯:爲了澄清,我不想爲我的i元素有任何div-ancestors,不僅沒有直接的div父母。

一個可比的XPath應該是這樣的:

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

'document.querySelectorAll(的身體:不(DIV)I')

var r = document.getElementsByClassName("itag"); console.log("length" + r.length); 

然後,您可以索引讓他們' – putvande

+0

@ putvande請添加您的評論作爲答案,以便OP有望接受它。 – JeffC

+0

此答案無效。它返回不要選擇我也請選我。它在思考時看起來很好(選擇body,選擇所有不是div的元素,然後抓取i-elements),但它不起作用(這是我的問題首先出現的地方)。雖然我把這部分項目放在一邊,但我還沒有放棄這個問題。 :)仍在尋找答案。 – Peter1807

回答

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]); 
    } 

} 
+0

簡單,你可以對所有給類我TEG元素,然後getByClass名

don't select me

don't select me either
選擇我 選擇我太 damon

-2

爲所有的<i>標記(例如「itag」)添加一個類。從那裏,你可以通過調用getElementsByClassName獲取它們:

console.log(r[0]); 
console.log(r[1].innerHTML); // get text of i tag 
+1

通常人們不能只編輯網站並添加標籤,因此這不是一個可行的答案。 – JeffC