2010-06-16 15 views
3

Je reçois les problèmes les plus bizarres avec Javascript dans Firefox aujourd'hui.Javascript getElementsByTagName broken firefox?

J'essaie de manipuler certaines lignes de la table, mais .getElementsByTagName("tr"); est en train de retirer des déchets.

dynamicTable.tableBody = dynamicTable.getElementsByTagName("tbody")[0]; 
var tableRows = dynamicTable.tableBody.getElementsByTagName("TR"); 
var actualTableRows = new Array(); 
for(var i in tableRows) { 
    var row = tableRows[i]; 
    alert(row.tagName); 
    if(row.tagName == "TR"){ 
     actualTableRows.push(row); 
    } 
} 
dynamicTable.bodyRows = actualTableRows; 

La partie curieuse est bien sûr mon hack temporaire pour corriger l'erreur. Pour certaines raisons .getElementsByTagName("tr") tire également certaines fonctions. Incidemment, l'alerte ci-dessus va quelque chose comme "TR TR TR TR undefined undefined undefined".

Le code que je voulais était quelque chose comme ça

dynamicTable.bodyRows = dynamicTable.tableBody.getElementsByTagName("tr"); 

Mais bodyrows ne contient pas seulement <tr> éléments, il a la camelote ci-dessus en elle.

Des pensées?

EDIT: Si j'utilise simplement le deuxième bloc de code, j'obtiens une liste de 24 éléments sur une table qui a 21 lignes de table (éléments tr). Le premier bloc de code est juste un hack qui résout le problème.

Si je change l'alerte alert(row) je reçois:

[object HTMLTableRowElement] 
... 

function item() { 
    [native code] 
} 

21 

function namedItem() { 
    [native code] 
} 
+0

Quel genre de "junk"? – JAB

+0

Pouvez-vous poster le code HTML? –

Répondre

8

La déclaration for-in est énumérait également les méthodes item et namedItem présents sur les HTMLCollection que getElementsByTagName retours.

Pour itérer sur des éléments ressemblant à un tableau comme collections DOM, une boucle séquentielle simple, est toujours recommander, la déclaration for...in est destiné à être utilisé pour énumérer propriétés d'objet.

dynamicTable.tableBody = dynamicTable.getElementsByTagName("tbody")[0]; 
var tableRows = dynamicTable.tableBody.getElementsByTagName("TR"); 
var actualTableRows = new Array(); 
for(var i = 0, n = tableRows.length; i < n; i++) { // <---- simple for loop 
    var row = tableRows[i]; 
    alert(row.tagName); 
    if(row.tagName == "TR"){ 
     actualTableRows.push(row); 
    } 
} 
dynamicTable.bodyRows = actualTableRows; 

Vous ne devriez pas utiliser for..in avec des objets ressemblant à un tableau parce que:

  • L'ordre d'itération est pas garantie, les indices de tableau peuvent ne pas visités dans l'ordre numérique.
  • Les propriétés héritées sont également énumérées (cela peut être une autre source de problèmes).

article recommandé:

+1

+1 exactement 5 secondes plus vite. – MvanGeest

+0

L'énumération n'est pas le problème que le problème existe avant l'énumération –

+0

@Sheldon, 'for-in' énumère également les méthodes' item' et 'namedItem' de [HTMLCollections] (http://www.w3.org/ TR/DOM-Niveau-2-HTML/html.html # ID-75708506) – CMS