Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

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) 2009

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

firefox:

!!document.all

false

’all’ in document

true

Евгений Степанищев (bolknote.ru) 2009

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

Офигеть. А в какой версии такое стало?

blog.ad.by 2009

Вообще-то за такое нужно отрывать руки. Уроды.

arty (arty.name) 2009

Комментарий для Евгения Степанищева:

мне казалось, что не очень давно, меньше года назад, но на самом деле ещё в 2006: https://bugzilla.mozilla.org/show_bug.cgi?id=248549#c85

тогда ещё был небольшой шум о том, как пришлось покорёжить код, чтобы объект all приводился к false

Евгений Степанищев (bolknote.ru) 2009

Комментарий для blog.ad.by:

Я их благие цели понимаю, но JavaScript люблю и внесение в него кривизны не поддерживаю.

Евгений Степанищев (bolknote.ru) 2009

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

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

Называлось это там «experimenting with document.all cloaking».

david-m.livejournal.com 2009

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

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

typeof document.all

«undefined»

typeof window.document.all

«undefined»

’all’ in window.document

false

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

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

Евгений Степанищев (bolknote.ru) 2009

Комментарий для david-m.livejournal.com:

Я знаю.

arty (arty.name) 2009

Комментарий для david-m.livejournal.com:

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

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

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

Евгений Степанищев (bolknote.ru) 2009

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

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

Я же «Оперу» люблю за пользовательские качества и именно поэтому использую. Мне, как пользователю браузера, всё равно какие там у всех технические трудности с ним.

david-m.livejournal.com 2009

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

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

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