現在の位置
diff プラグインを使用中
- 追加された行はこの色です。
- 削除された行はこの色です。
- ExternalInterface へ行く。
- ExternalInterface の差分を削除
#contents
//#topicpath
lastmod: &lastmod; &br;
&tag(flash,JavaScript);
*基本的なこと [#z83595a4]
**対応ブラウザ [#nd54b750]
モダンブラウザは対応。古めのブラウザもわりと動くようだ。
:win|
IE5.0以降
:mac|
safari1.3以降
**確認時はサーバを介する [#d7a8c8bb]
ローカルファイルではうまくいかない(たぶんsecurityの問題。allowDomainとかもあるし)
なので、localhostでやるか、サーバにアップする必要がある。
**デバッグプレビュー中ではエラーが出る [#l25205e8]
「ExternalInterfaceは使えません」エラーが投げられるので、デバッグできなくなってしまう。なにか対策が必要ぽいけど、めんどくさいな。
*AS→JSはExternalInterface.call(functionName:String, ... arguments); [#j53f3087]
public static function call(functionName:String, ... arguments):*
argumentsにはArrayやObjectも渡せる
**まずavailableで確認する [#m8f81c51]
ExternalInterface.availableで使えるかどうか確認。
**HTML側にJavaScriptを書かずとも、Stringで直書きjsを渡せる。 [#mf6e7d69]
Stringを渡せばうまいこといけるらしい
ExternalInterface.call('function() { alert("unko") }');
***てっく煮さんで見たCDATAを使う方法 [#h1bdbf1d]
http://tech.nitoyon.com/meltdown/Meltdown.as
var f:String = <><![CDATA[
function(){
var imgs = document.getElementsByTagName('img');
for(var i = 0; i < imgs.length; i++){
imgs[i].style.visibility = 'hidden';
}
}]]></>;
ExternalInterface.call(f);
*JS→ASはaddCallback(functionName:String, closure:Function) [#bc4141f1]
public static function addCallback(functionName:String, closure:Function):void
as2だと
public static addCallback(methodName:String, instance:Object, method:Function) : Boolean
流れ的には
+swf側で、interfaceを定義してjs側から見えるようにしておく
+js側で、該当swf要素を引っこ抜いて、interface定義したメソッドを呼ぶ
+動く!
**JavaScript側はgetElementByIdは使わずに、adapterをして要素を取得する [#m11a6a13]
要素を取得→そのswfのinterface登録したメソッドを呼べば答えてくれる。asに渡す引数は普通に渡せる
function callExternalInterface() {
thisMovie("externalInterfaceExample").goHome(value);
}
//長いので以下の省略版のほうがいいかな。
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
//ワンライナーのほうが気持いいね
function getSwf(id)
{
return navigator.appName.indexOf("Microsoft") != -1 ? window[id] : document[id];
}
**JS→ASでの関数名は完全に一意のものを使う。同じ関数名があるとハマる。 [#u1c0560e]
むちゃくちゃハマるポイント。
JavaScriptのfunction名とActionScriptにコールする関数名が同じだと、うんともすんとも言わなくなる。
具体的には
//呼び出し側js。ターゲットとなるswfに対してopenというメソッドを呼ぶ関数。
//JavaScript側の関数とswf側の関数名が同じだとハマる。
//動くマシンと動かないマシンがあることもハマリがわからなくなる原因になる
function open()
{
var swf = getSWF(SWFID);
swf.open();
}
**クロスドメインするときはセキュリティを解除してあげること [#kbddae4d]
+HTMLに追加
<param name="allowScriptAccess" value="always" />
+swfに追加
flash.system.Security.allowDomain(sourceDomain); //ドメインだけsample.comとか書く。http://は不要
**JavaScript側からの呼び出しで参考になる記事 [#n2420946]
http://la.ma.la/blog/diary_200702152107.htm
*ExternalInterfaceの活用事例 [#d28aa028]
-同一ページに複数設置したSWFどうしをつなぐ
--Jack型のブログパーツやバナー広告
--LocalConnectionでは実現不可能
-HTMLページのURLを取得する
--ブログパーツなど、外部から呼び出される際にそのページのURLを取得する
---locationで取得
*ExternalInterfaceでハマる [#g7f062e6]
**IE系とFirefox2を確実にクラッシュさせる方法 [#vc990422]
''SWF→JSの関数を呼んでいる状態で、SWFをremoveChildすると死ぬ''
たぶん、コールスタックの関係でそうなっているんだと思う。ブラウザと密接につながっているからかな。
***回避策 [#j655a902]
setTimeoutでSWF→JSのコネクションを切ってから、実処理する
function jsCallBack()
{
setTimeout(function(){
var swf = getElementById("swf");
swf.parentNode.removeChild(swf)
}, 1);
}
ツールボックス
Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'plugin_menu_convert' was given in /virtual/katapad/public_html/flash/wiki/lib/plugin.php on line 134
