Добавляем...


Взаимодействие с модулями расширений
Но зачем выяснять, будет ли обрабатывать модуль расширения тот или иной МIMЕ-тип. Необходимость этого вытекает из того, что подобно аплетам Java модули расширения связаны с LiveConnect в Netscape 3+, Internet Explorer 4+ и браузерах на базе Mozilla.

Это значит, что модуль расширения предлагает открытый интерфейс, посредством которого JavaScript может с ним взаимодействовать. Наиболее часто это используется мультимедийными модулями расширений, чтобы можно было предоставить JavaScript полный спектр возможностей управления параметрами воспроизведения видео- и аудиоданных.

Например, модули расширения часто делают доступными методы начала и остановки воспроизведения, перемотки содержимого, а также контроля уровня сигнала, его качества и размеров соответствующего окна.

В этом случае разработчик может предложить пользователю поля формы, управляющие поведением модуля расширения посредством JavaScript.

Указанная возможность работает и в обратном направлении. Внедренные объекты могут вызвать программный код JavaScript в браузере, чтобы управлять навигацией или модифицировать содержимое страницы.

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

Подобно обработчику событий в JavaScript, модуль расширения пытается вызвать функцию с определенным именем в определенный момент, например, когда пользователь останавливает воспроизведение мультимедийного файла.

Чтобы не допустить коллизий имен соответствующих методов с другими объектами страницы, к именам этих методов обычно добавляется префикс, отвечающий значению атрибута name или атрибута id дескриптора <object> или <embed> соответствующего экземпляра объекта.

Как и в случае аплетов, сохраняется проблема того, как разработчику JavaScript узнать, какие методы предлагает и вызывает модуль расширения. Главным источником такой информации должна быть документация производителя подключаемого модуля.

Но не забывайте о том, что соответствующие интерфейсы очень зависят от производителя, версии и платформы.

При использовании возможностей LiveConnect обычно требуется тщательное распознавание браузера и его подключаемых модулей.

Теперь мы имеем почти всю предварительную информацию, необходимую для того, чтобы обеспечить надежное распознавание подключаемых модулей и безопасное взаимодействие с ними.

Остается, однако, еще одна проблема "безопасного программирования", обсудить которую необходимо до того, как перейти непосредственно к обсуждению взаимодействия.

Обновление массива модулей расширений

Предположим, вы создали программный код JavaScript, позволяющий использовать возможности определенного модуля расширения.

Если пользователь посещает вашу страницу, не имея соответствующего модуля расширения, ему предлагается этот модуль установить (если в соответствующем дескрипторе <embed> на странице вы использовали атрибут pluginspage).

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

Причина в том, что массив plugins [ ] необходимо обновлять каждый раз, когда устанавливается новый модуль расширения (можно также закрыть, а затем снова запустить браузер).

Обновление массива plugins [ ] очень просто выполнить с помощью вызова его метода refresh ( ). Такой вызов заставляет браузер снова проверить все установленные модули расширения и внести соответствующие коррективы в массивы plugins [ ] и mimeTypes [ ].

Методу требуется передать аргумент, имеющий логическое значение и указывающий, следует ли браузеру перезагрузить текущие документы, содержащие <embed>. Если указать true, то браузер вызовет перезагрузку всех документов (и фреймов), которые могут воспользоваться новым модулем расширения.

Если методу передается значение false, массив plugins [ ] обновляется, но никакие документы не перезагружаются. Вот типичный пример использования указанного метода:

<em>Если вы только что установили модуль расширения, пожалуйста, <а href="javascript:navigator.plugins.refresh(true)">перезагрузите страницу </a></em>


Конечно, это должно предлагаться только пользователям браузеров Netscape, Opera и браузеров на базе Mozilla, где поддерживаются модули расширений.

Взаимодействие с модулем расширения

Почти все, что касается взаимодействия с аплетами, верно и для модулей расширений. Аплеты оказываются доступными через объект Document по имени аплета или по значению атрибута id.

Аналогично, модули расширений, обрабатывающие внедренные в страницу данные, оказываются доступными по значению атрибута name соответствующего дескриптора <embed>. Как и с аплетами, следует быть внимательными, чтобы не пытаться получить доступ к внедряемым данным до окончания их загрузки.

В этом случае также часто применяется обработчик onload объекта Document для установки глобального флага, указывающего завершение загрузки.

Но между аплетами и модулями расширениями есть одно отличие: в спецификациях DOM отсутствуют и дескриптор <embed>, и понятие модуля расширения. Несмотря на тот факт, что они используются очень широко, в частности, в форме Flash, указанные спецификации предпочитают это не признавать и предлагают в качестве стандарта свой вариант.

Чтобы продемонстрировать возможности взаимодействия с модулями расширений, мы предлагаем рассмотреть простой пример, в котором используется файл

