URIの存在有無を確認してから処理を行う
夏休みという名の秋休みの最中、後輩が増えて挙動不審なtomです。
今回、“URIが存在しない場合、特殊なアクションを実行する”という事を行いました。
具体的な用途としては以下のようなケースが考えられます。
【用途】
- リンク開示した際、404ウィンドウが立ち上がらないようにしたい
- エラーメッセージを表示させたい
- API処理を行わせたくない
実装ですが、FlashPlayer7からはFlashのみで完結します。但し、そういった便利な関数がある訳ではありませんので、ビルドインクラス利用した関数を利用します。
FlashPlayer6以下でも、外部API(php等)を利用する事によって、同じような実装が可能です。
では本題に入ります。
今回、MovieClipLoaderという関数を利用し、AS2で記述しました。
以下にてonLoadStartを利用しているのは、URIチェックが目的でURI全てを読む必要が無い為です。
処理の流れですが、“読込が開始したと同時に、確認用のオブジェクトを削除し、目的の処理を実行する形”です。
/** @description URIの確認を行う関数です @param href(チェックしたいURIを譲渡します) */ import mx.utils.Delegate; var _listener:Object; var _loader:MovieClipLoader; function checkURI(href:String):Void { function oLS(target_mc:MovieClip):Void { //URIが存在していた場合、再度URIアクセスして本処理(getURL, ExternalInterface等) target_mc.removeMovieClip(); _loader.removeListener(_listener); } function oLE(target_mc:MovieClip, errorCode:String, httpStatus:Number):Void { //URIが存在していない際の処理 target_mc.removeMovieClip(); } _listener = {}; _listener.onLoadStart = Delegate.create(this, oLS); _listener.onLoadError = Delegate.create(this, oLE); var mc:MovieClip = _r.createEmptyMovieClip("mc", this.getNextHighestDepth()); //URI存在確認用MC mc._visible = false; //可視存在を考慮し不可視 _loader = new MovieClipLoader(); _loader.addListener(_listener); _loader.loadClip(href, mc); }
結果、MovieClipLoaderの本来の使い方(※1)からはそれましたが、MovieClipLoaderは大体のURI(メディア問わず)は読めるようなので、それを利用した実装となります。より簡潔な方法もありそうです。
※1 元のムービーの再生中に、SWF、JPEG、プログレッシブ JPEG、非アニメーション GIF、または PNG の各ファイルを Flash Player のムービークリップ内にロードします。
Flashは他言語と比べると出来る事が限られますが、ビルドインクラスを応用して出来る幅を模索するするのも醍醐味の一つだと感じます。