<b>Узнать время, не затирая документ</b>
<b></a></b>
Когда загружается такой URL-адрес, броузер выполняет JavaScript-код, но, т.к. он не имеет возвращаемого значения (метод
<b>alert()</b>
возвращает значение
<b>undefined</b>
), такие броузеры, как Firefox, не затирают текущий отображаемый документ. (В данном случае URL-адрес
<b>javascript:</b>
служит той же цели, что и обработчик события
<b>onclick</b>
. Ссылку выше лучше было бы выразить как обработчик события
<b>onclick</b>
элемента
<b><button></b>
- элемент
<b><а></b>
в целом должен использоваться только для гиперссылок, которые загружают новые документы.) Если необходимо гарантировать, что URL-адрес
<b>javascript:</b>
не затрет документ, можно с помощью оператора
<b>void</b>
обеспечить принудительный возврат значения
<b>undefined</b>
:
<b><а href="javascript:void window.open('about:blank');">Open Window</a></b>
Без оператора
<b>void</b>
в этом URL-адресе значение, возвращаемое методом
<b>Window.ореп()</b>
, было бы преобразовано в строку и (в некоторых броузерах) текущий документ был бы затерт новым документом с текстом:
<b>[object Window]</b>
Подобно HTML-атрибутам обработчиков событий, URL-адреса
<b>javascript:</b>
являются пережитком раннего периода развития Веб и не должны использоваться в современных HTML-страницах. URL-адреса
<b>javascript:</b>
могут сослужить полезную службу, если использовать их вне контекста HTML-документов. Если потребуется проверить работу небольшого фрагмента JavaScript-кода, можно ввести URL-адрес
<b>javascript:</b>
непосредственно в адресную строку броузера. Другое узаконенное применение URL-адресов
<b>javascript:</b>
- создание закладок в броузерах, как описывается ниже.
13.2.5.1. Букмарклеты
«Закладкой» в веб-броузере называется сохраненный URL-адрес. Если закладка содержит URL-адрес
<b>javascript:</b>
, такая закладка играет роль мини-программы на языке JavaScript, которая называется букмарклетом (bookmarklet). Букмарклеты легко можно запустить из меню или панели инструментов. Программный код в букмарклете выполняется, как если бы он являлся сценарием в странице; он может читать и изменять содержимое документа, его представление и поведение. Если букмарклет не возвращает какое-либо значение, он может манипулировать содержимым любого отображаемого документа, не замещая его новым содержимым.
Взгляните на следующий фрагмент URL
<b>javascript:</b>
в теге
<b><а>.</b>
Щелчок на ссылке открывает простейший обработчик JavaScript-выражений, который позволяет вычислять выражения и выполнять инструкции в контексте страницы:
<b><a href='javascript:</b>
<b> var e = r = /* Вычисляемое выражение и результат */</b>
<b> do {</b>
<b> /* Отобразить выражение и результат, а затем запросить новое выражение */</b>
<b> e = prompt("Выражение: " + e + "\n" + r + "\n", e);</b>
<b> try { r = "Результат: " + eval(e); } /* Попробовать вычислить выражение */</b>
<b> catch(ex) { r = ex; } /* Или запомнить ошибку */</b>
<b> } while(e); /* продолжать, пока не будет введено пустое выражение */</b>
<b> /* или не будет выполнен щелчок на кнопке Отмена*/ </b>
<b> void 0; /* Это предотвращает затирание текущего документа */</b>
<b>'></b>
<b> Обработчик JavaScript-выражений </b>
<b></а></b>
Обратите внимание: несмотря на то что этот программный код записан в нескольких строках, синтаксический анализатор разметки HTML обработает его как одну строку, а потому однострочные комментарии (//) здесь работать не будут. Кроме того, не забывайте, что весь этот программный код является частью значения HTML-атрибута, заключенного в одиночные кавычки, поэтому этот программный код не может содержать одиночные кавычки.
Ссылки, подобные этой, удобны, когда они «зашиты» в тело разрабатываемой страницы, но еще более удобны, когда они хранятся как закладки, которые можно запустить из любой страницы. Обычно закладки создаются щелчком правой кнопкой мыши на странице и выбором в контекстном меню пункта Добавить страницу в закладки или подобного ему. В броузере Firefox для этого достаточно просто перетащить ссылку на панель закладок.
13.3. Выполнение JavaScript-программ
Вообще говоря, не существует формального определения программы на клиентском языке JavaScript. Можно лишь сказать, что программой является весь программный код на языке JavaScript, присутствующий в веб-странице (встроенные сценарии, обработчики событий в разметке HTML и URL-адреса
<b>javascript:</b>
), а также внешние сценарии JavaScript, на которые ссылаются атрибуты
<b>src</b>
тегов
<b><script>.</b>
Все эти отдельные фрагменты программного кода совместно используют один и тот же глобальный объект
<b>Window</b>
. Это означает, что все они видят один и тот же объект
<b>Document</b>
и совместно используют один и тот же набор глобальных функций и переменных: если сценарий определяет новую глобальную переменную или функцию, эта переменная или функция будет доступна любому программному коду на языке JavaScript, который будет выполняться после этого сценария.
Если веб-страница содержит встроенный фрейм (элемент
<b><iframe></b>
), JavaScript-код во встроенном документе будет работать с другим глобальным объектом, отличным от глобального объекта в объемлющем документе, и его можно рассматривать как отдельную JavaScript-программу. Однако напомню, что не существует формального определения, устанавливающего границы JavaScript-программы. Если оба документа, вмещающий и вложенный, получены с одного сервера, то программный код в одном документе сможет взаимодействовать с программным кодом в другом документе и их можно считать взаимодействующими частями одной программы. Подробнее о глобальном объекте
<b>Window</b>
и о взаимодействии программ, выполняющихся в разных окнах и фреймах, рассказывается в разделе 14.8.3.