Javascript getElementsByTagName сломанный Firefox? - PullRequest
3 голосов
/ 16 июня 2010

Сегодня у меня возникают самые странные проблемы с Javascript в 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> элементов, в нем есть вышеупомянутый мусор.

Есть мысли?

РЕДАКТИРОВАТЬ: Если я просто использую второй блок кода, я получаю список длиной 24 элемента в таблице, которая имеет 21 строку таблицы (элементов tr).Первый блок кода - это просто взлом, который решает проблему.

Если я изменил предупреждение на alert(row), я получу:

[object HTMLTableRowElement]
...

function item() {
    [native code]
}

21

function namedItem() {
    [native code]
}

1 Ответ

8 голосов
/ 16 июня 2010

Оператор 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;

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

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

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

...