Javascript HTMLCollection Объект не работает должным образом в Firefox10 - PullRequest
2 голосов
/ 03 февраля 2012

Я использовал объект коллекции HTML в качестве массива и добавлял в него элементы.Приведенный ниже код,

var claimantEmailValues = document.getElementsByName("claimantEmails");
var defendantEmailValues = document.getElementsByName("defendantEmails");


var k = defendantEmailValues.length;
for(var i=0; i<claimantEmailValues.length;i++){
        defendantEmailValues[k++] = claimantEmailValues[i];
}

В конце длина defendantEmailValues должна быть 4, поскольку у меня есть два элемента ввода HTML каждый для claimantEmails и defendantEmails.Вместо этого длина равна 2, и ошибок не было.Он хорошо работает во всех версиях Firefox, кроме Firefox 10. Можете ли вы объяснить, почему?

1 Ответ

3 голосов
/ 03 февраля 2012

Массивы JavaScript - это объекты со свойством magic length, которое увеличивается, когда вы устанавливаете числовое свойство, равное или превышающее текущую длину. HTMLCollection объекты имеют свойство длины, но оно не является магическим и не должно увеличиваться при установке числового свойства. Когда вы добавляете к ним элемент, вы просто добавляете именованное свойство к объекту, используя число в качестве имени свойства.

Вам лучше сначала преобразовать коллекции в массивы, используя Array.prototype.slice:

var slice = Array.prototype.slice,
    claimantEmailValues = slice.call(document.getElementsByName("claimantEmails")),
    defendantEmailValues = slice.call(document.getElementsByName("defendantEmails"));

var k = defendantEmailValues.length;
for(var i=0; i<claimantEmailValues.length;i++){
        defendantEmailValues[k++] = claimantEmailValues[i];
}

Вероятно, поведение предыдущих версий Firefox неправильно разрешало добавление элементов в HTMLCollection экземпляры, и ошибка была только что исправлена ​​в Firefox 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...