Opera и document.all

«Опера» в одно время пыталась притворяться Internet Explorer’ом — копировала его user-agent, эмулировала его свойства и так далее. В частности, в «Опере» есть document.all, как часть поддержки так называемых «коллекций», которые были разработаны и использовались в стародавние времена. Один из популярнейших методов определить «а не IE ли это» заключался в проверке существования document.all, иногда — исключения «Оперы»:

var isIE = document.all && self.opera

Впрочем, на Западе «Опера» не популярна, поэтому «Оперу» не исключают и считают её разновидностью IE.

Так вот, в последние годы «Опера» пытается открестится от своего «иешного» прошлого, например, где-то по дороге с 8-й версии в 9-ю user-agent перестал притворяться Internet Explorer’ом. А вот в 9-й версии (в 10-ке это тоже так) изменения начались, на мой взгляд, какие-то довольно печальные: ломают логику языка JavaScript.

В новых «Операх» конструкция alert(document.all ? 1 : 0) выдаст «0», тогда как alert(document.all) — «[object HTMLCollection]». Сделано понятно для чего: обратная совместимость не ломается, но проверка «не IE ли» теперь уже выдаёт false.

Комментарии 11

arty (arty.name) № 1

не опера первая начала

firefox:

>> !!document.all

false

>> 'all' in document

true

Евгений Степанищев (bolknote.ru) автор № 2
Офигеть. А в какой версии такое стало?
Евгений Степанищев (bolknote.ru) автор № 6
Комментарий для arty.name:

Ого понаписали-то. Я в блоге «Оперы» помню аналогичную запись ( http://my.opera.com/desktopteam/blog/2008/ … l-cloaking ), оказывается, это случилось позже, чем я думал — в версии 9.5.

Называлось это там «experimenting with document.all cloaking».
david-m.livejournal.com № 7

Комментарий для arty.name:

firefox, набираю в firebug-консоли:

>> typeof document.all

«undefined»

>> typeof window.document.all

«undefined»

>> 'all' in window.document

false

Что я делаю не так?

А то, что написано в головном посте — в этом ВСЯ Опера. Вот именно за такие хохмочки её всё прогрессивное человечество и ненавидит.

arty (arty.name) № 9
я тоже набирал в firebug-консоли, почему это не повторяется у вас, не знаю. Багзилла подтверждает, что прав всё-таки я

отдельное спасибо за флейм и отнесение меня к ретроградам ; )

впрочем, если «прогрессивное человечество» обижено на оперу за то, что она сменила юзерагент на человеческий и повторила хитрость разработчиков мозиллы (только это и написано в головном посте), то бог с ним. Видимо, меня какие-то духи оперы любят, раз у меня с ней проблем не было
Евгений Степанищев (bolknote.ru) автор № 10
Комментарий для arty.name:

Говорят, есть множество примеров обратной несовместимости. Достаточно сложно уловимых и совершенно недокументированных. За это «Оперу» не любят.

Я же «Оперу» люблю за пользовательские качества и именно поэтому использую. Мне, как пользователю браузера, всё равно какие там у всех технические трудности с ним.
david-m.livejournal.com № 11
Комментарий для arty.name:

Проверяю _на этой странице_ (Quirks mode): 'all' in document == true
Проверяю на странице http://www.livejournal.com/ (Standards compliance mode): 'all' in document == false

Вот и ответ… Но оперу мы «любим» не только за это:)