jquery: select parent-Elemente außer...

N

Netzwerkidi

Hi,

wie selektiere ich denn mit jQuery Teile des Parent-Elements? Hier das Testscript:

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns='http://www.w3.org/1999/xhtml'>
  <head>  
    <title></title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta http-equiv='Content-Language' content='de-DE' />  
    <script src="http://code.jquery.com/jquery-latest.js"></script>
  </head>
  <body>
    <div>div1
      <script> // </script> 
      <style> /* */ </style>  
      <div>div1.1
      </div>         
      <div class="divClass">div1.2
      </div>  
    </div>
    <div>div2
    </div>
    <script>
      // Ist: gesamten div1-Inhalt
      alert($('div .divClass').parent().html());
      // SOLL: Wie Ist, aber ohne das Script
      alert($('div .divClass').parent().html());
      // SOLL: Wie Ist, aber ohne das Stylesheet
      alert($('div .divClass').parent().html());      
     </script> 
  </body>
</html>

Grüße

Idi
 
Hi,

vielleicht ist die filter-Methode das richtige für dich:
Code:
$('div .divClass')
  .parent()
  .clone()
    .find('*')
      .filter(function(){
        return this.tagName.toLowerCase() == 'script'; // Hier der Name des Tags, das herausgefiltert werden soll
      })
      .remove()
    .end()
  .end()
  .html()
Ciao
Quaese
 
Hi Quaese,

manchmal staune ich, dass auf den ersten Blick einfache Dinge mit jQuery für meine Begriffe ein wenig sperrig zu lösen sind.

Ich habe mal die Zeit ermittelt für jQuery-Filter und eine Alternative (innerHTML-Replace). Interessant zumindest.

Merci.

Code:
      var variante = 1, // 1=innerHTML replace, 2=jQuery filter
      i=1000, // Anzahl Durchläufe
      c = $('div .divClass').parent().html().replace('divClass','aClass'), // Clonestring
      _c ="";
      while(i>0) {
        _c+=c;
        i--;
      }
      $('div:first').prepend(_c);
      if (variante===1){
      var d1 = new Date(), t1= d1.getTime();
      var t = document.getElementsByTagName('div'), l=t.length;
      for (var i=1;i<l;i++) {
        if (t[i].className=='divClass') {
        var p = t[i].parentNode.innerHTML;
          p = p.substr(0,p.indexOf('<SCRIPT>')) + p.substr(p.indexOf('<\/SCRIPT>')+10);
        }
      }
      var d2 = new Date(), t2= d2.getTime();   
      $('div:first').prepend("INNERHTML: "+(t2-t1)+ " / "+p);
      } else { 
      var d1 = new Date(), t1= d1.getTime();
      var p = $('div .divClass')
        .parent()
          .clone()
            .find('*')
              .filter(function(){
                return this.tagName.toLowerCase() == 'script'; // Hier der Name des Tags, das herausgefiltert werden soll
              })
            .remove()
          .end()
        .end()
       .html();
      var d2 = new Date(), t2= d2.getTime();
      $('div:first').prepend("JQUERY FILTER: "+(t2-t1)+ " / "+p);
      }
 
Zuletzt bearbeitet von einem Moderator:
Hi Quaese,

manchmal staune ich, dass auf den ersten Blick einfache Dinge mit jQuery für meine Begriffe ein wenig sperrig zu lösen sind.

Ich habe mal die Zeit ermittelt für jQuery-Filter und eine Alternative (innerHTML-Replace). Interessant zumindest.

Merci.

Bei deinem Test solltest du bedenken, daß das überschreiben von Knoten mit innerHTML Ursache von Speicherlecks sein kann. $.remove() mag da länger dauern, aber es tut auch mehr(entfernt bspw. Event-Handler, welche häufige Ursache für Speicherlecks sind)
 
Ok, das sind Argumente.

@Quaese: warum ist das Clone da drin?
Es klappt ja auch ohne, aber es wird einen Sinn haben...
Ok, hat sich erledigt.
Antwort: weil ich sonst im Originalbaum rummache.
 
Zuletzt bearbeitet von einem Moderator:
Ein bisschen was kann man da schon noch optimieren.

Javascript:
$('div .divClass').parent().clone().find('*').remove('script').end().html();
 
"...manchmal staune ich, dass auf den ersten Blick einfache Dinge mit jQuery für meine Begriffe ein wenig sperrig zu lösen sind..."

Habe ich das wirklich gesagt? Nie!
 
Zurück