仔細探究
原來是因為在一個 HTML 頁面內重複引用 swfobject.js 達三次以上
SWFObject 1.4.2 ~ 1.4.4 內均會覆寫 window.onBeforeUnload 事件
並且將舊的事件指定給 oldBeforeUnload 變數
用意是在關閉視窗、跳頁的時候用來清除資料
重複引用 SWFObject 的結果
造成 oldBeforeUnload 變數名稱衝突
window.onBeforeUnload 事件無窮遞迴執行
雖然說對同一個 js file 重複引用是不良的習慣
可是有些情況卻難以避免
尤其像是 SWFObject,幾乎是只要有 Flash 就會用到的東西
類似的事情也有可能發生在不同 javascript 來源
解決方式便是要避免變數名稱衝突
譬如,用 function scope 暫存變數:
function wrapFunctionCall(innerExecute){
return function(){
alert("innerExecute();");
innerExecute != null ? innerExecute() : null;
};
}
window.>
或者用 anonymous function 虛擬 block scope
(function(){
var oldOnbeforeunload = window.onbeforeunload;
window.
oldOnbeforeunload != null ? oldOnbeforeunload() : null;
}
})();
相關參考資料
SWFObject
UserJS.org - Avoiding User JavaScript conflicts
AS 2.0 將參數與 function 綁在一起
利用function scope 暫存變數
Scope Chain and Memory waste in Flash MX
2007.02.28 更新
SWFObject 1.5 已經修正此問題
不過又發現其它的問題
swfobject.js 與 json.js 同時使用
由於 json.js 替 Object 加入 prototype function
造成 swfobject.js 輸出錯誤的 Flash HTML 標籤
連那些 prototype function 都跑出來了~