2009年10月28日(水) 12:53 | posted by shin2 | Comments [0]
Flashでマウスの位置を参照して、画像を無限ループスクロールさせた時に、ブラウザウィンドウからフォーカスを外すと、凄いスピードで動くのでこれを何とかしたいと思った。
JavaScriptでブラウザウィンドウからフォーカスがアウトされた時と、フォーカスされた時を検出して、ExternalInterface.addCallbackを使ってFlash側の関数を操作すれば何とかできそうだ。
ExternalInterfaceはFlashからJavaScriptの関数・JavaScriptからFlash内の関数をコントロール出来るクラスみたい。
まずはフォーカスが切り変わるごとに、Flash上のテキストフィールドの文字を切り替えることを試してみる。
■HTML
swf表示の部分のallowscriptaccessは:”always”にする。(HTML上のJavaScriptを呼び出せるようにするかどうか)
swf読み込み部分のobjectのid、param・embedのnameはblur_testとする。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <title>onfocus onblur test</title> <script language="javascript">AC_FL_RunContent = 0;</script> <script src="AC_RunActiveContent.js" language="javascript"></script> <script type="text/javascript"> //フォーカス切り替えごとに実行される関数 function xChangeText(bFocusMode) { getMovieName("blur_test").callChangeText(bFocusMode); } function getMovieName(movieName) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[movieName] } else { return document[movieName] } } </script> </head> <body onblur="xChangeText(false)" onfocus="xChangeText(true)"> </body> </html>
■Flash
ステージにインスタンス名 test_tf のテキストフィールドの文字を切り替える。
import flash.external.ExternalInterface; //フォーカス切り替えごとにJavaScript側から呼ばれる function xChangeText(bFocusMode:Boolean):Void { var str:String; if (bFocusMode) { str = "フォーカスされています。"; } else { str = "フォーカスアウトされました。"; } test_tf.text = str; } //JavaScriptから呼べるように登録する ExternalInterface.addCallback("callChangeText", null, xChangeText);
これでFlash上の文字を切り替えることができたので、この要領でフォーカスが外れた時にスクロールが止まるようにすれば、今回の問題は解決しそうだ(未確認)。
※はじめbodyタグにonloadでテストの実行をしようとしたが動作しなくてハマッた。
理由はswfファイル読み込みよりも前の段階にonloadを記述していたからみたいだ。読み込んでないswfにアクセスはできねーってことかい。(そりゃそうだ)
[この記事へのトラックバックURL]
http://www.mujuu.org/weblog/web_memo/222/trackback