Подтвердить что ты не робот

Перекрестный домен 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 недоступен.

4b9b3361

Ответ 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, НЕ делает ошибку.