Перекрестный домен ExternalInterface "Метод вызова ошибки в NPObject"
Я пытаюсь включить связь между Javascript и Flash через ExternalInterface через домены. Javascript отлично работает, когда он находится в том же домене, что и SWF. Но в одном случае HTML находится в домене A, javascript и флеш находятся на домене B. Я выполнил все следующие действия:
- Тег embed имеет
allowScriptAccess="always"
(и объект имеет это как параметр)
- Действие моего файла 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
недоступен.
Ответы
Ответ 1
Для этого вам понадобятся только две вещи:
1) allowscriptaccess=always
позволит вашему swf отправить информацию на страницу
2) System.security.allowDomain("yourhtmldomain.com");
Обратите внимание, что это System.security.allowDomain()
в AS2 - это не то же самое, что AS3 или то, что вы написали выше.
номер 2 выше позволяет html-странице на domainA вызывать вещи в swf на домене.
Домен, на котором размещен ваш js, здесь не имеет значения, поскольку браузер встраивает его в domainA, script выполняется в домене.
crossdomain.xml в основном предназначен только для загрузки удаленных файлов, которые вы не делаете, поэтому вы можете удалить их, если хотите. (и вы, вероятно, не хотите иметь файл crossdomain.xml с allow="*"
, сидящим на вашем основном домене, это очень плохая практика)
Ответ 2
Поскольку вы загружаете несколько swf, вам может потребоваться включить параметры безопасности в каждую из этих swfs в загруженном домене.
Вам также может понадобиться контекст загрузчика с соответствующими настройками безопасности.
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);
Ответ 3
для меня было несколько причин (я использую uploadify):
HTTP-сервер не имеет права записывать файл в пункт назначения
swfobject (flash) не имеют доступа к перекрестному домену
решение:
тег объекта в html должен иметь allowScriptAccess = "always", это может быть сделано с помощью параметра param, например
$('#file_upload').uploadifySettings('scriptAccess', 'always')
than flash object must have:
import flash.system.Security;
Security.allowDomain('remotedomain.com');
это можно сделать, скомпилировав исходный код с этим параметром, у меня есть это, если вам это нужно, напишите мне, добавив тему.
Чем удаленный сервер, на котором присутствует флэш, должен находиться в корневом файле crossdamoin.xml с контентом вроде:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
Ответ 4
Использование 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). Удачи всем, кто борется с этим!
Ответ 5
У меня была такая же проблема (allowDomain и т.д. были хороши), но я отправляю флеш-код bad - просто вывел JSON из ajax-вызова. Проблема исчезла, когда я положил этот json в "", а затем проанализировал его в javascript-объекте (через jQuery.parseJSON).
Ответ 6
В моем случае это произошло потому, что я изменял элемент DOM, содержащий diver uploader.
Я использовал функцию jquery hide(), чтобы скрыть div, содержащий загрузчик, и когда я понял, что вызвал вышеупомянутую ошибку, я попробовал другой подход, когда я установил атрибут "float" div. В обоих случаях он сломал загрузчик.
FWIW, похоже, что установка ширины/высоты div, содержащего загрузчик, равна 0, НЕ делает ошибку.