JavaScript. Подробное руководство, 6-е издание, стр. 381
<b> // дождаться события onload, чтобы определить момент, кода будут загружены</b><b> // все фреймы. Но мы предусматриваем отправку этого сообщения, чтобы известить</b><b> // вмещающий документ, что можно начать выполнять поиск еще до получения</b><b> // события onload. Модулю неизвестно происхождение вмещающего документа,</b><b> // поэтому мы используем *, чтобы броузер доставил сообщение любому документу, </b><b> window.parent.postMessage("Twitter Search v0.1", "*");</b><b> });</b><b> </script></b><b></head></b><b><body></b><b></body></b><b></html></b>В примере 22.5 представлен простой сценарий на языке JavaScript, который может быть вставлен в любую веб-страницу, где требуется использовать модуль поиска по сайту Twitter. Он вставляет модуль в документ и затем устанавливает обработчики событий во все ссылки в документе, чтобы при наведении указателя мыши на ссылку производился вызов метода
<b>postMessage()</b>Пример 22.5. Использование модуля поиска по сайту Twitter с помощью метода <b>postMessage()</b>
<b>// Этот сценарий JS вставляет Twitter Search Gadget в документ и добавляет обработчик</b><b>// событий ко всем ссылкам в документе, чтобы при наведении указателя мыши на них</b><b>// с помощью модуля поиска отыскать упоминания URL-адресов в ссылках.</b><b>// Это позволяет узнать, что говорят другие о сайтах, прежде чем щелкнуть на ссылке,</b><b>window.addEventListener("load", function() { // He работает в IE < 9</b><b> var origin = "</b><a href="http://davidflanagan.com/"><b>http://davidflanagan.com</b></a><b>”; // Происхождение модуля</b><b> var gadget = "/demos/TwitterSearch.html"; // Путь к модулю</b><b> var ifгате = document.createElement("ifгате"); // Создать iframe</b><b> iframe.src = origin + gadget; // Установить его URL</b><b> iframe.width = "250"; // Ширина 250 пикселов</b><b> iframe.height = ”100%"; // Во всю высоту документа</b><b> iframe.style.cssFloat = "right"; // Разместить справа</b><b> // Вставить фрейм в начало документа</b><b> document.body.insertBefore(iframe, document.body.firstChild);</b><b> // Отыскать все ссылки и связать их с модулем</b><b> var links = document.getElementsByTagName("а");</b><b> for(var і = 0; і < links.length; i++) {</b><b> // addEventListener не работает в версии ІЕ8 и ниже</b><b> links[i].addEventListener("mouseover", function() {</b><b> // Отправить url как искомую фразу и доставлять его, только если</b><b> // фрейм все еще отображает документ с сайта </b><b>davidflanagan.com </b><b> iframe.contentWindow.postMessage(this.href, origin);</b><b> }, false);</b><b> }</b><b>}, false);</b>22.4. Фоновые потоки выполнения
Одна из основных особенностей клиентских сценариев на языке JavaScript заключается в том, что они выполняются в единственном потоке выполнения: броузер, к примеру, никогда не будет выполнять два обработчика событий одновременно, и таймер никогда не сработает, пока выполняется обработчик события. Параллельные обновления переменных приложения или документа просто невозможны, и программистам, разрабатывающим клиентские сценарии, не требуется задумываться или хотя бы понимать особенности параллельного программирования. Как следствие, функции в клиентских сценариях на языке JavaScript должны выполняться очень быстро, иначе они остановят работу цикла событий и веб-броузер перестанет откликаться на действия пользователя. Именно по этой причине прикладной интерфейс поддержки Ajax всегда действует асинхронно, и по этой же причине в клиентском JavaScript отсутствуют синхронные версии функций load() или require() для загрузки библиотек на языке JavaScript.
Спецификация «Web Workers» [58] со всеми мерами предосторожности ослабляет ограничение на единственный поток выполнения в клиентском JavaScript. «Фоновые потоки», определяемые спецификацией, фактически являются параллельными потоками выполнения. Однако эти потоки выполняются в изолированной среде, не имеют доступа к объектам
<b>Window</b><b>Document</b>