読者です 読者をやめる 読者になる 読者になる

Flashから新規ウィンドウ(タブ)を開く際のポップアップブロック回避方法

AS3

下記はちょっと古い情報です、Re:IE、FirefoxでFlashから新規ウィンドウを開く際にポップアップブロックされる件の回避 - 0xFFをどうぞ

需要はありそうなので、(まだ検証が不十分ですが、)今のところうまくいっている方法を紹介します。

ちょっと補足 2007/08/20 16:00

この方法はポップアップブロックの誤動作を回避する方法であって、ブロックを無効化できるというわけではありません。HTMLでいうtarget="_blank"を指定相当のことがFlashだとブロックされてしまうので、それを回避するだけです。このTips自体は悪用のし様がないと思われます。

PopUp Test

package {
	import flash.external.ExternalInterface;
	import flash.display.*;
	import flash.events.*;
	import flash.net.*;
	import flash.utils.*;
	[SWF(width='100',height='100',backgroundColor='#FFFFFF')]
	public class popup extends Sprite {
		public function popup() {
			var sp:Sprite = this.addChild(new Sprite()) as Sprite;
			sp.graphics.beginFill(0x000000, 0.5);
			sp.graphics.drawRect(0, 0, 100, 100);
			sp.graphics.endFill();
			var url:String = '/popup.html';
			sp.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
				var ex:String = ExternalInterface.call('function(url){return !document.all ? window.open(url,"_blank") : null;}', url);
				if(!ex) {
					var fullURL:String = 'javascript:window.open("' + url + '","_blank");void(0);';
					var req:URLRequest = new URLRequest(fullURL);
					navigateToURL(req,"_self");
				}
			 },false);
		}
	}
}

簡単に要点をまとめると、

  • 普通にnavigateToURL(new URLRequest(url),'_blank')では、IEなどでブロックされることがある
  • そこで、javascriptスキームで、window.openを実行する。(参考:ポップアップブロック回避 - Flex Coder)
  • しかし、今度はFirefoxでブロックされる。
  • FirefoxはExternalInterfaceからwindow.openするとブロックされない&ブラウザ判別して実行することが可能。
  • !document.allの代わりに、window.GeckoActiveXObjectを使うとFirefoxだけ上手いこと判別できそうです。これでSafari2もOKかも?

まとめると、ExternalInterfaceがnullを返したらjavascriptスキームでwindow.openを実行すると、ほとんどのブラウザでブロックされずに新規ウィンドウを開くことが出来る。

といったところです。

まあ、新規ウィンドウを勝手に開くのってどうなんだという意見もあるかと思いますが。。


この環境ではブロックされたなどの報告をコメント欄などに書いていただけますと大変助かります。
もっとスマートな方法などもありましたら是々非々ご紹介お願いいたします。