Может ли функция JavaScript определить, какой объект Flash DOM вызвал ее? - PullRequest
10 голосов
/ 21 мая 2011

Вот проблема: у меня есть Flash-фильм, который будет встроен в страницу с использованием неизвестного идентификатора DOM, который я хочу иметь возможность идентифицировать / сохранить для обратного вызова в функции JS.

Мой идеальный пользовательпоток будет выглядеть следующим образом:

  1. Пользователь нажимает кнопку во Flash.
  2. Вспышка приостанавливает любую анимацию / видео / звуки / и т. д.
  3. Flash вызывает отображаемую функцию JS для отображенияопыт наложения покрытия страницы.
  4. Когда пользователь закрывает наложение, вызывается метод обратного вызова для объекта Flash.
  5. Flash возобновляет воспроизведение.

Проблемав том случае, когда AS3 использует метод ExternalInterface.call ("functionName", args ...), кажется, что событие DOM не сработало, и поэтому невозможно определить, какой объект вызвал функцию JS, поэтому наличиеФункция «registerMe ()» не работает.По сути, внедренная функция JS не может определить, какой объект DOM вызывать, поскольку идентификатор объекта Flash неизвестен.

[ОБНОВЛЕНИЕ] Оказывается, SWF может определитьсвой собственный URL с использованием loaderInfo.url.Я передаю эту информацию сценарию, который запускает процесс наложения, чтобы его можно было сохранить для будущего сравнения со всеми объектами DOM application / x-shockwave-flash.Когда совпадение найдено, это вызывающий SWF.Кто-нибудь видит недостаток в этой логике?(Я не так опытен в JS, как в AS)

Ответы [ 3 ]

5 голосов
/ 21 мая 2011

Функция JavaScript, которую вы вызываете, вызывается вручную, а не как событие.Это похоже на то, как если бы вы использовали call или apply методы в JS.

Что вы можете сделать, это передать имя DOM / ID активного флэш-видео в качестве параметра вызываемой функции, чтобы он знал, к какому элементу DOM обращаться обратно:

ExternalInterface.call( 'functionName', arg1, arg2, ..., ExternalInterface.objectID );

Одна "хитрость" этого метода в том, что вам нужно убедиться, что *Для элементов 1012 * и / или embed установлены оба атрибута [id] и [name], поскольку ExternalInterface.objectID будет несовместимо регистрироваться во всех браузерах.

Если я правильно помню, IE читает [name]и ff / chrome / opera / safari читают [id], хотя я считаю, что пара браузеров успешно откатится к [name].Мне нужно будет сделать тест, чтобы подтвердить это.

В любом случае, дайте идентичные name и id, и все должно работать нормально (вы сможете выбратьэлемент в DOM только на основе идентификатора).

2 голосов
/ 21 мая 2011

Поскольку я предполагаю, что у вас есть полный контроль над всем процессом встраивания, звучит так, как будто вы можете сообщить SWF-файлу его DOM ID как flashvar, когда он встраивается (будь то через Javascript, такой как SWFObject, или когда сервер генерируетHTML).Затем, когда он вызывает функцию Javascript для запуска интерфейса, он может отправить свой идентификатор DOM в качестве аргумента.

Не совсем идеально, но определенно выполнимо и просто в браузере.

0 голосов
/ 21 мая 2011

Не думаю, что ты можешь.Единственный «чистый» способ, которым я могу придумать, - ввести идентификатор объекта Flash через Flashvars.Уродливый способ - найти все объекты Flash и использовать loaderInfo.url для сравнения и определения правильного объекта Flash.

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