Может ли функция JavaScript определить, какой объект DOM DOM назвал?

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

Мой идеальный поток пользователей:

  • Пользователь нажимает кнопку во Flash.
  • Flash приостанавливает любые анимации/видео/звуки и т.д.
  • Flash вызывает введенную JS-функцию, чтобы отобразить наложение оверлей на странице.
  • Когда пользователь закрывает опыт наложения, вызывается метод обратного вызова для объекта Flash.
  • Flash возобновляет воспроизведение.

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Не совсем идеальный, но в браузере, безусловно, возможно и легко.

Ответ 3

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