Передайте обратный вызов в ExternalInterface - PullRequest
0 голосов
/ 27 сентября 2010

Я хочу вызвать функцию Javascript из Flash, что я могу сделать с ExternalInterface, но функция Javascript принимает обратный вызов. Есть ли способ дать ему обратный вызов Flash?

Я думал о чем-то вроде этого:

ExternalInterface.addCallback("foo", function(){...});
ExternalInterface.call("theFunction", "foo");

Но это не сработает, поскольку theFunction попытается сделать foo(), тогда как на самом деле это должно swfObject.foo(). Проблема в том, что страница и ее Javascript не находятся под моим контролем (хотя я могу запросить изменения, если это действительно необходимо).

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

Это тесно связано с первым вопросом в разделе связанных вопросов .

В том же ключе, что и ответ на этот вопрос, вы можете сделать:

ExternalInterface.addCallback("foo", function() { /* ... */ });    // The callback
ExternalInterface.call("theFunction(function() { swfObject.foo(); })");
1 голос
/ 27 сентября 2010

Я думаю, вы неправильно понимаете документацию. callback в данном случае это просто ссылка на функцию внутри Flash, а не обратный вызов чего-то, что вы вызываете.

Обычно вы используете .call() для вызова функции JS из AS; и вы используете .addCallback(), чтобы сообщить Flash Player, какая функция AS должна вызываться на основе имени.

В вашем примере theFunction получит один параметр как 'foo', то есть имя, которое ссылается на вашу анонимную функцию AS. Не уверен, почему вы хотите передать такую ​​функцию, но если вам нужно, вы можете просто вызвать ее из JavaScript с помощью

function theFunction(callback) {
    // .. do something...
    swfObject[callback]();
}

Теперь, если у вас нет контроля над стороной JS / HTML, я не уверен, что вы сможете это сделать. В любом случае, я не уверен, зачем вам это нужно - вызовы JS являются синхронными, как если бы они выполнялись в одном потоке, то есть Flash Player выполнит код JS и только затем вернется к Flash Player ... у вас нет ждать исполнения или чего-то еще.

Кроме того, если вам действительно нужно управлять страницей, не касаясь стороны JS / HTML, помните, что вы можете вводить целые фрагменты кода JS с помощью .call - это не обязательно должно быть простым вызов функции. Вы можете создавать все свои функции изнутри SWF. Например,

var js:XML = <script><![CDATA[
    // Javascript code...
]]></script>;
ExternalInterface.call(js);

Или, если вам нужны данные return , вам также не нужен обратный вызов - просто выполните простой вызов, как в

// JS
function isNumberZero(__num) {
    return __num == 0;
}

// AS
trace ("Is number zero = " + ExternalInterface.call("isNumberZero", 10));

Не уверен, поможет ли это вообще. В противном случае было бы хорошо получить больше информации о том, что именно вы пытаетесь сделать.

...