2012-05-03 13 views
53

Mögliche Duplizieren:
How to iterate a table rows with JQuery and access some cell values?jQuery jede Schleife in Tabellenzeile

Ich habe so etwas wie:

<table id="tblOne"> 
      <tbody> 
       <tr> 
        <td> 
         <table id="tblTwo"> 
          <tbody> 
           <tr> 
            <td> 
             Items 
            </td> 
           </tr> 
           <tr> 
            <td> 
             Prod 
            </td> 
           </tr> 
          </tbody> 
         </table> 
        </td> 
       </tr> 
       <tr> 
        <td> 
         Item 1 
        </td> 
       </tr> 
       <tr> 
        <td> 
         Item 2 
        </td> 
       </tr> 
      </tbody> 
     </table> 

ich jQuery Schleife durch jede tr geschrieben haben wie :

$('#tblOne tr').each(function() {...code...}); 

Aber Problem ist, dass es durch die "tr" von "tblTwo" auch Schleifen, die ich nicht will. Kann jemand bitte etwas vorschlagen, um dies zu lösen?

Antwort

150

in jQuery verwenden nur

$('#tblOne > tbody > tr').each(function() {...code...}); 

die direkte Kinder Selektor (>) erhalten Sie unmittelbaren Nachfolger zu Fuß über (und nicht alle Abkömmlinge)


in VanillaJS Sie können Verwenden Sie document.querySelectorAll() und gehen Sie über die Zeilen mit forEach()

[].forEach.call(document.querySelectorAll('#tblOne > tbody > tr'), function(tr) { 
    /* console.log(tr); */ 
}); 
+13

@Raynos bitte erklären, statt "hit-and-running" ... –

+2

Wie verweise ich auf die tr Element innerhalb der Funktion? – jumxozizi

+1

@Rubiksmmo - verwenden Sie Funktion (Index, Element) - https://api.jquery.com/each/ – FrenkyB

18

Verwenden immediate children selector>:

$('#tblOne > tbody > tr') 

Beschreibung: Wählt alle direkte Elemente Kind spezifiziert durch "Kind" von Elemente von "Eltern" angegeben.

50

Nur eine Empfehlung:

Ich würde empfehlen, die DOM-Tabelle Implementierung verwenden, ist es sehr einfach und leicht zu bedienen, Sie jQuery wirklich nicht brauchen für diese Aufgabe.

var table = document.getElementById('tblOne'); 

var rowLength = table.rows.length; 

for(var i=0; i<rowLength; i+=1){ 
    var row = table.rows[i]; 

    //your code goes here, looping over every row. 
    //cells are accessed as easy 

    var cellLength = row.cells.length; 
    for(var y=0; y<cellLength; y+=1){ 
    var cell = row.cells[y]; 

    //do something with every cell here 
    } 
} 
+13

Ich stimme zu, dass jQuery ist oft nicht wirklich notwendig für diese Art von Aufgabe (vor allem auf neueren Browser mit '.querySelectorAll() ') Aber wenn Sie bereits jQuery einschließen, ist es eine Verschwendung, sie nicht zu benutzen (und DOM Lösung mit zwei' for' Schleife ist nicht so einfach, imho) – fcalderan

+0

Aber wenn Sie jQuery bereits dann einschließen, tun Sie es falsch und brauchen um es zu entfernen ASAP – Raynos

+0

*** mit *** jQuery hat auch Konsequenzen. $() führt etwa 100 Dinge aus, bevor es tatsächlich Ihr Element anhand seiner ID (als Beispiel) auswählt. Ich sage nicht, benutze es nicht ... aber für triviale Dinge wie diese, wo die Vanille-js-Lösung wie ein paar Zeichen mehr ist, schreibst du bei der Verarbeitung. wenn auch nicht viel ... aber warum 10 000/Sekunde, wenn Sie 10 000 000 tun können ... macht nur Sinn nein? – rlemon