Метод вызова ошибки междоменного внешнего интерфейса для NPObject

Я пытаюсь включить связь между Javascript и Flash через ExternalInterface между доменами. Javascript отлично работает, когда он расположен в том же домене, что и SWF. Но в одном случае HTML находится в домене A, а javascript и flash - в домене B. Я сделал все следующее:

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

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

Ошибка вызова метода для NPObject! [исключение плагина: ошибка в ActionScript. Чтобы найти ошибку, используйте блок try / catch.]

Это ActionScript 2, поэтому ExternalInterface.marshallExceptions недоступен.


person Josh    schedule 24.06.2009    source источник
comment
Вы загружаете более одного swf-файла? Или swf в домене A (с HTML) загружает ваш swf в домене B?   -  person Alex Jillard    schedule 24.06.2009
comment
Алекс - Хорошее замечание, я не упомянул об этом. JavaScript из домена B загружает SWF из домена B, а этот SWF загружает второй SWF из домена B. Эта загрузка работает, но я не могу быть уверен, потому что я не могу взаимодействовать с SWF.   -  person Josh    schedule 24.06.2009


Ответы (6)


Для этого вам понадобятся всего две вещи:

1) allowscriptaccess=always позволит вашему swf отправлять данные на страницу

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

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

номер 2 выше позволяет странице html на domainA вызывать вещи в swf на domainB.

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

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

person Geoff    schedule 28.06.2009
comment
странная вещь. Мои SWF и JS / HTML находятся на одной странице, но это исключение все еще присутствует :( - person DataGreed; 05.04.2011

Поскольку вы загружаете несколько файлов swf, вам может потребоваться включить параметры безопасности в каждый из этих загружаемых файлов swf в домене 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);
person Alex Jillard    schedule 26.06.2009
comment
Привет, у меня та же проблема: всякий раз, когда я пытался ввести что-то отличное от NULL в домене безопасности, я получаю сообщение об ошибке: Ошибка № 2114: параметр LoaderContext.securityDomain должен иметь значение NULL. Какие-либо предложения? - person Chen Harel; 11.11.2010

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

http-сервер не имеет разрешения на запись файла в целевой объект swfobject (flash) не имеет междоменного доступа

решение: тег объекта в html должен иметь allowScriptAccess = "always", это можно сделать, установив параметр, например

$('#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">
person Vladimir Shmidt    schedule 25.03.2011

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

person lord_t    schedule 04.02.2011

Используя 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). Удачи всем, кто с этим борется!

person Robert Jones II    schedule 05.05.2010

В моем случае это произошло потому, что я изменял элемент DOM, содержащий div загрузчика.

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

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

person Mark Bench    schedule 04.09.2011
comment
n.b. Flash знает, когда он виден, поэтому создание невидимого фильма через DOM может немедленно остановить выполнение Flash. - person Steven; 13.09.2011