2008年10月20日
【技術】在Flash中開啟新視窗(AS 2 & 3)
在Flash中,和外界聯繫的管道,除了可以載入圖形、文件或swf檔供自身使用外,還可以自發性地開啟網頁,或對所在的網頁進行控制,包括呼叫JavaScript、VBScript程式等,既然能夠和JavaScript溝通,自然可以做到例如開啟新視窗的語法,而實際上Flash可用來開啟視窗的方式共有4種,呼叫JavaScript也是其一,可依照不同的目的來選擇,透過這次學習,可舉一反三應用在更高階的網頁溝通程式中。
這四種語法(包含AS 2.0和AS 3.0)如下:
這四種語法(包含AS 2.0和AS 3.0)如下:
- getURL / navigateToURL:最容易,適用各種情形,但控制效果有限。
- getURL / navigateToURL加上JavaScript:容易,IE3.0以前版本不支援。
- ExternalInterface:很容易且更有彈性,IE5.0以後版本才支援(詳見內文)。
- fscommand:複雜,功能強大,但使用場合的限制極多。
下方範例中(若沒有作用改看範例網頁),四個按鈕各展示了四種方式,除了第一種方法可以在獨立的環境下呼叫網頁(如:Flash player),另外三種都須嵌於網頁中才能執行;相對地,第一種語法無法控制視窗的大小和其它設定。
[原始檔下載]
註:在XP的IE 7.0 和 Firefox 3.0 下測試運作正常。
1. getURL / navigateToURL
最簡易的開啟URL語法,使用方式如下:
參數:_blank意指新視窗,可以用_self (開啟至原視窗)、_parent (原視窗的父視窗)、_top (若有網頁框架的頂端視窗)代換,語法簡易明瞭,但無法針對新視窗做更進一步的設定。AS2.0的語法更加簡易:
2. getURL / navigateToURL加上JavaScript
加上JavaScript呼叫,看似和前者難易度相近,但是意義大不相同:
javascript:window.open('target.htm','win','height=200,width=300,toolbar=no'); void(0);
所以也會開啟新視窗,因為是送給自己,所以目標要填_self。這是navigateToURL() 的變化運用,但它還可以有更進階的用法,用以呼叫網頁中的某一個JavaScript函式(範例中用"foo"代表),如此一來就可以在函式中開啟多個視窗,或執行其它動作:
3. ExternalInterface
這個語法不用再利用網址的特性,而是直接呼叫window.open函式,語法相當簡易,可直接傳多個參數(用逗號隔開),但瀏覽器適用的限制較多,在Windows中要IE5.0、Netscape 8.0、Mozilla 1.7.5、Firefox 1.0、Safari 1.3及更新版才支援(不過這些新版本已相當普及),AS2和AS3的語法相同:
4. fscommand
這是最不推薦但也最值得介紹的語法,不推薦的原因是用fscommand來做"開新視窗"這種小功能太過牛刀小用,且使用限制很多;值得介紹的是它可以用在很多其它地方,諸如:切換全螢幕、開啟執行檔、執行VBScript和JavaScript…等等。缺點是只能傳2個參數,想要執行多參數的函式得自行處理字串(AS2和AS3的語法相同):
fscommand的第一個參數可以傳入:quit、fullscreen、allowscale、showmenu、exec…等等,exec可用以執行子目錄下的程式檔,有需要可以更深入研究。
延伸閱讀:
[原始檔下載]
註:在XP的IE 7.0 和 Firefox 3.0 下測試運作正常。
1. getURL / navigateToURL
最簡易的開啟URL語法,使用方式如下:
var url:URLRequest = new URLRequest("target.htm");
navigateToURL(url, "_blank");(隨後出現的target.htm都是假設的目標網頁)參數:_blank意指新視窗,可以用_self (開啟至原視窗)、_parent (原視窗的父視窗)、_top (若有網頁框架的頂端視窗)代換,語法簡易明瞭,但無法針對新視窗做更進一步的設定。AS2.0的語法更加簡易:
getURL("target.htm", "_blank");
2. getURL / navigateToURL加上JavaScript
加上JavaScript呼叫,看似和前者難易度相近,但是意義大不相同:
var jscommand:String = "window.open('target.htm','win','height=200,width=300,toolbar=no');";
var url:URLRequest = new URLRequest("javascript:" + jscommand + " void(0);");
navigateToURL(url, "_self"); // 注意須填_self
這幾行的意思是以網址執行jscommand的指令,相當於在網址列中輸入:javascript:window.open('target.htm','win','height=200,width=300,toolbar=no'); void(0);
所以也會開啟新視窗,因為是送給自己,所以目標要填_self。這是navigateToURL() 的變化運用,但它還可以有更進階的用法,用以呼叫網頁中的某一個JavaScript函式(範例中用"foo"代表),如此一來就可以在函式中開啟多個視窗,或執行其它動作:
var url:URLRequest = new URLRequest("javascript:foo();");
navigateToURL(url, "_self");
AS2.0語法也是比較簡易:var jscommand:String = "window.open('target.htm','win','height=200,width=300,toolbar=no');";
getURL("javascript:" + jscommand + " void(0);");
// 預設即_self
// 若要執行某函式只需一行
// getURL("javascript:foo();");
3. ExternalInterface
這個語法不用再利用網址的特性,而是直接呼叫window.open函式,語法相當簡易,可直接傳多個參數(用逗號隔開),但瀏覽器適用的限制較多,在Windows中要IE5.0、Netscape 8.0、Mozilla 1.7.5、Firefox 1.0、Safari 1.3及更新版才支援(不過這些新版本已相當普及),AS2和AS3的語法相同:
if (ExternalInterface.available)
ExternalInterface.call(
"window.open",
"target.htm",
"win",
"height=200,width=300,toolbar=no");
4. fscommand
這是最不推薦但也最值得介紹的語法,不推薦的原因是用fscommand來做"開新視窗"這種小功能太過牛刀小用,且使用限制很多;值得介紹的是它可以用在很多其它地方,諸如:切換全螢幕、開啟執行檔、執行VBScript和JavaScript…等等。缺點是只能傳2個參數,想要執行多參數的函式得自行處理字串(AS2和AS3的語法相同):
fscommand(上方的語法會丟出2個變數,前者存於command,後者存於args,假設該swf檔案的object id或embed標籤的name屬性設為"someName",這2個變數就會傳到VBScript中的someName_FSCommand()函式,另外allowScriptAccess屬性也要填入"always"或者"sameDomain",接下來的重點在於網頁中的配合。由於樂多會自作主張取代原始碼,所以見範例網頁的原始碼。
"openWindow",
"target.htm|win|height=200,width=300,toolbar=no");
fscommand的第一個參數可以傳入:quit、fullscreen、allowscale、showmenu、exec…等等,exec可用以執行子目錄下的程式檔,有需要可以更深入研究。
延伸閱讀:
引用URL
http://cgi.blog.roodo.com/trackback/7407393
回應文章 

你好我用_self就不動了,但若是用開新頁才有連結到所指定的網頁去,
function HyperLink(event:MouseEvent):void
{
var goto:URLRequest = new URLRequest
("http://club.sunwine.com.tw/sbwine.html");
navigateToURL(goto, "_self");
}
LinkButton.addEventListener(MouseEvent.CLICK, HyperLink);
Posted by 劉思彤
at 2009年09月2日 16:33
hi
我用一樣的程式碼很正常
會不會是你的測試環境的關係?
不要直接在瀏覽器開swf檔 把它嵌在網頁裡試看看
Posted by 熊
at 2009年09月3日 10:47

伊沙熊您好~
最近看到你的網誌,蠻喜歡的。想要請教你~
我想要用navigateToURL加上JavaScript,用你的程式碼測試後,發現會出現"Internet Explorer 無法下載
無法指出的錯誤"的視窗,請問是什麼原因丫??謝謝~
Posted by pig
at 2009年10月21日 10:06
Posted by 熊
at 2009年10月21日 11:15

伊沙熊您好~
謝謝你吶~可以開啟了^^
Posted by pig
at 2009年10月21日 13:24