Вопрос по dom, javascript – Почему document.all ложно?

33

document.all это не примитивный объект в DOM, который является ложным.

Например, этот код ничего не делает:

<code>if (document.all) {
    alert("hello");
}
</code>

Может кто-нибудь объяснить, почему это так?

Но вопрос также заявил, что мы имеем дело с ненулевым объектом? Может быть, я прочитал это неправильно, но я предположил, что это означает, что в тесте он был, но просто не сработал? Nanne
@Nanne: Хорошо, теперь я понял вопрос. Я добавил другой ответ. Bergi
@Nanne вопрос: кто-то может объяснить, почему код ничего не делает. Если это не реализовано, если будет ложным и ничего не произойдет. Так что я думаю, это ответ. user1150525
В книге Кайла Симпсона есть хорошее объяснение:github.com/getify/You-Dont-Know-JS/blob/master/… (прокрутите вниз до заголовка «Почему?!»). Drunken Master
Современные браузеры больше не реализуют эту устаревшую вещь. Это «стандарт IE», Opera также «прокладки». Это. Bergi

Ваш Ответ

4   ответа
84

Disclaimer: Я - парень, который написал в Твиттере вопрос, который привел к этой теме :) Это был вопрос, который я хотел бы задать и ответить на мойПередние-Trends говорить. Я написал этот твит за 5 минут до выхода на сцену.

Вопрос, который я задавал, заключается в следующем.

Спецификация ECMAScriptопределяетToBoolean() as follows:

ToBoolean(condition), slide from my Front-Trends 2012 talk

Как вы можете видеть, все не примитивные объекты (то есть все объекты, которые не являются логическими, число, строка,undefined, или жеnull) правдивы согласно спецификации. Однако в DOM есть одно исключение из этого & # x2014; объект DOM, который является ложным. Вы знаете, кто это?

Ответdocument.all. HTML спецификация говорит:

The all attribute must return an HTMLAllCollection rooted at the Document node, whose filter matches all elements.

The object returned for all has several unusual behaviors:

The user agent must act as if the ToBoolean() operator in JavaScript converts the object returned for all to the false value.

The user agent must act as if, for the purposes of the == and != operators in JavaScript, the object returned for all is equal to the undefined value.

The user agent must act such that the typeof operator in JavaScript returns the string 'undefined' when applied to the object returned for all.

These requirements are a willful violation of the JavaScript specification current at the time of writing (ECMAScript edition 5). The JavaScript specification requires that the ToBoolean() operator convert all objects to the true value, and does not have provisions for objects acting as if they were undefined for the purposes of certain operators. This violation is motivated by a desire for compatibility with two classes of legacy content: one that uses the presence of document.all as a way to detect legacy user agents, and one that only supports those legacy user agents and uses the document.all object without testing for its presence first.

Так,document.all является единственным официальным исключением из этого правила ECMAScript. (В опереdocument.attachEvent и т.д. тоже ложные, но это нигде не обнаружено.)

Приведенный выше текст объясняет, почему это было сделано. Но вот пример фрагмента кода, который очень распространен на старых веб-страницах, и который проиллюстрирует это далее:

if (document.all) {
  // code that uses `document.all`, for ancient browsers
} else if (document.getElementById) {
  // code that uses `document.getElementById`, for “modern” browsers
}

В основном, надолгоdocument.all был использован таким образом, чтобы обнаружить старые браузеры. Так какdocument.all Сначала проверяется, однако, более современные браузеры, которые предлагают оба свойства, все равно окажутся вdocument.all Путь к коду. В современных браузерах мы предпочитаем использоватьdocument.getElementById, конечно, но так как большинство браузеров все еще имеютdocument.all (по другим причинам обратной совместимости)else никогда не будет доступен, еслиdocument.all было правдой Если бы код был написан по-другому, это не было бы проблемой:

if (document.getElementById) {
  // code that uses `document.getElementById`, for “modern” browsers
} else if (document.all) {
  // code that uses `document.all`, for ancient browsers
}

Но, к сожалению, большая часть существующего кода делает это наоборот.

Самое простое решение этой проблемы - простоdocument.all быть ложным в браузерах, которые все еще имитируют это.

@adrian Добро пожаловать в Интернет, где все сложно из-за устаревших функций :)
Довольно сложный ответ за устаревшую функцию.
2

который является ложным. Другой вопрос был опубликован по этому поводу, и в качестве примера скрипки в ответе показано, что в документе много ложных объектов. Количество варьируется в зависимости от используемого браузера.

Смотрите этот вопросВсе объекты в JavaScript соответствуют действительности, но в DOM нет одного непримитивного объекта. Который?

И скрипка, которая отображает все ложные объекты документаhttp://jsfiddle.net/UTNkW/

Тест, на который вы ссылаетесь, неверен по-разному. Мы ищем только не примитивные объекты, которые являются ложными. Ваш тест возвращает многоnull ценности. Увидетьstackoverflow.com/questions/10348995/….
5

это заставляет ОБА из этих примеров кода работать. Браузеры должны сделать это, чтобы старые веб-страницы продолжали работать.

Sample 1
// Internet Explorer
if (document.all) {
    useActiveX()
}
// Netscape Navigator
else {
    useOldButStillWorkingCode()
}
Sample 2
document.all.output.innerHTML = 'Hello, world!'
4

введено IE, но большинство других "шим" это быть совместимым.

Чтобы сделать возможным обнаружение браузера (в прежние времена вы могли отличить IE от NN, протестировавdocument.all), поддерживая синтаксис document.all, другие браузеры сделали «странным» реализация, котораяtypeof document.all возвращает неопределенное.

Opera> document.all
// prints the array-like object
Opera> typeof document.all
"undefined"
Opera> Boolean(document.all)
false

До того, как FF прекратил поддержку, он также показал странное поведение, как указано вэто сообщение, Вы можете найти больше внутренних органов вОшибка Mozilla # 412247.

Также естьочень длинная нить в архиве списка рассылки W3C, начиная сhttp://lists.w3.org/Archives/Public/public-html/2009Jun/0546.html

Похожие вопросы