Я провожу большую часть своего времени в эти дни, работая над готовящимся Справочником по Ultimate JavaScript SitePoint, и я могу честно сказать, что это мой мозг .
В отличие от авторов предстоящего Ultimate CSS Reference , у меня не было особого желания быть милым с Internet Explorer. И я знал, что столкнусь с ошибками и причудами, ни одна из которых не будет отличаться в IE7 , потому что DOM просто не был на радаре разработки для этой версии.
Тем не менее, я был просто поражен тем хаотическим разломом, который проявляется в реализации даже самых простых вещей.
Возможно, вы помните, не так давно, что я писал о поведении атрибутов href
в Internet Explorer и о том, что для ссылок они возвращаются как квалифицированные URI, а не как буквальные значения атрибутов. Но, о боже … это верхушка айсберга, когда дело доходит до getAttribute()
…
Вы бы не подумали, что это так сложно
В дополнение к определению значения атрибутов href
в ссылках, IE делает то же самое для атрибута src
изображений.
При получении атрибута стиля
IE возвращает объект style
, а не значение атрибута. Получая атрибут обработки события, такой как onclick
, он возвращает содержимое обработчика события, заключенного в анонимную функцию. Получив значение атрибута, которое оценивается как логическое значение true
(например, отключено
или отмечено
, когда оно определено), он возвращает логическое значение, а извлекает
значение, которое оценивается как число (например, tabindex
), он возвращает число. Все эти значения должны быть возвращены в виде строк.
Но эти атрибуты рассматриваются IE как нестроковые значения; и поэтому, если они вообще не определены, они возвращают null
, а не пустую строку. IE также возвращает null
для неопределенных атрибутов, которые он не распознает ( т . Е. Имена пользовательских атрибутов).
В свою защиту другие неопределенные, но известные атрибуты правильно возвращают пустую строку, которая соответствует спецификации; и IE фактически единственный браузер, который делает это (Firefox, Opera и Safari все возвращают null
). Но это не очень хорошая защита, потому что он делает это только для атрибутов, которые он распознает — так что он на самом деле не реализуется в спецификации, он просто оказывается правильным!
Чистый класс
Чтобы получить атрибут класса
в Internet Explorer, вы должны обратиться к нему как className
; чтобы получить атрибут for,
вы должны обратиться к нему как htmlFor
:
//these work in IE, null in others element.getAttribute('className'); element.getAttribute('htmlFor');
Теперь это побочный эффект сопоставления атрибутов со свойствами HTML DOM — например, как свойство DOM вы всегда должны ссылаться на element.className,
а не element.class
, потому что class
является зарезервированным словом в JavaScript. Но в то время как другие браузеры согласовывают это, позволяя строковым значениям getAttribute()
использовать исходное имя атрибута, Internet Explorer этого не делает:
//these work in others, null in IE element.getAttribute('class'); element.getAttribute('for');
И есть другие атрибуты, на которые можно ссылаться только по названию, оканчивающемуся на верблюдах, которое они используют для эквивалента своего свойства DOM , даже если эти имена не являются зарезервированными словами; Я не нашел конкретного шаблона, но примерами этого являются tabIndex
и accessKey
.
И это еще не все …
Internet Explorer реализует второй собственный аргумент для getAttribute()
, который должен управлять его поведением. Второй аргумент — это числовой флаг, который может принимать значения 0
, 1
или 2
. По данным MSDN :
-
0
(по умолчанию): выполняет поиск свойства без учета регистра и возвращает интерполированное значение, если свойство найдено. -
1
: выполняет поиск свойства с учетом регистра. -
2
: Возвращает значение точно так, как оно было установлено в скрипте или в исходном документе.
Когда он говорит интерполированное значение,
это означает, что он не обязательно вернет строку, как уже отмечалось. Обратите также внимание на то, как он говорит, что если свойство найдено
[мой акцент] — это может означать, что IE вообще не использует getAttribute()
как getAttribute()
получения значений узлов, он использует его как метод получения свойств DOM ! Если это правда, это в значительной степени объясняет его неправильное поведение — если он извлекает значения свойств, поэтому ему требуются имена свойств и почему он возвращает значение применимого типа; и когда MSDN сообщает, что getAttribute()
извлекает значение указанного атрибута
, он просто лежит.
Разница между 0
и 1
, по-видимому, реализована как документированная — имена атрибутов обрабатываются с учетом регистра, поэтому поиск onClick
не будет совпадать с onclick
.
Однако значение 2
не ведет себя так, как задокументировано. Когда используется это значение, атрибуты обработки событий по-прежнему возвращаются в виде функций, атрибут style
представляет собой пустую строку, а значения, которые оцениваются как логическое значение true
возвращают 65535
(то есть 2 16
, наибольшее возможное значение 16-разрядного числа. Что с этим случилось?) Но, эй — на более позитивной ноте — атрибуты href
и src
возвращают их буквальное значение, а не квалифицированный URI . Я полагаю, мы должны быть благодарны за небольшие милости!
Вы можете понять, почему я сказал, что это съедает мой мозг … Я имею в виду, что столь полный отказ от реализации стандартов — это одно, и это достаточно плохо, но Internet Explorer даже не реализует свои собственные проприетарные вещи правильно!