FlashでnavigateToURLのパラメータに"_blank"を使った際のIEにおけるポップアップブロック問題(10/4/10修正版)

()
怒涛の投稿。終わりが見えてくると嬉しくなってきてしまう。


タイトルの通り、ページ内でFlashコンテンツを用いて、そこでnavigateToURLを使っていた場合、パラメータに"_blank"を設定していると、IEで閲覧していた場合、ポップアップブロックがかかってしまいます。(フルフラッシュの場合はなぜか大丈夫だった)


どうしたらいいかググってみたところ、それなりに同じ問題を抱えた方々の記事が出てくるのだけれど、なにしろ古い記事が多い。


試しにいろいろとその記事に沿ってやってみるのだけれど、うまくいかない。なぜか別ウィンドウが2回開かれてしまうパターンに陥る。


割と新しい記事として、この記事に当たったのだけれど、なぜかこれはウィンドウすら開かなくなってしまった。


あくせくやっているうちにIE6,7,8とFireFox3.6.3とChrome4.1ではうまくいくものが出来た...。


_mc.addEventListener(MouseEvent.CLICK,onMcClickHandler);
function onMcClickHandler(e:MouseEvent):void {
	var url:String = "http://www.xxxxx.com";
	ExternalInterface.call('function(url){window.open(url,"_blank");}',url);
}

JavaScriptと通信するためのExternalInterfaceクラスを使って、JavaScriptのwindow.openメソッドから別ウィンドウを立ち上げるわけですね。

なんだこんな簡単でいいんだと思いますが、safariで閲覧できないのはとてもいただけないです。


もう一度ググってみてヒットした記事をよくみて、特にこの記事を参考にしてみて再チャレンジ。


なんとかsafari4.0.3でもいけるようになりました。(swfobjectを使用します。)

AS側ソース
_mc.addEventListener(MouseEvent.CLICK,onMcClickHandler);
private function onMcClickHandler(e:MouseEvent):void {
	var param:Object = this.loaderInfo.parameters;
	var url:String = "http://www.xxxxx.com";
	if (!param.external) {
		navigateToURL(new URLRequest(url),"_blank");
	} else {
		ExternalInterface.call('function(url){window.open(url,"_blank");}',url);
	}
}

JavaScript側ソース

これ、ソース見ると不自然なんですよね。

AS側の条件分岐で使っているparam.externalの値は無いから、当然else部分は実行されないはず。つまり、IEまでもがnavigateToURLでリンクされているはずなのにポップアップブロックが出ない...。

いや、出ないならいいんだけど。なんか気持ち悪い。


気持ち悪いから、参考サイトにも書かれているように、
if (window.isGecko || window.ActiveXObject) so.addVariable('external', 'true');
の部分をJS側に入れてIEとFFにはswfにパラメータが渡るように試みてみるとなぜかIEでエラーが出てきてしまう...。


結局、微妙にしこりを残したまま解決。なんか判明したら追記します。


参考サイトとちょっと違うのは、
JavaScript側の
if (window.isGecko || window.ActiveXObject){
var flashvars = {external:true};
var params = {external:true};
}else{
var flashvars = {};
var params = {};
}
ってとこのソースですかね。

IEの時だけパラメータに値を入れるというわけです。
flashvarsとparams両方に{external:true}を入れます。


どっちかだけではダメでした。
(最初にこの記事を公開したとき、そこにハマってました。)


これで、
AS側ではパラメータがあった場合のみJavaScriptからウィンドウオープンなので、
IEのみそれが適用され、無事ポップアップブロックを防げるというわけでした。


この問題に対処する時は、
動作確認時にうっかりIEのポップアップブロックを許可してしまわないよう気を付けましょう。


僕はうっかり、それをやってしまい、問題解決したと思い込んで、
クライアントに出来ましたって言ったら「直ってませんよ」と言われてしまいました。

戦意

© 2012 戦意