Я создаю настольное приложение 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!