2010-06-16 2 views
3

Я получаю самые странные проблемы с Javascript в Firefox сегодня.Javascript getElementsByTagName сломанный firefox?

Я пытаюсь манипулировать некоторыми строками таблицы, но .getElementsByTagName("tr"); отбрасывает барахл.

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; 

Незначительная часть, конечно, является моим временным взломом, чтобы исправить ошибку. По какой-то причине .getElementsByTagName("tr") оттягивает некоторые функции.

В противном случае предупреждение выше выглядит примерно так: «TR TR TR TR undefined undefined undefined».

код Я хотел было что-то вроде этого

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

Но тогда bodyrows не содержит только <tr> элементов, то есть вышеупомянутый мусор в нем.

Любые мысли?

EDIT: Если я просто использую второй блок кода, я получаю список из 24 элементов на столе, который имеет 21 строку таблицы (три элемента). Первый блок кода - это просто хак, который исправляет проблему.

Если изменить оповещение alert(row) я получаю:

[object HTMLTableRowElement] 
... 

function item() { 
    [native code] 
} 

21 

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

Какой "мусор"? – JAB

+0

Можете ли вы разместить HTML-код? –

ответ

8

for-in оператор перечисляя также item и namedItem методы присутствуют на HTMLCollection что getElementsByTagName возвращается.

Для итерации над массивом элементами типа как DOM Collections, простой последовательный цикл всегда рекомендую, то for...in заявления предназначаются, чтобы использоваться для перечисления свойств объекта.

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; 

Вы не должны использовать for..in с массивов как объектов, так как:

  • Порядок итерации не гарантируется, что индексы массива могут не побывал в числовом порядке.
  • Унаследованные свойства также перечислены (это может быть еще одним источником проблем).

Рекомендуемая статья:

+1

+1 ровно на 5 секунд быстрее. – MvanGeest

+0

Перечисление не является проблемой, проблема существует до того, как произойдет перечисление –

+0

@Sheldon, 'for-in' перечисляет также методы' item' и 'namedItem' из [HTMLCollections] (http://www.w3.org/ TR/DOM-Level-2-HTML/HTML.html # ID-75708506) – CMS

Смежные вопросы