Кросс-домен ExternalInterface "Ошибка вызова метода на NPObject" - PullRequest
19 голосов
/ 24 июня 2009

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

  • Тег для встраивания имеет 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 недоступен.

Ответы [ 6 ]

20 голосов
/ 28 июня 2009

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

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

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

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

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

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

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

1 голос
/ 25 марта 2011

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

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

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

$('#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">
1 голос
/ 26 июня 2009

Поскольку вы загружаете несколько 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);
0 голосов
/ 05 сентября 2011

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

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

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

0 голосов
/ 04 февраля 2011

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

0 голосов
/ 06 мая 2010

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

...