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.
не опера первая начала
firefox:
false
true
Комментарий для arty.name:
Офигеть. А в какой версии такое стало?
Вообще-то за такое нужно отрывать руки. Уроды.
Комментарий для Евгения Степанищева:
мне казалось, что не очень давно, меньше года назад, но на самом деле ещё в 2006: https://bugzilla.mozilla.org/show_bug.cgi?id=248549#c85
тогда ещё был небольшой шум о том, как пришлось покорёжить код, чтобы объект all приводился к false
Комментарий для blog.ad.by:
Я их благие цели понимаю, но JavaScript люблю и внесение в него кривизны не поддерживаю.
Комментарий для 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».
Комментарий для arty.name:
firefox, набираю в firebug-консоли:
«undefined»
«undefined»
false
Что я делаю не так?
А то, что написано в головном посте — в этом ВСЯ Опера. Вот именно за такие хохмочки её всё прогрессивное человечество и ненавидит.
Комментарий для david-m.livejournal.com:
Я знаю.
Комментарий для david-m.livejournal.com:
я тоже набирал в firebug-консоли, почему это не повторяется у вас, не знаю. Багзилла подтверждает, что прав всё-таки я
отдельное спасибо за флейм и отнесение меня к ретроградам ; )
впрочем, если «прогрессивное человечество» обижено на оперу за то, что она сменила юзерагент на человеческий и повторила хитрость разработчиков мозиллы (только это и написано в головном посте), то бог с ним. Видимо, меня какие-то духи оперы любят, раз у меня с ней проблем не было
Комментарий для arty.name:
Говорят, есть множество примеров обратной несовместимости. Достаточно сложно уловимых и совершенно недокументированных. За это «Оперу» не любят.
Я же «Оперу» люблю за пользовательские качества и именно поэтому использую. Мне, как пользователю браузера, всё равно какие там у всех технические трудности с ним.
Комментарий для arty.name:
Проверяю _на этой странице_ (Quirks mode): ’all’ in document == true
Проверяю на странице http://www.livejournal.com/ (Standards compliance mode): ’all’ in document == false
Вот и ответ… Но оперу мы «любим» не только за это:)