ドメイン間でExternalInterfaceを介してJavascriptとFlash間の通信を有効にしようとしています。 Javascriptは、SWFと同じドメインにある場合にうまく機能します。しかし、あるケースでは、HTMLはドメインAにあり、JavaScriptとフラッシュは両方ともドメインBにあります。私は次のすべてを実行しました。
allowScriptAccess="always"
_が含まれています(オブジェクトにはそれがパラメータとして含まれています)Security.allowDomain("*")
がありますSecurity.allowInsecureDomain("*")
を呼び出します/crossdomain.xml
_を持つ_allow-access-from domain="*"
_ファイルがあります。SWFはページ上のJavaScriptを呼び出すことができますが、Javascriptを使用してExternalInterfaceによって公開された関数を呼び出すと、
NPObjectのメソッドの呼び出し中にエラーが発生しました! [プラグインの例外:Actionscriptでエラーが発生しました。エラーを見つけるには、try/catchブロックを使用してください。]
これはActionScript 2であるため、_ExternalInterface.marshallExceptions
_は使用できません。
これが機能するために必要なのは2つだけです。
1)_allowscriptaccess=always
_を使用すると、swfがページにコンテンツを送信できるようになります
2)System.security.allowDomain("yourhtmldomain.com");
AS2ではSystem.security.allowDomain()
であることに注意してください。AS3や上記で記述したものとは異なります。
上記の番号2により、domainAのhtmlページがdomainBのswf内のものを呼び出すことができます。
Jsがホストされているドメインはここでは重要ではありません。ブラウザがそれをdomainAに埋め込んでいるため、スクリプトはdomainAで実行されます。
crossdomain.xmlは主に、実行していないリモートファイルをロードするためだけのものなので、必要に応じて削除できます。 (そして、メインドメインに_allow="*"
_が含まれるcrossdomain.xmlファイルはおそらく必要ありません。これは非常に悪い習慣です)
私にとっていくつかの理由は(私はuploadifyを使用しています)でした:
httpサーバーにファイルを宛先に書き込む権限がありませんswfobject(フラッシュ)にクロスドメインアクセスがありません
解決策:htmlのオブジェクトタグにはallowScriptAccess = "always"が必要です。これは、次のようにパラメータを設定することで実行できます。
$('#file_upload').uploadifySettings('scriptAccess', 'always')
than flash object must have:
import flash.system.Security;
Security.allowDomain('remotedomain.com');
これは、このパラメーターを使用してソースをコンパイルすることで実行できます。必要に応じて、uploadifyの件名で私に書き込んでください。 Flashがページに含まれているリモートサーバーより、ルートのcrossdamoin.xmlファイルに次のようなコンテンツが含まれている必要があります。
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
複数のSWFをロードしているため、ロードされているドメインB上の各SWFにセキュリティ設定を含める必要がある場合があります。
また、適切なセキュリティ設定を備えたローダーコンテキストが必要になる場合もあります。
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);
私の場合、アップローダーdivを含むDOM要素を変更していたためです。
Jquery hide()関数を使用して、アップローダーを含むdivを非表示にしました。それが上記のエラーの原因であることに気付いたとき、divの「float」属性を設定する別のアプローチを試しました。どちらの場合も、アップローダーが壊れました。
FWIW、アップローダーを含むdivの幅/高さを0に設定しても、エラーは発生しないようです。
これと同じ問題(allowDomainなどは問題ありません)がありましたが、フラッシュに不良パラメーターを送信しました-ajax呼び出しからJSONを出力しただけです。そのjsonを ""に入れ、それを(jQuery.parseJSONを介して)javascriptオブジェクトに解析したところ、問題は解決しました。
Flash Playerバージョン10でAS3を使用すると、ローカルでテストするためにExternalInterface.addCallback()
を正しく機能させることができませんでした。私はようやく、「all」の値を持つパラメータ「allowNetworking」を追加することでローカルコピーを機能させました( http://www.Adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/ html/wwhelp.htm?context = LiveDocs_Parts&file = 00001079.html )。これで苦労している人に幸運を!