Евгений Степанищев

Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

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.
10 апреля 2009 15:48

arty (arty.name)
10 апреля 2009, 16:10

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

firefox:
>> !!document.all
false
>> 'all' in document
true

bolk (bolknote.ru)
10 апреля 2009, 20:02, ответ предназначен arty (arty.name):

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

blog.ad.by (blog.ad.by)
10 апреля 2009, 23:57

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

arty (arty.name)
11 апреля 2009, 12:56, ответ предназначен bolk (bolknote.ru):

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

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

bolk (bolknote.ru)
11 апреля 2009, 13:53, ответ предназначен blog.ad.by:

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

bolk (bolknote.ru)
11 апреля 2009, 13:56, ответ предназначен arty (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 (david-m.livejournal.com)
12 апреля 2009, 01:34, ответ предназначен arty (arty.name):

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

>> typeof document.all
"undefined"
>> typeof window.document.all
"undefined"
>> 'all' in window.document
false

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

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

bolk (bolknote.ru)
12 апреля 2009, 01:50, ответ предназначен david-m.livejournal.com:

Я знаю.

arty (arty.name)
12 апреля 2009, 10:55, ответ предназначен david-m.livejournal.com:

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

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

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

bolk (bolknote.ru)
12 апреля 2009, 12:47, ответ предназначен arty (arty.name):

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

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

david-m.livejournal.com (david-m.livejournal.com)
12 апреля 2009, 19:40, ответ предназначен arty (arty.name):

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

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)

Подсказка по написанию комментария

В комментариях можно применять следующую специальную разметку:

  • слово, обрамлённое в «звёздочки» выделяется *жирным*
  • ссылка становится ссылкой: http://bolknote.ru
  • ссылка в скобках также становится ссылкой, закрывающая скобка не захватывается: (http://bolknote.ru)
  • каждую строку цитаты следует начинать со знака «больше»:
    > это цитата
    > из двух строк
  • можно вставить картинку, залитую на один из сервисов: «Яндекс.Фотки», «Фликр» или «Пикплз». Для этого нужно вставить на страницу полный адрес вашей картинки на сервисе, он превратится в картинку:

    http://fotki.yandex.ru/users/bolknote/view/274311?page=3