Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Передача данных из JS в AS, редирект
Flash Zone Forum > Macromedia Flash > ActionScript
Lalf
Доброго времени суток.
Я хочу сделать флэш ролик, который будет получать строковую переменную (url-адрес) из JavaScript, производить некоторые действия над этой переменной в ActionScript и переадресовывать пользователя на данный адрес.
Я очень много гуглил по поводу передачи данных из JS в AS, нашёл 2 способа:
- SWFObject (не удобен, много лишнего кода)
- Мост между JS и AS (ExternalInterface) - этот и выбрал.

Но возникла небольшая проблема, а именно: у меня не происходит редирект (переадресация) или не происходит передача данных из JS в AS.

На JS я пишу следующее:
Код
function sendFromJS(txt) {
var movie = (navigator.appName.indexOf("Microsoft")!=-1 ? window : document)["BridgeMovie"];

movie.sendFromJS(txt);
}


А в AS:
Код
// Flash Storage example

import flash.external.*;

ExternalInterface.addCallback("sendFromJS", null, recieveFromJS);

function recieveFromJS(t) {
//    _root.theText.text = t;
    getUrl(t, "_self");
// !!! или
    var my_lv:LoadVars = new LoadVars();
    my_lv.send(t, "_blank", "POST");
}

_root.button.onRelease = function() {
    ExternalInterface.call("recieveFromFlash", _root.theText.text);
    _root.theText.text = "";
}


"Publish -> разрешить доступ только к сети" делаю.
У меня Adobe Flash CS4.


Я вообще не знаю AS, поэтому могу ошибаться в типах данных.


Прошу Вашей помощи, Флэш-гуру.
chingachgoog
Если не работает в режиме эмуляции, то надо сначала зайти сюда:
http://www.macromedia.com/support/document..._manager04.html

Или не работает уже при выкладывании на сайт?
Lalf
Цитата
Если не работает в режиме эмуляции

Я извиняюсь, но что за режим эмуляции? Я просто вставляю флэшку в HTML, а потом смотрю в браузере эту страницу.

Цитата
http://www.macromedia.com/support/document..._manager04.html

А можно как-то без этого обойтись? Чтоб редирект происходил у всех пользователей, даже которые не меняют в своём плеере настроек.
chingachgoog
Цитата(Lalf @ 21.07.2009 - 18:26) *
Я извиняюсь, но что за режим эмуляции? Я просто вставляю флэшку в HTML, а потом смотрю в браузере эту страницу.
А можно как-то без этого обойтись? Чтоб редирект происходил у всех пользователей, даже которые не меняют в своём плеере настроек.


Вы можете смотреть флешку двумя путями:
1) Вы размещаете ее на сервере (т.е. она удаленная). Открываете браузер, подсоединяетесь к интернету и через браузер ее смотрите (браузер качает ее с сервера). Так она будет работать НА САМОМ ДЕЛЕ. Так ее и будут смотреть все остальные пользователи. Насколько я понимаю, вы так не делали, а пошли путем 2:
2) Флешка у вас на компе. И вы ее можете открыть хоть браузером, хоть автономным плеером, хоть еще чем. При открытии браузером будет что-то вроде эмуляции входа в интернет. У флеша тут срабатывают ограничения безопасности для обмена с JS. Поэтому вам нужно сходить на вышеуказанную страницу и разрешить ВАШЕМУ плееру обмениваться с браузером JS (остальным пользователям это делать не нужно). Это заморочка разработчика такая, к сожалению.
Lalf
Загрузил на сайт - та же история sad.gif
Может я что-то в коде накосячил?
chingachgoog
Цитата(Lalf @ 22.07.2009 - 04:41) *
Загрузил на сайт - та же история sad.gif
Может я что-то в коде накосячил?


Во-первых, проверьте, что возращает метод addCallback. Если он возращает true значит контакт с JS возможен.
Во-вторых, getUrl у вас написан с ошибкой - он у вас разве синим подсвечен?
В-третьих, из флеша вызывается JS-функция recieveFromFlash - где она?

И самое главное: используйте alert в JS и trace или запись в тестовое текстовое поле во флеше. Многие вопросы отпадут сами собой.
Посмотрите как сделан пример в хелпе по ExternalInterface.
Lalf
Цитата
Во-первых, проверьте, что возращает метод addCallback. Если он возращает true значит контакт с JS возможен.

Я не знаю как это сделать sad.gif Ладно бы ещё в JS можно было бы alert() сбацать, а тут я вообще не знаю sad.gif

Цитата
Во-вторых, getUrl у вас написан с ошибкой - он у вас разве синим подсвечен?

Точно! Не заметил это... Спасибо)

