onbeforeunload事件被a鏈接觸發的問題


onbeforeunload本身並非W3C DOM-Event標准事件,只不過在很多時候國內的流氓做法就是離開頁面,直接彈出收藏本網頁的提示(雖然我很討厭這種做法,但事實上很多公司一直都在這樣默默地強奸用戶…)

 

言歸正傳,我遇到的問題是,自己的游戲上了新浪微游戲,在新浪微游戲的頂部有它們的導航,但是點擊里面一些按鈕時就會觸發游戲里面的window.onbeforeunload事件…

 

搜索了一下,找到這篇文章:BX2047: 各瀏覽器對 onbeforeunload 事件的支持與觸發條件實現有差異

 

根據 MSDN 中描述,IE 的 onbeforeunload 事件可由以下這些條件觸發:

  • 關閉當前瀏覽器窗口。
  • 導航到另一個進入一個新的地址或選擇一個喜歡的位置。
  • 單擊后退,前進,刷新,或主頁按鈕。
  • 點擊一個鏈接到新頁面。
  • 調用 超鏈接的 click 方法。
  • 調用 document.write 方法。
  • 調用 document.open 方法。
  • 調用 document.close 方法。
  • 調用 window.close 方法。
  • 調用 window.open 方法,窗口名稱設置值為 _self。
  • 調用 window.navigate 或 NavigateAndFind 方法。
  • 調用 location.replace 方法。
  • 調用 location.reload 方法。
  • 指定一個 location.href 屬性的新值。
  • 使用 submit 按鍵提交表單,或調用 form.submit 方法。

更詳細的說明可以查考 MSDN 原文:onbeforeunload Event

 

image

 

我寫了一個測試例子:

   1: <div class='links'>
   2:     <a href='#'>test1</a>
   3:     <a href='javascript:;'>test2</a>
   4:     <a href='javascript:;' onclick='alert("test3")'>test3</a>
   5:     <a href='#' onclick='alert("test4")'>test4</a>
   6: </div>
   7:  
   8: <iframe src="http://b.com/xx/xxx.html" frameborder="no" scrolling="no" id="app_frame" name="app_frame" style="height: 600px; width: 100%;"></iframe>

 

如果iframe中有window.onbeforeunload事件,在點擊鏈接test2、test3時會觸發iframe內的window.onbeforeunload事件,test1、test4則不會,盡管頁面與iframe並非同一域。

我知道會有很多辦法避免這種情況發生,比如改父層的實現==,但是這個頁面是新浪微游戲的,我根本不可能有權力去要求什么…

 

所以想到一個辦法是,在window.onbeforeunload函數里,判斷當前鼠標的位置,如果在某一范圍內則認為是點擊了新浪微游戲的那些東東,不顯示提示。

   1: /**
   2:  * 獲取鼠標在頁面上的位置
   3:  * @param ev  觸發的事件
   4:  * @return  x:鼠標在頁面上的橫向位置, y:鼠標在頁面上的縱向位置
   5:  */
   6:  
   7: function getMousePoint(ev) {
   8:   var point = {
   9:     x: 0,
  10:     y: 0
  11:   };
  12:   if (typeof window.pageYOffset != 'undefined') {
  13:     point.x = window.pageXOffset;
  14:     point.y = window.pageYOffset;
  15:   } else if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
  16:     point.x = document.documentElement.scrollLeft;
  17:     point.y = document.documentElement.scrollTop;
  18:   } else if (typeof document.body != 'undefined') {
  19:     point.x = document.body.scrollLeft;
  20:     point.y = document.body.scrollTop;
  21:   }
  22:   point.x += ev.clientX;
  23:   point.y += ev.clientY;
  24:   return point;
  25: }
  26:  
  27: function bindWindowEvent() {
  28:     window.onbeforeunload = function (evt) {
  29:         evt = evt || window.event;
  30:         
  31:         var obj = getMousePoint(evt);
  32:         if (obj.y < 76 && obj.y > 0) {
  33:             return ;
  34:         }
  35:  
  36:         var msg = '嘻嘻嘻';
  37:         
  38:         return msg;
  39:     };
  40: }
  41:  
  42: bindWindowEvent();

 

希望各位達人能提供更好的解決方法…

 

本文參考:

1、BX2047: 各瀏覽器對 onbeforeunload 事件的支持與觸發條件實現有差異

2、onbeforeunload與a標簽在IE中的沖突bug

3、Can I prevent window.onbeforeunload from being called when doing an AJAX call

4、onbeforeunload event

5、Get Cursor Position with JavaScript


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM