Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Вызов AS функции из JS
Flash Zone Forum > Macromedia Flash > ActionScript
sad1st
Использую import flash.external.*;

Action Script
Код
import flash.external.*;
function lightCellsAvailable(stepSize) {
    //... some code
}
var isAvailable:Boolean = ExternalInterface.available;
if (isAvailable) {
    
    // Make function lightCellsAvailable available to Javascript
    _root.txtTest.text = ExternalInterface.addCallback("lightCellsAvailable", this, lightCellsAvailable).toString();
}


HTML
Код
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=koi8-r" />
<title>fight</title>
</head>
<body bgcolor="#006600">
<form>
    <input type="button" onclick="callExternalInterface()" value="Call ExternalInterface"/>
</form>
<script>
function callExternalInterface() {
    alert(getMovie("fight").lightCellsAvailable);
}

function getMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName]
    }
    else {
        return document[movieName]
    }
}
</script>
<!--url's used in the movie-->
<!--text used in the movie-->
<!-- saved from url=(0013)about:internet -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="600" height="269" id="fight" align="middle" VIEWASTEXT>
<param name="allowScriptAccess" value="always" />
<param name="movie" value="fight.swf" /><param name="quality" value="high" /><param name="wmode" value="transparent" /><param name="bgcolor" value="#006600" /><embed src="fight.swf" quality="high" wmode="transparent" bgcolor="#006600" width="600" height="269" name="fight" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>


В результате получается что ExternalInterface.addCallback("lightCellsAvailable", this, lightCellsAvailable).toString(); возвращает false...

Помогите разобраться почему??????? unsure.gif
MustLive
Цитата
Вызов AS функции из JS

sad1st

Это весьма интересная тема - вызов AS команд (и функций) из JavaScript. С таким доводилось сталкиваться (но редко, сама необходимость в подобном возникала весьма не часто).

И это вполне реальная вещь. Если сделать всё корректно, то вызовы будут работать (как AS из JS, так и JS из AS). Вкратце о подобных вызовах в хелпе к флешу рассказыается.

import flash.external.* я сам не использовал, обращался к флешу напрямую (в 5 и 6, когда данных классов ещё не было).

В твоём случае, в приведённом коде, всё вроде выглядит корректно - если флеш на ругается на синтаксис, то ошибка в самом алгоритме (логическая ошибка). Можешь попробовать к примеру не юзать булевских переменных, и заносить в _root.txtTest.text без проверок - если функция сработает, то она и занесёт. Может глюк (или некорректная запись) в случае булевской переменной - и потому не срабатывает. Тут нужно внимательно тебе код посмотреть, хелп почитать, посмотреть те примеры кода, откуда ты брал инфу касательно вызова функции в AS из JS (может пример был не рабочим).

Функция getMovie(movieName) в JS у тебя правильная, она нужна для корректной работы.

Например для перехода на 5й кадр нужен следующий код:

HTML
В заголовке страницы:

function getMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
function go() {
getMovie("fight").GotoFrame(5);
}

В теле страницы:

<a href="#" onClick="go()">Перейти на 5й кадр</a>


Так что посмотри пример и разбирайся со своим кодом.
sad1st
Спасибо, разобрался.
Оказалось что там написано правильно... только вот запускать хтмл страничку надо было не локально, а через http =) Вот и всё.
MustLive
Цитата
Оказалось что там написано правильно... только вот запускать хтмл страничку надо было не локально, а через http =) Вот и всё.

Это хорошо, что всё написано правильно wink.gif. Только вот истинно правильный код работает и локально и в Сети. Так что у этого кода есть нюансы.

Причём запускать локально можно как "стандартно", из текущей папки (локальный путь), так и на локальном сервере - что тоже локально, но через http (этот метод используется для локального тестирования). А также последний вариант - на сайте в Сети. И код нужно тестить в разных режимах (в первых двух например, или в 1 и 3, если нету локального сервера). Что ты в итоге и сделал - и обнаружил особенности работы кода.

Как я уже сказал нормальный код - для вызова AS из JS (или JS из AS) - должен рабоать как локально, так и в сети. Так как там не должно быть привязки к сайту (это лишнее), и там нет каких-то хитрым "сетевых" вызовов (разве что привязка к браузеру, в котором работает JS, но это должно работать в любых режимах). Как например в случае моего примера - который работает и локально и в Сети. Так что у тебя код с особенностями (и ограничениями), которые нужно учитывать.
Русская версия IP.Board © 2001-2009 IPS, Inc.