2012-03-16 57 views
11

可能與How to open mailto link in Chrome with Window.open without creating a new tab?mailto鏈接(在鉻)正在觸發window.onbeforeunload - 我可以防止這個?

大家好。我有一個表格頁面,我已經把window.onbeforeunload確認,阻止人們離開導航和意外失去他們的變化:

window.onbeforeunload = function(){ 
    if(changed) 
    return "You have unsaved changes. Do you really want to leave this page without saving?"; 
}; 

其中changed是一個變量i設置爲true,當用戶進行任何更改。這很好。不過,我也加入了一些mailto鏈接到頁面,像這樣:

<a class="button button-alt" href="mailto:[email protected]">Report a problem</a> 

即使郵寄地址是不是從頁面(它打開用戶的默認郵件應用程序)進行導航了,它仍然觸發onbeforeunload事件,提示確認框,這是煩人的。我可以在鏈接上設置target="_blank",但用戶被留在空的標籤中。

我可以將mailto鏈接設置爲不觸發onb​​eforeunload事件嗎?我想到了另一個臨時性的javascript變量,它導致onbeforeunload確認不會觸發,但這似乎有點骯髒。無論如何,我會這樣做,而我等待迴應,但是有沒有人有更好的解決方案?

感謝,最大

回答

9

大廈關閉epascarello的解決方案,下面的jQuery代碼應該做的伎倆:

var ignore_onbeforeunload = false; 
    $('a[href^=mailto]').on('click',function(){ 
     ignore_onbeforeunload = true; 
    }); 

    window.onbeforeunload = function() { 
     if (!ignore_onbeforeunload){ 
      return "Halt! you are not supposed to leave!"; 
     } 
     ignore_onbeforeunload = false; 
    }; 
+0

這看起來好多了 - 謝謝! – 2015-02-20 09:29:53

+0

真的嗎?你回答3年後的帖子?大聲笑唯一的區別是添加onclick一個不顯眼的事件...大聲笑 – epascarello 2015-02-20 17:18:44

+0

依賴於jQuery沒有理由,依賴於全局變量。約翰·庫拉克的回答如下更好。它使用隱藏的iframe,完全消除了對JavaScript的需求,更不用說jQuery。然後可以自行包含模板文件中的修復。 – mGuv 2015-11-04 15:57:58

4

添加標記,看看它是否被翻轉,設置該標誌上的鏈接點擊。

var ignore = false 
window.onbeforeunload = function() { 
    if (changed && !ignore) { 
     return "You have unsaved changes. Do you really want to leave this page without saving?"; 
    } else { 
     ignore = false; 
    } 
} 

和鏈接

<a class="button button-alt" href="mailto:[email protected]" onclick="ignore=true">Report a problem</a> 

這將是更好的添加與JavaScript代碼的onclick。

+0

謝謝,是啊,這正是我做的:)它似乎有點hacky ... – 2012-03-16 16:10:25

+0

@MaxWilliams,瀏覽器誰不叫'onbeforeunload'點擊此鏈接?在這種情況下,似乎關閉會被跳過。 – Qwertiy 2016-03-21 10:15:09

1

另一種選擇,也有點哈克但更多的通用方法,使beforeunload忽略某些類型的鏈接:

在beforeunload,檢查導致該beforeunload的鏈接,如果它不是一個HTTP或https鏈接,不要打擾用戶。

不幸的是,檢查導致beforeunload的鏈接並不容易,所以這是一個onclick處理程序和全局變量有點黑客的地方。

var lastClicked = null; 
window.onclick = function(e){ 
    e = e || window.event; 
    lastClicked = e.target 
} 
window.onbeforeunload = function(e){ 
    if (changed && lastClicked && lastClicked.href 
     && lastClicked.href.substring(0,4) == 'http') 
     return "You have unsaved changes"; 
} 

編輯:差點忘了,這個答案來自這裏:https://stackoverflow.com/a/12065766/421243

16

一個非常簡單的修復程序這是做這樣的事情:

<a href="mailto:[email protected]" target="hidden-iframe">Email me</a> 
<iframe name="hidden-iframe" style="visibility:hidden;position:absolute;"></iframe> 

(當然,移動t他風格自己的樣式表,而不是內聯他們)

+0

我遲到了,但剛剛遇到了同樣的問題。這是更好的解決方案。其他人依賴於很多醜陋的JavaScript/jQuery。通過這種方式,您可以使用零JavaScript自行包含html模板中的修復程序。 – mGuv 2015-11-04 15:56:36

+0

不適用於iOS10 – 2016-10-03 11:59:52

+0

這不適用於ios。 – khizar 2017-02-21 17:18:14

相關問題