ActionScript3.0 ぷちクイズ 第4問:javascriptをcallする

この記事は2013年3月6日に書かれたものです。内容が古い可能性がありますのでご注意ください。


javascriptをcallする

今回はFlash(ActionScript)からjavascriptをコールする方法を問題にしてみます。
この方法がわかるとウィンドウ関連の処理で結構便利に使えます。

・ウィンドウを閉じる前に確認ダイアローグを出す。
・ポップアップ画面を開く。
・ウィンドウ名を取得する。
・既にウィンドウが開かれていないかチェックする
などなど、javascriptならではの処理をFlash側から実行したり、その戻り値を取得したりすることができるのです。

では早速、今回の問題です。

<問題>
下記flaファイルのボタン「btn」をクリック時に、
JS関数「window.alert(“javascriptをコールしました”);」が
callされるよう、ASファイルを修正しなさい。

import fl.controls.Button;
import flash.external.*;
import flash.net.*;

var btn:Button = new Button();
btn.x = 10;
btn.y = 10;
btn.width  = 100;
btn.height = 100;
addChild(btn);

答えは以下です。



<答え>
~~~~~
以下を追加すればOKです。

btn.addEventListener(MouseEvent.CLICK, btn_click);

function btn_click(event:MouseEvent):void{
	trace("clicked");
	ExternalInterface.call('window.alert("javascriptをコールしました")');
}

~~~~~

ExternalInterface.call関数を実行することで、javascriptを呼び出すことができます。

しかし、この記述だとブラウザ依存でうまくjavascriptが実行されない場合がありますので注意が必要です。
私がIE,FireFox,Chromeでチェックしたところ、FireFox(ver19.0), Chrome(ver25.0)では動作せず、IE(ver9)でのみ動作しました。

FireFox,Chromeでも動作するよう「External~」の行を以下のように書き換えて実行してみましょう。

navigateToURL(new URLRequest('javascript:window.alert("navigatetourl")'), '_self');

上記変更で、FireFox,Chromeでも動作することを確認できました。

ところが、これでも問題は残ります。
javascriptの関数によっては実行できないものがある、という問題です。
試しに「navigateToURL~」の行を以下のように書き換えてみましょう。

navigateToURL(new URLRequest('javascript:window.close()'));

FireFox,Chromeでは動作しなくなりました。
このように各関数でもブラウザ依存があるので各々確認した方がよさそうです。

☆補足☆
最近、「ExternalInterface」の脆弱性に関する公表記事がありました。
下記URLに詳細があります。
参考URL:
Adobe Flash Player の ExternalInterface ActionScript 機能における任意のコードを実行される脆弱性(2013年02月28日)

対応方法ですが、セキュリティアップデートがなされていますので、最新版のAdobe Flash Playerにアップデートしておきましょう。
下記URLにadobeの記事があります。
参考URL:
APSB13-08: Adobe Flash Player に関するセキュリティアップデート公開

  • このエントリーをはてなブックマークに追加

PAGE TOP