为什么Chrome中的mailto链接与POST请求冲突?

7
我不确定问题是否正确,但这是情况。我有一个网页,其中包含两个POST请求,这些请求在一段时间内开放(响应不应立即返回),而我可以在页面上做其他事情。我还在页面上放置了一个mailto链接。由于某种原因,在Chrome中,当我单击该链接时,这两个请求会立即返回错误。我还注意到,在Chrome中的控制台中,点击mailto链接时显示为GET请求事件。这里发生了什么?即使Chrome将mailto链接视为请求,为什么它会与页面上的任何其他请求发生冲突?
在Firefox中,mailto链接对请求没有任何影响,它们只是继续工作并等待服务器响应。此外,该链接本身似乎不是任何类型的请求。顺便说一下,mailto打开一个Outlook消息窗口(在Chrome中这部分功能正常,只是请求失败)。
另外,以防万一,我使用jQuery $.ajax来启动请求。
有人指出,也许Chrome将mailto链接视为常规链接的一部分,因此具有某些副作用。那么问题就变成了如何将mailto链接与页面上的请求组合起来?我不能用表单替换链接。

张贴代码可能更有帮助。 - Kumar
不确定我可以发布什么内容来帮助。邮件链接非常平凡。而且$.ajax请求也很普通,实际上它们最开始是从jQuery的网站复制粘贴过来的。唯一不寻常的事情是响应并不会立即返回。它们都在domready时发送,并在等待服务器响应的同时保持静止。 - Ilia Draznin
它还会取消GET请求(例如,如果您有跟踪事件的逻辑)。 - James Skemp
5个回答

7

我最近遇到了这个问题。在Chrome中,mailto:或任何其他应用URI实际上都会出现这种情况。我使用的解决方法是在iframe中加载URL:

$('body').append('<iframe id="mailto-launcher"></iframe>');
$('#mailto-launcher').get(0).contentWindow.location.href = 'mailto:?subject=test';

你还可以对该iframe进行样式设置,使其在页面外渲染(使用绝对定位等方法)。这将启动邮件客户端并保持文档的AJAX请求不中断。

1

谷歌分析支持捕获链接点击,发送请求到GA,等待100毫秒然后更新URL。100毫秒应该足够完成跟踪请求。 https://support.google.com/analytics/answer/1136920?hl=en

示例很笨重,下面是一个修改版本,可以自动处理所有链接(包括使用javascript创建/使用AJAX加载的链接):

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script>
  function trackOutboundLink(event){
    var url = event.currentTarget.href;
    try {
      _gaq.push(['_trackEvent', 'Outbound Links' , url]);
    } catch(err){}

    setTimeout(function() {
      document.location.href = url;
    }, 100);

    return false;
  }

  $(document).on('click', 'a[href]', trackOutboundLink);
</script>

0

不确定,但Chrome可能会将单击mailto链接视为导航到新页面。

它具有所有副作用,但没有真正的影响(例如重新加载页面)。


嗯,这实际上可能是那个。但那会有点愚蠢,不是吗?为什么会这样对待它? - Ilia Draznin
@ilia:为什么不行呢?只是因为请求使用了除httphttps之外的处理程序吗?在页面上一次只允许有一个基本请求。点击链接会取消通过先前单击的某些其他链接加载的内容。 - Lightness Races in Orbit
抱歉,我不知道...也许Chrome处理它们的方式不同,也许从开发角度来看让它们像下载一样工作更容易(例如运行默认的电子邮件处理程序)。编辑:或者可能是Tomalak说的那样。 ;) - Zirak
@Tomalak "只是因为请求使用了除http或https之外的处理程序吗?" 是的! :) 这不是一个标准链接,它的行为(至少部分)不像一个标准链接,所以它不应该引起这个问题。我实际上尝试给它添加了target blank,它可以工作,但也会打开一个新的空白标签页。 叹气 - Ilia Draznin
@ilia:这是一个完全标准的链接。 - Lightness Races in Orbit

0

我也遇到了同样的问题,向Mixpanel发送的POST请求被取消了。我们的解决方法是使用1秒的setTimeout调用mailto:链接,这样就可以正常工作了。虽然不太好看,但在周五晚上10点的办公室里,这听起来还算不错 :)


0
这个问题导致我无法在点击电子邮件链接时向Google Analytics发送事件。
为了解决这个问题,我将mailto:链接的目标更改为_blank。这会导致浏览器在打开Mail.app之前打开一个空白标签页,但GA集成现在正常工作。

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