IE、FirefoxでFlashから新規ウィンドウを開く際にポップアップブロックされる件を回避するバッドノウハウ(2008/02/12版)

検証

Re:IE、FirefoxでFlashから新規ウィンドウを開く際にポップアップブロックされる件の回避 - 0x集積蔵より

AS3のソース

parametersにexternalを渡すとExternalInterfaceでwindow.openを呼ぶ。それ以外はnavigateToURLで新しくページを開く

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';
      var param:Object = this.loaderInfo.parameters;
      sp.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
        if (!param.external) {
          navigateToURL(new URLRequest(url),"_blank");
        } else {
          ExternalInterface.call('function(url){window.open(url,"_blank");}',url);
        }
       },false);
    }
  }
}

window.GeckoActiveXObjectのチェックでGeckoエンジンかどうかを判定していましたが、この方法だとWindows版Firefoxしか判定できていませんでした。Firefox(Gecko)の判定を下記の通りuserAgentがGeckoだったらwindow.isGeckoをtrueにする方法に修正しました。

if (window.navigator && navigator.userAgent && navigator.userAgent.indexOf("Gecko/") != -1) window.isGecko = true;

プログラマ気分 | 【AS1.0/2.0】Flash から新規ウィンドウを開く際にポップアップブロックを防ぐで指摘された、&&であるべき部分が&になっていた件を修正(間違っていたのはサンプルコードだけです。)

通常のnavigateToURL(Firefoxでブロックされる)

FlashPlayerが必要です

Firefoxのみ、ExternalInterfaceでwindow.openを呼ぶ(やはりFirefoxでブロックされる)

FlashPlayerが必要です

上記且つ、wmode="transparent"指定をする(Firefoxでブロックされない! しかし、今度はIEでブロックされる!!!)

FlashPlayerが必要です

Firefoxのみwmode="transparent"指定&ExternalInterface経由のwindow.openを使う(一見うまくいくが、IE7でFlash以外の部分にフォーカスがある状態でクリックするとブロックされてしまう)

FlashPlayerが必要です

結論

wmode="transparent"指定にして、IEとFirefoxのみExternalInterface経由のwindow.openを使う

FlashPlayerが必要です