在Chrome浏览器(通过https)中,框架内的mailto链接无法工作

27

我在页面上有一个mailto链接。当页面单独加载时,它按预期工作。

但是当通过Chrome的frameset加载页面时,什么也不会发生。开发者工具加载后,会显示错误信息"[blocked] The page at https://mysite.com ran insecure content from mailto:..."

我应该如何修复或绕过此问题?


1
tel:链接也会受到影响。相同的解决方案适用。 - Álvaro González
7个回答

33

是的,使用"top"是诀窍,但你可以仅使用HTML来完成它!

<a target="_top" href="mailto:...">email</a>

这太棒了。它允许在Chrome浏览器中使用iframe时mailto链接正常工作。非常感谢!!! - rrudland
还修复了使用URL框架掩码转发URL时的mailto:链接! - Warpling
我建议使用_blank而不是_top。如果用户将基于Web的电子邮件客户端设置为默认电子邮件工具,则电子邮件客户端页面将使用_top替换父页面。 - Adamy
@Adamy,是的,iframe示例是一个好的例子。但是,您需要使用_self而不是_blank。_blank会导致打开一个新的空白未命名选项卡。_top会触发window.onbeforeunload事件。如果顶层框架正在观察window.onbeforeunload事件,您可能会看到警告信息,例如“您确定要离开此页面吗?”(如果您点击是,mailto链接仍然可以正常工作。)请参阅此plunker http://embed.plnkr.co/12QvXVVbSKjuVT1cjrc0/preview。请注意,plunker的预览窗口在iframe中,如果您单击编辑然后运行,您将看到_top示例的onbeforeunload警告消息。 - kendsnyder
@kendsnyder 感谢您的建议。然而在我的情况下,由于我将 Gmail(在 Chrome 中)设置为默认的电子邮件应用程序,当我单击链接时,_self 并不起作用。 - Adamy
显示剩余2条评论

29

最近我也遇到了一个iframe的问题。使用顶层框架解决了问题,并且应该兼容所有主流浏览器。

window.top.location = 'mailto:...';

那么你需要编写一个JavaScript的onclick(或类似的东西)来处理这个mailto链接?我只是在寻找这个解决方案的语法。 - Chris
9
是的,使用 "top" 是诀窍,但你可以仅使用 HTML 就完成它!电子邮件 - kendsnyder
嗨,我今天刚遇到了这个问题...这个解决方案有效。但是我想知道为什么它有效?为什么将目标设置为“_top”就可以了?如果锚链接在iFrame之外,浏览器不会检查安全性吗? - jmesolomon
尝试了所有的组合,这是唯一一个在Chrome中有效且不需要打开空白窗口的方法。 - Antoni4
@kendsnyder 我正在使用一个接受 onClick 的组件,对我来说这是唯一有效的方法。我不能使用 HTML 来完成这个,也就是说,它需要通过回调以编程方式触发。 - Antoni4

6

这是我最终得出的解决方案: 已经测试过Chrome、Firefox、IE6、IE7、IE8、IE9、IE10、IE11、Safari

$("a[href^='mailto:']").on("click",function() {
    window.top.location = $(this).prop("href");
    return false;
});

奇怪的是,我无法让它工作 - 它似乎在jquery内部死掉了(我们仍在使用V 1.6.1)。但是一旦我改用click方法,它就很好地工作了。不错。 - Dale K
是的,在较新版本的jQuery中,“on”是新的“click”。 - Davin

3
这也可以起作用,并且不会关闭包含 Facebook 的窗口。
<a href="mailto:..." target="_blank">...</a>

或者

$("a[href^='mailto:']").attr('target','_blank');

3

添加 target="_top" 或 "_blank" 或 "_parent"

<a target="_top" href="mailto:a@b.c">电子邮件1</a>

<a target="_top" href="mailto:a@b.c">电子邮件2</a>


1
可能是因为您的父框架是https,但Chrome现在似乎将mailto链接视为不安全。
当我通过触发mailto链接时,遇到了类似的问题。
window.location = 'mailto:...'

将其改为以下内容可以解决该问题。
window.open( 'mailto:...')

这听起来像是一个 bug,那么我应该提交一个 bug 报告? - Dale K
好的,你的解决方法确实打开了一个新邮件,但它也会打开一个新的空白标签页/窗口,这不是我们想要的。我已经向Google提交了一个错误报告。 - Dale K
1
是的,它确实可以。我们不得不编写脚本来立即关闭它,这仍然有点糟糕。 - Hugh

0

这是我的解决方法,直到Chrome的bug被修复:

$.browser.chrome = /chrom(e|ium)/.test(navigator.userAgent.toLowerCase()); 

if($.browser.chrome){
     myWindow=window.open("mailto:"+eml+"?subject="+msb,'','width=50,height=50');
     myWindow.close();
} else {
    window.location.href = "mailto:"+eml+"?subject="+msb;
}

对于Chrome浏览器,可以使用window.open()方法创建一个实例并立即关闭该实例。小窗口会在短时间内“闪烁”,但可以完成任务。这是一种“不太优雅”的解决方案,但与Chrome的bug一样。

对于其他浏览器,可以使用window.location()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接