2012-03-16 37 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