Macromedia Flash. Во-первых, здесь следует обратить внимание на то, что есть два разных имени, соответствующих проигрывателям Flash, способным обеспечить взаимодействие с LiveConnect, — это "Shockwave Flash" и "Shockwave Flash 2.0".

Во-вторых, из документации Macromedia вытекает, что если вы желаете использовать JavaScript для вызова функций проигрывателя Flash, то в дескрипторе <embed> для атрибута swliveconnect должно быть установлено значение true (хотя в нашем примере это, кажется, не требуется).

Список методов, предлагаемых проигрывателем Flash, можно найти на Web-узле Macromedia (например, http://www.macromedia.com/support/flash/publishexport/ scriptingwithflash/). В нашем примере мы используем методы GotoFrame( ), IsPlaying(), Play( ), Rewind( ), StopPlay( ), TotalFrames( ) и Zoom ( ),чтобы обеспечить возможность управления простым файлом Flash с помощью запросов JavaScript.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Простой пример управления файлом Flash (только для Netscape и
Mozilla)</title>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251" />
<script type="text/javascript">
< !---
var pluginReady = false;
var pluginAvailable = false;
if (document.all) alert("Это пример для netscape и mozilla");
function detectPlugin ( )
{
// если модуль расширения существует и правильно настроен,
//то разрешить взаимодействие с ним
if (navigator.plugins &&
((navigator.plugins["Shockwave Flash"] && navigator.plugins["Shockwave Flash"]["application/x-shockwave-fl- ash"] )
) )
(navigator.plugins["Shockwave Flash 2.0"] &&
navigator.plugins["Shockwave Flash 2.0"]["application/x-shockwa-
ve-flash" ] ) )
) pluginAvailable = true;
}
function changeFrame(i)
{
if (!pluginReady || !pluginAvailable)
return;
if (i>=0 && i<document.demo.TotalFrames( ))
// функция ожидает целое числовое значение, а не строку!
document.demo.GotoFrame(parselnt(i));
}
function play( )
{
if (IpluginReady || [pluginAvailable)
return;
if (!document.demo.IsPlaying( ))
)
document.demo.Play( );
function stop( )
{
if (!pluginReady || !pluginAvailable)
return;
if (document.demo.IsPlaying( ))".
document.demo.StopPlay( );
1
function rewind( )
{
if (!pluginReady || !pluginAvailable)
return;
if (document.demo.IsPlaying( ))
document.demo.StopPlay( ) ;
document.demo.Rewind( );
}
function zoom(percent)
{
if (!pluginReady || !pluginAvailable)
return;
if (percent > 0)
document.demo.Zoom(parselnt(percent)) ;
// метод ожидает целое числовое значение
}
//—>
</script>
</head>


<body onload="pluginReady=true; detectPlugin ( );">

<!— Замечание: дескриптор embed не является стандартным —>
<embed id="demo" name="demo"
src="http://demos.javascriptref.com/jscript.swf"
width="318" height="300" play="false" loop="false"
pluginspage="http://www.macromedia.com/go/getflashplayer"
swliveconnect="true"></embed>

<form name="controlform" id="controlform" action="#" method="get">
<input type="button" уа1ие="Старт" onclick="play( );" />
<input type="button" value="Cтon" onclick="stop( );" />
<input type="button" value="Перемотка" onclick="rewind ( ); " /><br />
<input type="text" name="whic'hframe" id="whichframe" /> .
<input type="button" value="Сменить фрейм"
onclick="changeFrame(controlform.whichframe.value);" /><br />
<input type="text" name="zoomvalue" id="zoomvalue" />
<input type="button" value="Изменить размер"
onclick="zoom(controlform.zoomvalue.value); " />
(больше 100 - увеличение, меньше 100 - уменьшение)<br />
</form>
</body>
</html>

Этот подход может предложить значительно более мощные возможности, чем продемонстрированные в предыдущем примере.

Одной из наиболее полезных возможностей Flash является то, что внедренные файлы могут с помощью FSCommand( ) генерировать команды, которые можно "захватить" средствами JavaScript, определив функцию с подходящим именем.

Каждый раз, когда в браузере с поддержкой LiveConnect внедренный файл Flash генерирует команду FSCommand( ), этот файл Flash "на территории" браузера пытается вызвать метод имя _doFSCommand( ), если таковой существует.

Часть имя в названии метода имя _doFSCommand ( ) соответствует значению name или id того элемента, в котором определен соответствующий объект.

В предыдущем примере файл Flash должен искать метод demo_doFSCommand( ), поскольку этот файл был указан в рамках дескриптора <embed> с name, равным "demo".

Типичным вариантом применения указанного метода является оповещение сценария о завершении загрузки данных и о состоянии процесса воспроизведения видео- и аудиофайлов.

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


добавить комментарий
(без перезагрузки и регистрации)


10 случайных разделов

Что ищем на сайте ?


Примеры кода на сайте







@ 2008-2011 Amber
При использовании материалов ссылка на сайт обязательна
Яндекс.Метрика