在視窗間通訊(二):使用ActionScript

在視窗間通訊(二):使用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);
}

按此連結下載本文的範例原始檔。

Posts created 486

5 thoughts on “在視窗間通訊(二):使用ActionScript

  1. 老師您好

    我學習了您此篇文章利用LocalConnection做通訊
    也下載了範例檔做研究
    只是發現一個問題 如果我開第二個視窗 那麼第二個視窗就會失去作用
    例:
    http://shop.big.com.tw/LC/test.html
    第一個視窗功能都正常
    我用ctrl+n 開新視窗
    第二視窗 就會失去作用

    請問是什麼原因呢?
    又該如何解決呢?

    請老師不吝指導  謝謝您!!

  2. 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

  3. 老師您好
    我想請教如果我想用javascript控制flash載入圖片
    我該如何處理
    您教學裡提到用javascript控制網頁跟網頁之間
    也用action script 控制flash與flash之間的動作
    但我想做一個網頁
    用一些縮圖放在網頁裡
    點選了縮圖之後
    旁邊的flash就可以去載入此縮圖的原始圖檔
    我該如何寫javascript與flash 中的actionscript?
    謝謝

  4. hi jason:

    「自動輪流播放Flash的FLV視訊檔」(https://swf.com.tw/?p=129)這篇文章,3/2日的讀者回應中,我有提供一個JavaScript + ActionScript的範例,請自行參考。

    thanks,
    jeffrey

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top