Вызов функции JS из AS3 с комплексным объектом в параметре - PullRequest
0 голосов
/ 18 октября 2011

Я создаю настольное приложение AIR. В какой-то момент приложение загружает всплывающее окно (компонент MXML на основе s: Window ), которое содержит компонент mx: HTML , который загружает локальный (в каталоге приложения) HTML файл blank.html . Соответствующие элементы в blank.html :

<script src="jw/jwplayer.js"/> <!--JW Player's JS-based Embedder-->
...
<div id="jwtarget" /> <!-- the target that the embedder will use -->

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

private function injectPlayer():void {
  var playerVars:Object = {};
  playerVars.flashplayer = "jw/player.swf";
  playerVars.file = "http://www.archive.org/download/meet_john_doe_ipod/meet_john_doe_512kb.mp4";
  playerVars.height = 360;
  playerVars.width = 640;

  try { // attempt to invoke the js function
    htmlComponent.domWindow.jwplayer("jwtarget").setup(playerVars);
  } catch(e:Error) {}

}

, который вызывается, когда загрузка страницы завершается:

<mx:HTML id="htmlComponent" location="assets/blank.html" complete="injectPlayer()" />

Все отлично работает.

Теперь к вопросу. Мне нужно быть в состоянии передать более сложный playerVars объект в функцию, но я, кажется, не получаю правильный синтаксис. Вот самый простой пример, который я пытался:

private function injectPlayer():void {
  var playerVars:Object = {};
  //playerVars.flashplayer = "jw/player.swf";
  playerVars.file = "http://www.archive.org/download/meet_john_doe_ipod/meet_john_doe_512kb.mp4";
  playerVars.height = 360;
  playerVars.width = 640;
  playerVars.modes = [{"type":"flash","src":"jw/player.swf"}];

  try { // attempt to invoke the js function
    htmlComponent.domWindow.jwplayer("jwtarget").setup(playerVars);
  } catch(e:Error) {}

}

Этот код должен создавать то же самое, что и код выше, но он не выполняется. Я предполагаю, что мне нужно каким-то образом изменить синтаксис, чтобы массив объектов (modes) был правильно передан в качестве параметра функции js.

Я пробовал разные вещи, например, передавал modes в виде строки или сначала помещал все через JSON.stringify(), но безрезультатно. Кто-нибудь знает правильный способ построения сложного объекта для параметра?

Другие сведения, если вы еще не определили их: Flex 4.5.1 - это SDK, с которым я работаю, включая расширения AIR 3.0 (что означает нацеливание на FP11).

Обновление:

Еще одна конфигурация, которую я пробовал, которая работает:

playerVars.modes = {"type":"flash", "src":"jw/player.swf"};

Однако это по-прежнему не решает проблему, заключающуюся в том, что я должен иметь возможность передавать массив объектов в свойстве modes. Но, по крайней мере, таким образом загружается видеоплеер.

Подробнее:

Итак, я нашел этот небольшой фрагмент кода из jwplayer.js , где я подозревал, что загрузка плеера не удалась:

if (typeof parsedConfig.modes == "string") {
  _modes = _playerDefaults();
  _modes[0].src = parsedConfig.modes;
} else if (parsedConfig.modes instanceof Array) {  // I suspect this was eval'd as false
  _modes = parsedConfig.modes;
} else if (typeof parsedConfig.modes == "object" && parsedConfig.modes.type) {
  _modes = [parsedConfig.modes];
}

И чтобы проверить мои подозрения, я добавил в свой blank.html следующую функцию:

<script type="text/javascript">
  var instanceOfArrayTest = function(arr) {
    return arr instanceof Array;
  }
</script>

И в моем коде ActionScript пробовал следующее:

trace([1,2,3] is Array); // true
trace(htmlComponent.domWindow.instanceOfArrayTest([1,2,3])); // false!!!!

Похоже, проблема в том, что ActionScript не передает объекты AS3 Array как объекты JS Array!

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Попробуйте сделать это вместо:

playerVars.modes = [{type:"flash",src:"jw/player.swf"}];
1 голос
/ 19 октября 2011

В отличие от метода call () класса ExternalInterface , mx: HTML не преобразует автоматически классы AS3 в соответствующие классы JS, когда они передаются в качестве параметров в функцию JS , Вместо этого HTML Control поддерживает среду, в которой методы и свойства, присущие классам AS3, сохраняются и становятся доступными для JS напрямую.

Если для функции JS требуется объект JS Array, необходимо создать массив JS явно, используя объект JavaScript Window, чтобы получить доступ к конструктору JS Array. Элемент управления HTML предоставляет доступ к этому с помощью свойства domWindow . В противном случае невозможно «привести» массив AS3 к массиву JS.

Вот базовый пример:

var JSArray:Function = htmlComponent.domWindow.Array;
htmlComponent.domWindow.instanceOfArrayTest( JSArray(1,2,3) ); // true

А для более сложного примера используйте параметр config для JW Player:

playerVars.modes = JSArray({"type":"flash","src":"jw/player.swf"},{"type":"html5"});

, который создает массив JS из двух объектов.

Подробнее о среде JavaScript в элементе управления HTML см. В разделе JavaScript в AIR в Adobe Разработка приложений AIR с помощью Flex .

...