Добавление атрибута имени приводит к тому, что значение идентификатора становится свойством объекта документа в IE и Opera? - PullRequest
4 голосов
/ 30 сентября 2011

Рассмотрим этот исходный код HTML:

<form id="foo1" name="x"> Form 1 </form>
<form id="foo2"> Form 2 </form>

Как видите, мы определяем два элемента FORM.

В Chrome, Safari и Firefox, оба document.foo1 и document.foo2возврат undefined.

Однако в IE и Opera document.foo1 возвращает ссылку на соответствующий элемент FORM, тогда как document.foo2 возвращает undefined.

Live demo: http://jsfiddle.net/zrmEm/2/

Итак, первая форма имеет свое свойство ID-named в объекте документа, а вторая форма - нет.И это различие является результатом добавления атрибута name к первой форме.

Теперь, где в этом логика?Это известное поведение?

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Это, по сути, странная вещь, которую Microsoft представила еще в мрачные дни войн браузеров.(около IE4)

Конечным результатом является то, что в IE формы будут добавляться как переменные в область видимости документа, чтобы вы могли ссылаться на них как document.form1.

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

Многие из нестандартных функций, которые были добавлены в тот или иной браузер в то время, оказалисьвнедрены другими, стали стандартами де-факто и в конечном итоге превратились в официальные стандарты.

Эта особенность, однако, не была.Он остается нестандартным.

Microsoft сохранила большую часть своей старой нестандартной функциональности даже в более новых версиях своего браузера, стремясь сохранить обратную совместимость для старого кода (многие корпоративные интрасети были написаны Microsoft-обученные «эксперты» и используют эти функции, поэтому им нужно их сохранить, иначе никто не сможет обновить IE6).

В те времена Opera была молодым претендентом в мире браузеров.Он часто обновлялся, имел инновационные функции и работал намного быстрее, чем конкуренты.Тогда они делали для мира браузеров то, что Chrome делал совсем недавно.

Однако из-за обостряющейся войны за стандарты Opera могла конкурировать только благодаря совместимости, и они пошли на многое, чтобы повернуть вспять-инжиниринг всех функций (и даже в некоторых случаях ошибок) в IE, чтобы сайты, написанные для IE, также работали в Opera.

Это явно было одной из этих функций, и именно поэтому IE и Opera обаразделяют ту же причуду сегодня.

Другие браузеры, представленные сегодня на рынке, не имеют такой же истории.Firefox, в конечном счете, является производным от Netscape Navigator, поэтому, хотя у него могут быть свои причуды, относящиеся к тем временам, но он не разделяет IE.И браузеры веб-наборов имеют гораздо более недавнее происхождение (оно происходит от движка KHTML проекта KDE), поэтому, опять же, у него никогда не было истории, в которой он пытался эмулировать причуды IE.

1 голос
/ 30 сентября 2011

Во всех браузерах значение атрибута name формы добавляется как свойство объекта документа, а также как свойство коллекции document.forms .

Если вы используете идентификаторы, значения добавляются только как свойства форм коллекции.

IE всегда был в замешательстве относительно атрибутов name и id. В IE (проверенная версия 8) к идентификатору добавляется свойство документа только , если есть также имя для этой формы (оно может совпадать или отличаться от идентификатора).

Так что, если вы всегда используете document.forms ['name-or-id'] , тогда жизнь сладка. Пока у вас нет форм с именами, которые совпадают с другими формами с идентификаторами, все ставки отменены.

...