0

Ich versuche, ein oder mehrere Elemente auszuwählen, die NICHT von einem anderen spezifischen Element abstammen.Elemente außerhalb eines anderen spezifischen Elements auswählen

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

Im Beispiel oben ich alle wählenden ‚i‘ Elemente, die nicht innerhalb DIV-Elemente sind. Andersherum wäre es einfach, mit ('div i'), aber dies in: not() ist nicht möglich.

Wie kann ich alle i Elemente außerhalb von div Elementen auswählen? Oft ist es die Verwendung von jQuery, vorgeschlagen, die aussehen würde:

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

ich jQuery verwenden könnte nicht jqLite, sondern verwenden - Funktion - jqLite kein nicht() hat. Eine jqLite Lösung ist auch willkommen! Ist es möglich, dies ohne wiederholte Iterationen und Vergleiche zu tun?

Edit: Um klarzustellen, ich möchte keine div-Vorfahren für meine i-Elemente haben, nicht nur keine direkten Div-Eltern.

Eine vergleichbare XPath würde wie folgt aussehen:

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

'document.querySelectorAll ('body: nicht (div) i')

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

Sie sie dann durch den Index bekommen' – putvande

+0

@ putvande Bitte fügen Sie Ihren Kommentar als Antwort hinzu, damit OP sie hoffentlich akzeptiert. – JeffC

+0

Diese Antwort hat nicht funktioniert. Es gibt wählen Sie mich nicht und wählen Sie mich auch. Es sieht gut aus, wenn man darüber nachdenkt (Körper auswählen, alle Elemente auswählen, die NICHT div sind, und dann i-Elemente greifen), aber es funktioniert nicht (das ist, wo meine Probleme von vornherein kommen). Während ich diesen Teil meines Projekts für später beiseite gelegt habe, habe ich diese Frage nicht aufgegeben. :) Immer noch auf der Suche nach einer Antwort. – Peter1807

Antwort

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

für den speziellen Fall von Ihnen;

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

einfach können Sie Klasse allen TEG-Element geben i und dann getByClass Name

don't select me

don't select me either
wählen Sie mich wählen Sie mich zu damon

-2

eine Klasse alle der <i> Tags hinzufügen ("itag", zum Beispiel). Von dort können Sie sie abholen von getElementsByClassName Aufruf:

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

Im Allgemeinen können die Leute nicht nur die Website bearbeiten und Tags hinzufügen, so dass dies keine tragfähige Antwort ist. – JeffC

Verwandte Themen