Hi there… we’ve been busy these past couple of days so there wasn’t much time for new posts – sorry. But here is a little update.
While developing a flash website (AS3 & SWFObject2.0) that heavily depended on opening URLs in a new browser window we came across the popup blocker problem that the use of navigateToURL causes. When trying to open a new window firefox’/IE’s popup blocker will block the window and display its warning. After googling for some time we came across some neat workarounds:
1) How to prevent pop-up blocking in Firefox by Sergey Kovalyov
2) The Nightmare that is “_blank”: Part II (resolved???) by The Saj
putting these two approaches into one AS3 util-class, this is what we came up with:
package com.apdevblog.utils
{
import flash.external.ExternalInterface;
import flash.net.URLRequest;
import flash.net.navigateToURL;
/**
* Collection of URL util functions.
*
* ActionScript 3.0 / Flash 9
*
* @package com.apdevblog.utils
* @author Philipp Kyeck / phil@apdevblog.com
* @copyright 2008 apdevblog.com
* @version SVN: $Id: URLUtils.as 19 2008-04-08 09:57:50Z phil $
*
* based on script by
* @author Sergey Kovalyov
* @see http://skovalyov.blogspot.com/2007/01/how-to-prevent-pop-up-blocking-in.html
*
* and based on script by
* @author Jason the Saj
* @see http://thesaj.wordpress.com/2008/02/12/the-nightmare-that-is-_blank-part-ii-help
*/
public class URLUtils
{
protected static const WINDOW_OPEN_FUNCTION:String = "window.open";
/**
* Open a new browser window and prevent browser from blocking it.
*
* @param url url to be opened
* @param window window target
* @param features additional features for window.open function
*/
public static function openWindow(url:String, window:String = "_blank", features:String = ""):void
{
var browserName:String = getBrowserName();
if(getBrowserName() == "Firefox")
{
ExternalInterface.call(WINDOW_OPEN_FUNCTION, url, window, features);
}
//If IE,
else if(browserName == "IE")
{
ExternalInterface.call("function setWMWindow() {window.open('" + url + "');}");
}
//If Safari
else if(browserName == "Safari")
{
navigateToURL(new URLRequest(url), window);
}
//If Opera
else if(browserName == "Opera")
{
navigateToURL(new URLRequest(url), window);
}
//Otherwise, use Flash's native 'navigateToURL()' function to pop-window.
//This is necessary because Safari 3 no longer works with the above ExternalInterface work-a-round.
else
{
navigateToURL(new URLRequest(url), window);
}
}
/**
* return current browser name.
*/
private static function getBrowserName():String
{
var browser:String;
//Uses external interface to reach out to browser and grab browser useragent info.
var browserAgent:String = ExternalInterface.call("function getBrowser(){return navigator.userAgent;}");
//Determines brand of browser using a find index. If not found indexOf returns (-1).
if(browserAgent != null && browserAgent.indexOf("Firefox") >= 0)
{
browser = "Firefox";
}
else if(browserAgent != null && browserAgent.indexOf("Safari") >= 0)
{
browser = "Safari";
}
else if(browserAgent != null && browserAgent.indexOf("MSIE") >= 0)
{
browser = "IE";
}
else if(browserAgent != null && browserAgent.indexOf("Opera") >= 0)
{
browser = "Opera";
}
else
{
browser = "Undefined";
}
return (browser);
}
}
}
You also have to set the wmode inside your containing html file to “opaque” and the allowScriptAccess to “always”.
// emdbedding swf w/ swfobject
var width="400";
var height="150";
var flashVersion = "9.0.0";
var movie = "navigatetourl.swf";
var movieName = "flashMovie";
var bgColor = "#000000";
var express = "expressInstall.swf";
var replaceDiv = "flashcontent";
var flashvars = {};
var params = {};
params.wmode = "opaque";
params.allowScriptAccess = "always";
var attributes = {};
attributes.id = "myFlashMovie";
swfobject.embedSWF(movie, replaceDiv, width, height, flashVersion,
express, flashvars, params, attributes);
Here is also a working example: navigateToURL example.
And you can download the sourcecode.
cheers