2010.11.01 Monday | 10:28

  Flash(Flex)の、ExternalInterface.objectID が、Google Chrome で取得できなかったのですが トラブル

昨日、2010年10月31日に対応してました。ほんと、びっくりしてしまいました。
もともと、Flash の問題として発生していたみたいなんですが、えらい迷惑です。

[FP-383] ExternalInterface.objectID がセットされていません。

昨日のテストでは、IE や Firefox では発生せずに、Google Chrome で起こります。
( Flash は、10,1,85,3 )

仕方無いので FlashVars を併用する事にしていますが、ここ最近の問題は
それだけでは無く、Firefox のみ、Flash(Flex) で呼び出した JavaScript
の関数内で、alert を実行するとフリーズするという現象です。

昨日、古いPC の Opera でも発生したので全ての処理で、

setTimeout("alert('文字列')", 10 );

に書き換える必要がありそうです。
// *********************************************************
// 汎用型 クリップボードコピー用 Flash ボタン
// *********************************************************

package {

import flash.display.*;
import flash.events.*;
import flash.external.*;
import flash.system.*;
import flash.net.*;

// 表示用クラス 【Sprite】を継承
public class flashButton extends Sprite {

	[Bindable]
	[Embed("button.gif")]
	private var imgButton:Class;
	private var strid:String;

	// *********************************************************
	// コンストラクタ
	// *********************************************************
	public function flashButton():void {

		// IE:Object の id,それ以外 Embed の name
		strid = ExternalInterface.objectID;
		if ( strid == null ) {
			strid = stage.loaderInfo.parameters.objid;
		}
		// Firebug 用
		// ExternalInterface.call("console.log", strid );

		// stage の設定
		stage.scaleMode = StageScaleMode.NO_SCALE;
		stage.align = StageAlign.TOP_LEFT;

		// マウスイベント取得用
		var eventArea:Sprite = new Sprite();
		eventArea.x = 0;
		eventArea.y = 0;
		eventArea.buttonMode = true;	// ハンドカーソル
		addChild(eventArea);

		var imgPath:String = ExternalInterface.call( "orgCodeInit", strid );

		if ( imgPath == null || imgPath == "" ) {
			// デフォルトのボタン画像
			var myImg:Bitmap = new imgButton();
			myImg.x = 0;
			myImg.y = 0;
			eventArea.addChild(myImg);
		}
		else {
			var loader:Loader = new Loader();
			loader.load(new URLRequest(imgPath));
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
				function ():void {
					eventArea.addChild( loader );
				}
			);
		}

		eventArea.addEventListener(MouseEvent.CLICK,
			function(ev:flash.events.MouseEvent):void {

				// Firebug 用
				// ExternalInterface.call("console.log", strid );

				var shift_flg:String;
				var ctrl_flg:String;

				if ( ev.shiftKey ) {
					shift_flg = "1";
				}
				else {
					shift_flg = "0";
				}
				if ( ev.ctrlKey ) {
					ctrl_flg = "1";
				}
				else {
					ctrl_flg = "0";
				}

				var str:String = 
					ExternalInterface.call(
						"orgCodeGetForClipcopy",
						strid,
						shift_flg,
						ctrl_flg
					);

				// 戻された文字列に何か入っていたら
				// クリップボードにコピーして再び呼び出す
				if ( str != null && str != "" ) {
					System.setClipboard(str);
					ExternalInterface.call("orgCodeClipcopyEnd" );
				}


			}
		);

	}

}}