ExternalInterfaceでActionScriptとJavaScript間で相互にObjectを渡す。
ソースコードは以下の通り。
<input type = "button" name = "" value = "sendObject()" onclick = "sendObject();" id = "send" / >
<input type = "button" name = "" value = "clearTextField()" onclick = "clearTextField();" id = "send" / >
<li ><p class = "param" > parameter
</ p ><p class = "value" > value
</ p ><div class = "clear" ></ div ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
<li ><input type = "text" name = "param" value = "" class = "param" / ><input type = "text" name = "value" value = "" class = "value" / ></ li >
// send Object
function sendObject( ) {
debugText( "send Object to swf(ActionScript)" ) ;
getEmbedElementByName( 'externalSWF' ) .loadObject ( getObject( ) ) ;
}
function getObject( name ) {
var obj = new Object( ) ;
var arrParam = document.getElementsByName ( 'param' ) ;
var arrValue = document.getElementsByName ( 'value' ) ;
var param, value;
for ( var i = 0; i < arrParam.length ; i++ ) {
param = arrParam[ i] .value ;
value = arrValue[ i] .value ;
obj[ param] = value;
}
return obj;
}
// load Object
function loadObject( obj) {
clearTextField( ) ;
debugText( "load Object from swf(ActionScript)" ) ;
var arrParam = document.getElementsByName ( 'param' ) ;
var arrValue = document.getElementsByName ( 'value' ) ;
var i = 0;
for ( var param in obj) {
arrParam[ i] .value = param;
arrValue[ i] .value = obj[ param] ;
i++;
}
}
// clear Input Text
function clearTextField( ) {
debugText( "clear text field" ) ;
var arrParam = document.getElementsByName ( 'param' ) ;
var arrValue = document.getElementsByName ( 'value' ) ;
for ( var i = 0; i < arrParam.length ; i++ ) {
arrParam[ i] .value = '' ;
arrValue[ i] .value = '' ;
}
}
// debugText
function debugText( str) {
var element = document.getElementById ( 'debugText' ) ;
removeChildren( element) ;
element.appendChild ( document.createTextNode ( str) ) ;
}
// common
function getEmbedElementByName( name ) {
return ( /*@cc_on!@*/ false ) ? window[ name ] : document[ name ] ;
}
function removeChildren( element) {
while ( element.hasChildNodes ( ) ) element.removeChild ( element.firstChild ) ;
}
import flash.external .ExternalInterface ;
init( ) ;
function init( ) {
setupEI( ) ;
setupButton( ) ;
setupTabIndex( ) ;
}
// ExternalInterface
function setupEI( ) {
var isAvailable = ExternalInterface.available ;
if ( isAvailable) {
debug( "ExternalInterface is available" ) ;
addCallbackEI( "loadObject" , null , loadObject) ;
} else {
debug( "ExternalInterface is not available" ) ;
}
}
function addCallbackEI( strMethodName_js, objInstance_as, fncMethod_as) {
ExternalInterface.addCallback ( strMethodName_js, objInstance_as, fncMethod_as) ;
}
function callJS( strMethodName_js, objParameter_as) {
ExternalInterface.call ( strMethodName_js, objParameter_as) ;
}
// Button
function setupButton( ) {
mcSendObject.onRelease = function ( ) {
sendObject( ) ;
} ;
mcSendObject.onReleaseOutside = mcSendObject.onRollOut ;
mcClearTextField.onRelease = function ( ) {
clearTextField( ) ;
} ;
mcClearTextField.onReleaseOutside = mcClearTextField.onRollOut ;
}
// Tab Index
function setupTabIndex( ) {
mcSendObject.tabIndex = 1 ;
mcClearTextField.tabIndex = 2 ;
txtDebug.tabEnabled = false ;
var txtParam, txtValue;
for ( var i = 0; i < 10 ; i++) {
txtParam = this [ "txtParam_" + i] ;
txtValue = this [ "txtValue_" + i] ;
txtParam.tabIndex = 3 + i * 2 ;
txtValue.tabIndex = 4 + i * 2 ;
}
}
// send Ojbect
function sendObject( ) {
debug( "send Object to browser(JavaScript)" ) ;
callJS( "loadObject" , getObject( ) ) ;
}
function getObject( ) {
var obj = new Object ( ) ;
var param, value;
for ( var i:Number = 0; i < 10 ; i++) {
param = this [ "txtParam_" + i] .text ;
value = this [ "txtValue_" + i] .text ;
obj[ param] = value;
}
return obj;
}
// load Object
function loadObject( obj) {
clearTextField( ) ;
debug( "load Object from browser(JavaScript)" ) ;
setObject( obj) ;
}
function setObject( obj) {
var i = 0;
var txtParam, txtValue;
for ( var param in obj) {
txtParam = this [ "txtParam_" + i] ;
txtValue = this [ "txtValue_" + i] ;
txtParam.text = param;
txtValue.text = obj[ param] ;
i++;
}
}
// clear TextField
function clearTextField( ) {
debug( "clear text field" ) ;
var txtParam, txtValue;
for ( var i = 0; i < 10 ; i++) {
txtParam = this [ "txtParam_" + i] ;
txtValue = this [ "txtValue_" + i] ;
txtParam.text = "" ;
txtValue.text = "" ;
}
}
// debug
function debug( str) {
txtDebug.text = str;
}
JavaScript
//sendObject : ObjectをSWFに渡す。
//loadObject : ObjectがSWFから渡される。
ActionScript
//ExternalInterface : Browserから呼び出し可能なActionScriptのメソッドを登録する。
//sendObject : ObjectをBrowserに渡す。
//loadObject : ObjectがBrowserから渡される。
これ以外のメソッドはActionScript/JavaScript共にオブジェクト生成用のテキストフィールドのセットアップに使ってるだけで、ExternalInterfaceには関係ない。
開発中のTweenerの最新バージョンにはFilterの機能が付いているらしい。
リポジトリのURLとかFilterのレビューしてる方のURLとかをメモっとく。
リポジトリのURL
Google Code - Tweener SVN Trunk
Google Code - Tweener Checkout
Google Code Tweener
Google Code - Tweener
Filterのレビュー
閃光的網站・弛緩複合体 -Review Division- - Tweener のさらなる進化
dp.SyntaxHighlighterでActionScriptのコードをハイライトする 際に、ActionScriptのキーワード達が列挙されているソースが見つからなかったのでまとめました。
言語エレメントには、グローバル定数・演算子・ステートメント、キーワード、ディレクティブ・特殊な型の単語が格納されています。
コアクラス・グローバル関数には、コアクラスに属するメソッド・プロパティの単語が格納されています。
Flashをお持ちの方にさらに簡易な説明を付け加えておきます。
Flashで「メニュー>編集>環境設定>ActionScript>シンタックスカラー」の、「キーワード」が言語エレメントに相当し、「識別子」がコアクラス・グローバル関数に相当します。
ダウンロード
追記
08/02/04 dp.SyntaxHighlighterからiG:Syntax Hiliterへ移行のため、サポート停止。
dp.SyntaxHighlighter をActionScript 2.0 or 3.0 のコードに対応する為のプラグイン公開。
このjsの使用方法は、dp.SyntaxHighlighterでActionScript 2.0のコードをハイライトする を参照。
(ActionScript3のコードの場合、classを"as3"か"ascript3"か"actionscript3"と記述。)
dp.SyntaxHighlighterの詳しい使い方はMovable Type備考録 様が詳しく解説してらっしゃいます。
AS3表示サンプル
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
// 円を描画し、表示リストに追加する。
var sprCircle:Sprite = new Sprite();
sprCircle.graphics.beginFill(0x990000);
sprCircle.graphics.drawCircle(50, 50, 50);
sprCircle.graphics.endFill();
addChild(sprCircle);
function fadeCircle(event:Event):void {
sprCircle.alpha -= .05;
if (sprCircle.alpha <= 0) {
sprCircle.removeEventListener(Event.ENTER_FRAME, fadeCircle);
}
}
function startAnimation(event:MouseEvent):void {
sprCircle.addEventListener(Event.ENTER_FRAME, fadeCircle);
}
sprCircle.addEventListener(MouseEvent.CLICK, startAnimation);
特徴
ActionScriptのバージョンによってキーワードを差別化しています。
「言語エレメント」と「コアクラス・グローバル関数」を色分けできます。
注意事項
dp.SyntaxHighlighter本体は付属していないので、syntaxhighlighter - Google Code からDLして下さい。
他の言語セットと比べてすごく重いです。ソース覗いていらないクラスやメソッドは削除してから使うのも良いかも。
functionとFunctionなど、本来は色が違うはずなのに同じ色になってしまうのは、dp.SyntaxHighlighterの仕様のようです。その場合「言語エレメント」に属するものを優先しています。
「Flash上では色分けされるのに、コレだと色分けされないキーワードがある。」っていう場合は、教えてください。
「他の言語セットだと大丈夫なのに、コレ使うと表示がおかしい。」っていう場合は、教えてください。
「コレ使ったらぶっ壊れたんすけど・・・」っていう場合は、おもむろにサーバーから削除して下さい。
ダウンロード
追記
08/02/04 dp.SyntaxHighlighterからiG:Syntax Hiliterへ移行のため、ハイライト実行を停止。
08/04/02 テストで再実行、ただしCSSはほぼデフォルト状態。
08/10/20 また停止
dp.SyntaxHighlighter をActionScript 2.0のコードに対応する為のプラグインを作ったので、公開。
他の言語のjsと同様head内で読み込む。
ソースコードのをpreで囲み、nameを"code"、classを"as2"か"ascript2"か"actionscript2"と記述。
<head>
<script type="text/javascript" charset="utf-8" src="shCore.js"></script>
<script type="text/javascript" charset="utf-8" src="ActionScript2.js"></script>
</head>
<body>
<pre name="code" class="as2">
/**
* ActionScript2.js for dp.SyntaxHighlighter
*/
function test():Void {
var mc:MovieClip = new MovieClip();
var str:String = "test";
mc._visible = false;
}
</pre>
<body>
SyntaxHighlighter.cssにデフォルトでclass="func"のカラー設定がないので、cssに以下を追加。
.dp-highlighter .func {
color: #0099CC;
font-weight: bold;
background-color: inherit;
}
下のように表示される。
/**
* ActionScript2.js for dp.SyntaxHighlighter
*/
function test():Void {
var mc:MovieClip = new MovieClip();
var str:String = "test";
mc._visible = false;
}
ダウンロード
ActionScript2.js
追記
08/01/22 バージョンアップしました。(dp.SyntaxHighlighterでActionScriptのコードをハイライトする )
ActionScript 2.0のfuncsを追加
ActionScript 3.0に対応するActionScript3.jsを追加
ActionScript 2.0/3.0のCompressedバージョンを追加
08/02/04 dp.SyntaxHighlighterからiG:Syntax Hiliterへ移行のため、ハイライト実行を停止。
08/04/02 テストで再実行、ただしCSSはほぼデフォルト状態。
08/10/20 また停止