External Interface問題


http://www.cnblogs.com/waitingsnow/archive/2012/4/6.html
swfobjectを使用して、SWFをページに埋め込むのはとても便利なことですが、アクションScriptとJavaScriptとの通信に関しては、やはり注意が必要です.
1.国境を越える問題
 jsはas addcalbackのコールバック関数を呼び出します.asもjsがいるドメインにスクリプトアクセス権限を与えます.by Security.allowDomain
通常のリソースファイル(静的コンポーネント)とHTMLファイルは同じサーバではありません.この場合、アクションScriptとJavaScriptはドメインをまたいで通信する場合、いくつかの処理が必要です.私たちはアクションScriptでこのように書く必要があります.
Security.allowDomain('siteA.com');
https接続に関しては、さらに以下を加える.
Security.allowInsecureDomain('siteA.com');
2.External Interface SecurityErr問題を投げかける
Flash起動時にExternal Interfaceを呼び出すと、ブラウザの下で常にSecurityErr異常が発生します.特別な時はTTブラウザ、360ブラウザ、世界の窓ブラウザ、自慢のブラウザなどの国産品の下で、いくつかの杯具が現れます.
次は4種類のcaseのテストを行います.
1.External InterfaceのコールとaddCallback方法
IEカーネルの国産ブラウザの下で、2回目のローディングでは、jsの呼び出しは受け付けられませんでした.
2.External InterfaceのaddCallback方法をすぐに呼び出し、遅延コールコールコールの方法
IEカーネルの国産ブラウザの下で、2回目のローディング時に、addCallback方法が異常を投げてしまい、jsの呼び出しを受けることができませんでした.
3.External Interfaceのコール方法、遅延コールaddCallback方法
IEカーネルの国産ブラウザで、2回目のローディング時に、コール方法に異常が発生しました.
4.遅延コールExternal Interfaceのコールとcalback方法
各ブラウザに対応
<!--&菗13;
dt{font-weight:bold;margin:5 px 0 pt]&菗13;
-->
したがって、最終的には比較的安定したコードは、概ねこのようなものである.
//change to a real domain
Security.allowDomain('*');
Security.allowInsecureDomain('*');
 
var timeId = setTimeout(function(){
try{
ExternalInterface.addCallback('fromJS', fromJS);
}catch(e1:SecurityError){}
try{
ExternalInterface.call('fromAS');
}catch(e2:SecurityError){}
clearTimeout(timeId);
}, 50);
この方法以外にも、swfを要求するたびにタイムスタンプを付けて区別するもっと簡潔な方法があります.しかし、キャッシュのメリットは利用されていません.
swfobject.embedSWF('source.swf'+'?timestamp='+new Date(), 'element_id',
'width', 'height', 'required-version');