Однако важно отметить, что этого не происходит, если объект
<b>Window</b>
уже имеет свойство с таким именем. Элементы с атрибутами
<b>id</b>
, имеющими значение
<b>«history», «location»</b>
или
<b>«navigator»,</b>
например, не будут доступны через глобальные переменные, потому что эти имена уже используются. Аналогично, если HTML-документ включает элемент с атрибутом
<b>id</b>
, имеющим значение «х» и в сценарии объявляется и используется глобальная переменная х, явно объявленная переменная скроет неявную переменную, ссылающуюся на элемент. Если переменная объявляется в сценарии, который в документе находится выше именованного элемента, наличие переменной будет препятствовать появлению нового свойства окна. А если переменная объявляется в сценарии, который находится ниже именованного элемента, первая же инструкция присваивания значения этой переменной затрет значение неявно созданного свойства.
В разделе 15.2 вы узнаете, что с помощью метода
<b>document.getElementByld()</b>
можно отыскивать элементы документа по значениям их HTML-атрибутов
<b>id</b>
. Взгляните на следующий пример:
<b>var ui = ["input","prompt","heading"]; // Массив идентификаторов элементов</b>
<b>ui.forEach(function(id) { // Отыскать элемент для каждого id</b>
<b> ui[id] = document.getElementById(id); // и сохранить его в свойстве</b>
<b>});</b>
После выполнения этого фрагмента свойства
<b>ui.input, ui.prompt</b>
и
<b>ui.heading</b>
будут ссылаться на элементы документа. Вместо
<b>ui.input</b>
и
<b>ui.heading</b>
сценарий мог бы использовать глобальные переменные input и heading. Но, как вы помните из 14.5, объект
<b>Window</b>
имеет метод с именем
<b>prompt(),</b>
поэтому сценарий не сможет использовать глобальную переменную
<b>prompt</b>
вместо свойства
<b>ui.prompt</b>
.
Неявное использование идентификаторов элементов в качестве глобальных переменных - это пережиток истории развития веб-броузеров. Эта особенность необходима для сохранения обратной совместимости с существующими веб-страницами, но использовать ее сейчас не рекомендуется - в любой момент производители броузеров могут определить новое свойство в объекте
<b>Window</b>
, что нарушит работу любого программного кода, использующего неявно определяемое свойство с этим именем. Поиск элементов лучше выполнять явно, с помощью метода
<b>document.getElementById().</b>
А его использование будет менее трудоемким, если дать ему более короткое имя:
<b>var $ = function(id) { return document.getElementByld(id); };</b>
<b>ui.prompt = $("prompt");</b>
Многие клиентские библиотеки определяют функцию
<b>$</b>
, которая отыскивает элементы по их идентификаторам, как в примере выше. (В главе 19 мы узнаем, что функция
<b>$</b>
в библиотеке jQuery является универсальным методом выбора элементов, который может возвращать один или более элементов, опираясь на их идентификаторы, имена тегов, атрибут
<b>class</b>
или исходя из других критериев.)
Любой HTML-элемент с атрибутом
<b>id</b>
становится значением глобальной переменной, если значение атрибута
<b>id</b>
еще не используется объектом
<b>Window</b>
. Следующие HTML-элементы ведут себя подобным образом, если в них определен атрибут
<b>name</b>
:
<b><а> <applet> <area> <embed> <form> <frame> <frameset> <iframe> <img> <object></b>
Атрибут
<b>id</b>
элемента необходим для придания ему уникальности внутри документа: два элемента не могут иметь одинаковые значения атрибута
<b>id</b>
. Однако это не относится к атрибуту
<b>name</b>
. Если сразу несколько элементов, из перечисленных выше, будут иметь одно и то же значение атрибута
<b>name</b>
(или, если один элемент имеет атрибут
<b>name</b>
, а другой - атрибут
<b>id</b>
с тем же значением), неявно созданная глобальная переменная с этим именем будет ссылаться на объект, подобный массиву, хранящий все элементы с этим именем.
Элементы
<b><iframe></b>
с атрибутом
<b>name</b>
или
<b>id</b>
обрабатываются иначе. Переменная, неявно созданная для таких элементов, будет ссылаться не на объект
<b>Element</b>
, представляющий сам элемент, а наобъект
<b>Window</b>
, представляющий вложенный фрейм созданный элементом
<b><iframe>.</b>
К этой теме мы еще вернемся в разделе 14.8.2.
14.8. Работа с несколькими окнами и фреймами
Единственное окно веб-броузера может содержать несколько вкладок. Каждая вкладка является независимым контекстом просмотра. Каждая имеет собственный объект
<b>Window</b>
, и каждая изолирована от всех остальных. Сценарий, выполняющийся в одной вкладке, обычно даже не имеет возможности узнать о существовании других вкладок, и тем более не имеет возможности взаимодействовать с их объектами
<b>Window</b>
или манипулировать содержащимися в них документами. Если вы пользуетесь броузером, который не поддерживает вкладки, или поддержка вкладок отключена, вы можете открыть сразу несколько окон веб-броузера. Как и в случае с вкладками, каждое окно имеет свой собственный объект
<b>Window</b>
, и каждое окно обычно изолировано и не зависит от всех остальных окон.
Но окна не всегда изолированы друг от друга. Сценарий в одном окне или вкладке может открывать новые окна или вкладки, и в этом случае окна могут взаимодействовать друг с другом и с находящимися в них документами (с учетом ограничений, накладываемых политикой общего происхождения, описываемой в разделе 13.6.2). Подробнее тема открытия и закрытия окон рассматривается в разделе 14.8.1.