2009-06-24 2 views
19

Я пытаюсь включить связь между Javascript и Flash через ExternalInterface через домены. Javascript отлично работает, когда он находится в том же домене, что и SWF. Но в одном случае HTML находится на домене А, яваскрипт и вспышка и находиться на домене B. Я сделал все следующие:Перекрестный домен ExternalInterface «Метод вызова ошибки в NPObject»

  • встраивания тега allowScriptAccess="always" (и объект имеет то, как парам) actionscipt
  • Мой SWF-файл имеет Security.allowDomain("*")
  • Мой SWF также вызывает Security.allowInsecureDomain("*")
  • Оба домена а и домен B имеют /crossdomain.xml файл, который имеет allow-access-from domain="*"

SWF-может вызвать JavaScript на странице, но когда я использую Javascript для вызова функции, предоставляемые ExternalInterface, я получаю

Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.]

Это ActionScript 2 так ExternalInterface.marshallExceptions не доступен.

+0

Вы загружаете более одной SWF-кнопку? Или это swf на домене A (с HTML), загружающий ваш swf в домен B? –

+0

Алекс. Хорошо, я этого не говорил. Javascript из домена B загружает SWF из домена B и что SWF загружает второй SWF из домена B. Эта загрузка, похоже, работает, но я не могу быть уверен, потому что я не могу взаимодействовать с SWF. – Josh

ответ

20

Вы должны только две вещи для этой работы:

1) allowscriptaccess=always позволит вашему SWF отправить материал к странице

2) System.security.allowDomain("yourhtmldomain.com");

Обратите внимание, что это System.security.allowDomain() в AS2 - это не то же самое, что AS3 или то, что вы написали выше.

номер 2 выше позволяет html-странице на домене A называть вещи в swf на домене B.

Домен, на котором размещен ваш js, не имеет значения здесь, так как браузер встраивает его в domainA, скрипт выполняется в domainA.

crossdomain.xml предназначен, в основном, только для загрузки удаленных файлов, которые вы не делаете, поэтому вы можете удалить их, если хотите. (и вы, вероятно, не хотите иметь файл crossdomain.xml с allow="*", сидящим на вашем основном домене, это очень плохая практика)

+1

странная вещь. Мой SWF и JS/HTML находятся на одной странице, но это исключение все еще присутствует :( – DataGreed

1

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

Возможно, вам также понадобится контекст загрузчика с соответствующими настройками безопасности.

import flash.system.LoaderContext; 
import flash.system.ApplicationDomain; 
import flash.system.Security; 
import flash.system.SecurityDomain; 
import flash.net.URLRequest; 
import flash.net.URLLoader; 

var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain, (Security.sandboxType == Security.REMOTE) ? SecurityDomain.currentDomain : null); 
var l:Loader = new Loader(); 
l.load(new URLRequest("http://example.com/myswf.swf"), context); 
+0

Привет, У меня такая же проблема, когда я пытался ввести что-то другое, кроме NULL в домене безопасности. Я получаю сообщение об ошибке: Ошибка # 2114: Параметр LoaderContext.securityDomain должен быть нулевым. Любые предложения? –

0

Использование AS3 с Flash Player версии 10 Я не мог получить ExternalInterface.addCallback(), чтобы корректно работать для тестирования локально , Я, наконец, получил свою локальную копию, добавив параметр «allowNetworking» со значением «all» (http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001079.html). Удачи всем, кто борется с этим!

0

У меня была такая же проблема (разрешитьDomain и т. Д. Были хороши), но я посылаю флеш плохой параметр - только что вывел JSON из вызова ajax. Проблема исчезла, когда я положил этот json в "", а затем проанализировал его в javascript-объекте (через jQuery.parseJSON).

1

для меня несколько причин были (я использую Uploadify):

сервера HTTP не разрешения на запись файла назначение SWFObject (флэш) не имеет доступ к домену кросса

решения: объект тег в HTML должен иметь AllowScriptAccess = «всегда» это может быть сделано с помощью набора пар, как

$('#file_upload').uploadifySettings('scriptAccess', 'always') 
than flash object must have: 
import flash.system.Security; 
Security.allowDomain('remotedomain.com'); 

это может быть сделано с помощью источника компиляции с этим парами, у меня есть, что, если вам это нужно написать мне с Uploadify предмет. Чем удаленного сервера, где вспышка включать в страницы, должны иметь в файле crossdamoin.xml корня с содержанием типа:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
0

В моем случае, это было потому, что я модифицируя элемент DOM, содержащий загрузчик DIV.

Я использовал функцию jquery hide(), чтобы скрыть div, содержащий загрузчик, и когда я понял, что вызвал вышеуказанную ошибку, я попробовал другой подход, когда я установил атрибут «float» div. В обоих случаях он сломал загрузчик.

FWIW, кажется, что установка ширины/высоты div, содержащего загрузчик, равна 0, НЕ делает ошибку.

+1

n.b., Flash знает, когда это видно, поэтому создание невидимого фильма через DOM может немедленно остановить выполнение Flash. –

 Смежные вопросы

  • Нет связанных вопросов^_^