Что делает эта единственная строка кода? var foo = documentGetElementById (form_name) .elements; - PullRequest
0 голосов
/ 15 февраля 2012

Примечание: для IE8 и IE9 они разные.

   var foo = documentGetElementById( form_name ).elements;

В IE 9 foo получает массив элементов, которые содержат значения, которые пользователь отправил, чтобы их можно было перебирать следующим образом.

for ( index in foo )
{
    if( foo[index].value === 'element_value' ) 
    {
        return 1;
    }
}

В IE 8 я не знаю, что в нем есть.Но я больше не могу перебирать элементы для извлечения пользовательского ввода из формы.Отладчик IE 8 сообщает, что foo[element] равен NULL или не является объектом.

В обоих случаях я не знаю, что он должен делать (в отличие от того, что он фактически делает).

1 Ответ

2 голосов
/ 15 февраля 2012

Не используйте for ... in для таких циклов. Вместо этого:

    for (var index = 0; index < foo.length; ++index) {
      if (foo[index].value === 'whatever') { return 1; }
    }

Форма цикла for ... in предназначена для просмотра свойств объекта. То, что у вас здесь есть, это действительно объект, но, что более важно, он действует как массив. (Это на самом деле NodeList HTMLCollection, но для обхода контента его можно рассматривать как массив.) Преимущество итерации по числовому индексу состоит в том, что вы избегаете споткнуться со свойствами объекта, которые на самом деле не являются частью его концептуального содержания.

Ваша другая проблема заключалась в использовании «элемента» в этом выражении индексации; Я не знаю, что такое "элемент" / был, но вы хотите использовать переменную итератора.

изменить & mdash; Разница между тем, что я считаю «элементами» (NodeList) и тем, чем он является (HTMLCollection), заключается в том, что API коллекции имеет как фасад с числовым индексированием, так и фасад с индексированным именем. Дело в том, что если вы каким-то образом знаете имена, внешние по отношению к форме, то метод доступа по имени имеет смысл. Тем не менее, с тем, что вы делаете, я бы все еще использовал числовой итератор, потому что в противном случае все становится немного грязным (для меня). Может быть, я просто слишком параноик, поэтому, возможно, кто-то с большим пониманием прокомментирует или ответит. На мой взгляд, способ, которым браузеры делают определения IDL из спецификации DOM в JavaScript, является областью некоторой ненормальности.

...