在視窗間通訊(二):使用ActionScript
文∕趙英傑
不必藉助JavaScript,在本機電腦上執行的不同Flash影片(例如,位於兩個不同瀏覽器視窗裡的影片),也能透過ActionScript的LocalConnection類別相互傳遞訊息。打從Flash Player 6開始,LocalConnection類別就內建在播放器裡面了。
LocalConnection類別最重要的兩個方法名稱和用途說明如下:
- send(‘連結名稱字串’, 函數名稱, 參數1, 參數2, …):呼叫另一個影片(接收端)上的函數,並可傳遞參數。
- connect(‘連結名稱字串’):在接收端,設定和發送端的連線。
收、發兩端主要是透過「連結名稱字串」建立連線,這個名稱可以任意命名,只要兩端的名稱設定相同即可。下圖是本文「接收端」範例影片的舞台畫面,及各個實體名稱的說明:
其中,link_btn按鈕將在新瀏覽器視窗開啟sender.htm檔,其程式碼如下:
import flash.external.*; link_btn.onRelease = function() { ExternalInterface.call("openWindow", "sender.htm", "myWindow", "width=450,height=560"); };
執行LocalConnection類別程式之前,需先採用new指令建立此類別的實體,然後再用connect()方法指定連線名稱(僅「接收端」需要執行connect()方法)。底下的程式碼首先建立一個稱為rec_lc的LocalConnection類別物件,接著指定連結名稱“abc”:
var rec_lc = new LocalConnection(); rec_lc.connect("abc");
底下的程式則在接收端連結實體上,建立兩個預備讓「傳送端」呼叫的函數:
// 更新文字欄位內容 rec_lc.showMsg = function(msg) { msg_txt.text = msg; }; // 載入指定的JPEG影像 rec_lc.showImg = function(fileName) { img_mc.loadMovie("images/" + fileName + ".jpg"); };
下圖是「發送端」影片的舞台畫面,及各個實體名稱的說明。「圖片區」裡的影片片段實體刻意設定成和外部影像檔同名,只差沒有加上影像副檔名,以利撰寫程式。
傳送端的LocalConnection類別物件實體命名成send_lc:
var send_lc = new LocalConnection();
當用戶按下「傳送」(send_btn)鈕後,底下的程式將透過LocalConnection類別的send()方法,把msg_txt文字欄位值傳遞給接收端(指定“abc”連線名稱)的showMsg()函數:
var btnListener:Object = new Object(); btnListener.click = function () { send_lc.send("abc", "showMsg", msg_txt.text); } send_btn.addEventListener("click", btnListener);
底下是舞台「影片按鈕」的事件處理常式,當圖片被按下時,它將呼叫「接收端」的showImg()函數,並傳遞被點選的影片片段實體名稱:
mac_plus.onRelease = clickImg; thunder.onRelease = clickImg; taipei101.onRelease = clickImg; beatle.onRelease = clickImg; function clickImg() { var fileName=this._name; send_lc.send("abc", "showImg", fileName); }
請按此連結下載本文的範例原始檔。
老師您好
我學習了您此篇文章利用LocalConnection做通訊
也下載了範例檔做研究
只是發現一個問題 如果我開第二個視窗 那麼第二個視窗就會失去作用
例:
http://shop.big.com.tw/LC/test.html
第一個視窗功能都正常
我用ctrl+n 開新視窗
第二視窗 就會失去作用
請問是什麼原因呢?
又該如何解決呢?
請老師不吝指導 謝謝您!!
hi aboo:
根據Adobe的官方文件對LocalConnection類別的說明:
The LocalConnection class has methods which allow you to send data from one SWF file to another without using the fscommand action or JavaScript.
它應該只能做到一對一的通訊。假設有A, B, C三個影片,B, C是接收端,那麼,你可在B收到信息之後,再從B建立另一個連線名稱並使用send()方法,將訊息再傳遞給C,這樣的方式應該可行。
jeffrey
不错-不错。你的文章和博客都不错。有空我会常来转转
老師您好
我想請教如果我想用javascript控制flash載入圖片
我該如何處理
您教學裡提到用javascript控制網頁跟網頁之間
也用action script 控制flash與flash之間的動作
但我想做一個網頁
用一些縮圖放在網頁裡
點選了縮圖之後
旁邊的flash就可以去載入此縮圖的原始圖檔
我該如何寫javascript與flash 中的actionscript?
謝謝
hi jason:
「自動輪流播放Flash的FLV視訊檔」(https://swf.com.tw/?p=129)這篇文章,3/2日的讀者回應中,我有提供一個JavaScript + ActionScript的範例,請自行參考。
thanks,
jeffrey