У меня теперь получается редирект, но он делается только по клику, я же хочу, чтоб он при загрузке страницы срабатывал. Возможно, нужно как-то проверить связь между JS и AS, чтоб JS подождал, пока флэшка загрузится? Помогите, пожалуйста, реализовать вот это.

То, что сейчас сделал. AS:
Код
import flash.external.*;

ExternalInterface.addCallback("sendFromJS", null, recieveFromJS);

function recieveFromJS(t) {
    var my_lv:LoadVars = new LoadVars();
    my_lv.send(t, "_self", "POST");
}


Полностью HTML-страница:
Код
<html><head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>JS - AS</title>

<script type="text/javascript">
function sendFromJS(value) {
    var movie = ((navigator.appName.indexOf("Microsoft")!=-1) ? window : document)["BridgeMovie"];  
    
    movie.sendFromJS(value);    
}
</script>
</head><body>

<input type="button" value="Click" onclick="sendFromJS('http://yandex.ru/')">

      
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="BridgeMovie" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" height="5" width="5">
    <param name="movie" value="red.swf">
    <param name="allowScriptAccess" value="sameDomain">
    <embed src="red.swf" name="BridgeMovie" play="true" loop="false" quality="high" allowscriptaccess="sameDomain" scale="exactfit" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" align="middle" height="5" width="5">
</object>

<script type="text/javascript">
sendFromJS('http://yandex.ru/');
</script>
</body></html>


Как видите, при нажатии на кнопку всё работает, а на при загрузке страницы почему-то не получается(
chingachgoog
Цитата(Lalf @ 23.07.2009 - 06:47) *
У меня теперь получается редирект, но он делается только по клику, я же хочу, чтоб он при загрузке страницы срабатывал.


Я вообще сетевыми флешками почти не занимюсь  rolleyes.gif
Но мне кажется, что это срабатывает политика безопасности или настройки браузера: открытие другой страницы/вкладки должно быть ЯВНО инициализировано пользователем, а не кодом.
Lalf
chingachgoog, спасибо за помощь, я всё таки использовал SWFObject и всё заработало как надо smile.gif
MustLive
Цитата
А можно как-то без этого обойтись?

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

Цитата
Вы размещаете ее на сервере (т.е. она удаленная).

chingachgoog, как я уже сказал, можно использовать локальный веб сервер (на localhost). Сервер будет локальным (поэтому в Интернет заходить не нужно будет, вообще можно не иметь соединения с Сетью), а для флеш плеера будет работать соответствующая политика безопасности (как для обычного веб сайта).

Цитата
Это заморочка разработчика такая, к сожалению.

Это такой защитный механизм и Адоб с каждой новой версией всё более ужесточает политики безопасности флеша (с исправлением дыр в плеере и плагине). При этом добавляя новые дыры, которые им придётся исправлять в новых версиях smile.gif.

Цитата
я всё таки использовал SWFObject и всё заработало как надо

Данную задачу можно было решить с помощью обоих методов (чтобы редирект работал и по клику и при загрузке страницы), но раз решил с помощью SWFObject, то и хорошо. Это популярный метод размещения флешек на веб сайтах, так что с ним всё бы обязательно заработало.
chingachgoog
А я вот тут подумал:

есть html-метка, которая заставляет запускать html-страничку только в песочнице зоны "интернет"
Код
<!-- saved from url=(0014)about:internet -->


А что если есть схожая метка (или возможность) запускать html-страничку в локальной песочнице? Тогда swf-ки с доступом локально-файловая система могли бы безпроблемно работать!
А то как-то западло лезть на сайт макромедии и устанавливать разрешение на конкретную папку или файл
http://www.macromedia.com/support/document..._manager04.html

Бысрый серф по инету результатов не дал. Что скажут знатоки html?

MustLive
Цитата
есть html-метка, которая заставляет запускать html-страничку только в песочнице зоны "интернет"

chingachgoog

Это Mark of the Web и данная метка поддерживается только в Internet Explorer (начиная с IE4). Другие браузеры не поддерживают и игнорируют данную метку.

Цитата
А что если есть схожая метка (или возможность) запускать html-страничку в локальной песочнице?

Для этого просто нужно не указывать данной метки (при работе с IE) и тогда при локальном запуске файла (в любом браузере) веб страница будет запущена в локальной зоне. Только тогда нужно будет устанавливать разрешения smile.gif. Но есть специальный обходной метод - использование локалхоста (для него, к тому же, есть своя запись Mark of the Web). Для которого можно лишь один раз установить разрешения флеш плеера и дальше спокойно работать.
Русская версия IP.Board © 2001-2013 IPS, Inc.