2011-08-10 139 views
0

因此,我在這個項目中有幾個SWF,我需要找到一種方法來確保只有這些SWF中的一個的單個實例可以加載。單個SWF應用程序實例。 AS3

例如,無法在2個不同的瀏覽器中同時打開2個不同的應用程序SWF,也不能在同一臺計算機上同時打開兩個標籤。

的LocalConnection似乎是解決這一問題的最佳解決方案,但是,我們遇到的問題與Internet Explorer 9

private var lc:LocalConnection = new LocalConnection() 

try 
{ 
     lc.connect ("Main"); 
     //continue 
} 
catch (e:Error) 
{ 
     //swf exists. 
} 

看來IE9專門似乎不會立即銷燬SWF。刷新頁面可以顯示「Swf Exists」,幾秒鐘後刷新可以修復問題。

有誰知道爲什麼會發生這種情況?

失敗了。有誰知道是否有退出事件?例如,當SWF終止時,有沒有辦法在終止之前捕獲該事件並手動關閉本地連接?

onApplicationExit(e:Event): void 
{ 
    lc.close(); 
} 

最後,有沒有人有任何其他方法可以用來嘗試實現單個swf實例?

回答

1

您可以使用SharedObject存儲一個標誌,不管一個SWF是否已經打開。如果該標誌設置爲true,則在啓動時關閉第二個swf。

並在第一個SWF關閉時重置該標誌。 可能比LocalConnection更容易處理。

因爲共享對象沒有,你可以設定一個期限,也許你可以用一些超時工作:

編輯

從添加評論我的東西爲創建一個唯一的ID您SWF並每5秒向SharedObject寫入一個ID和一個時間碼。每當SWF打開時,您都會比較ID並檢查時間碼是否大於5-10秒。如果是,請關閉它,如果不覆蓋sharedobject。類似的東西...

+0

謝謝Pkyeck。 但是,這不會也歸結爲某種Stage.Exit事件? 因爲如果用戶關閉瀏覽器,沒有辦法重置共享對象上的標誌?(即以同樣的方式無法關閉LocalConnection)。 – Clark

+0

嗯,你是對的。認爲IE的東西是一個不同的問題。也許你可以用某種超時工作:爲SWF創建一個唯一的ID並且每5秒向SharedObject寫入一個ID和一個時間碼。每當SWF打開時,您都會比較ID並檢查時間碼是否大於5-10秒。如果是,請關閉它,如果不覆蓋sharedobject。像那樣的東西... – pkyeck

0

有沒有直接的方式來捕捉閃存的頁面關閉事件,但JavaScript爲您提供了一種方式。我會嘗試以下事情:

添加一個window.onbeforeunload JavaScript監聽器到您的網頁,並用它來調用您的Flash電影中的清理功能(這將立即關閉本地連接)。爲了讓你的Flash電影聽javascript調用看看ExternalInterface.addCallback。

0

在每個加載的swf中,當該片段被初始化時設置一個靜態變量。然後在你的主剪輯中,檢查該變量是否不等於null。如果是這種情況,那麼您已經加載了該swf,並且可以忽略該加載。

作爲一個額外的好處,如果您將靜態變量的值設置爲加載的swf的文檔類別,那麼您也將引用加載的swf。