如何使用书签将 link 通过电子邮件发送到当前页面而不覆盖选项卡的内容?

How to email a link to the current page using a bookmarklet without overwriting the content of the tab?

我正在尝试创建一个 Chrome JavaScript 小书签,它将打开我的电子邮件处理程序以撰写一封包含 body 的电子邮件,其中包含一个 link 到当前页面和主题是页面的标题。我发现 this guidance,它建议在小书签中使用以下代码:

javascript:document.location="mailto:?subject="+document.title+"&body="+escape(document.location);

这行得通,但有一个烦人的行为,即还会用文字 mailto link 位置:

替换当前选项卡的内容

如何修改 JavaScript 以便小书签发送 link,但在浏览器中保留原始页面内容?

我试过了:

  1. 在JavaScript的末尾添加return false。这阻止了任何事情的发生(甚至生成了电子邮件)。

  2. 分号后加location.reload()如:

    javascript:document.location="mailto:?subject="+document.title+"&body="+escape(document.location); location.reload();
    

    重新加载了页面,但没有生成电子邮件。

  3. 分号前加location.reload()

    javascript:document.location="mailto:?subject="+document.title+"&body="+escape(document.location) location.reload();
    

    那什么也没做(没有重新加载页面或生成电子邮件)。

我不想为此使用扩展程序,因为:

  1. 我发现在需要/不需要时显示/隐藏书签比处理显示/隐藏扩展图标更容易。

  2. 我不想处理扩展的激活、允许隐身和浏览器版本兼容性问题。

你可以使用window.open()

不覆盖当前页面位置的明显解决方案是使用 window.open().

javascript:void(window.open("mailto:?subject=" + encodeURIComponent(document.title) + "&body=" + encodeURIComponent(document.location)));

但是,这会创建一个需要关闭的空白选项卡,并且经常会遇到弹出窗口阻止的问题。在某些情况下,可以通过编程方式关闭此选项卡,但这取决于您的浏览器、某些浏览器设置、弹出窗口阻止程序扩展等。

清洁剂:使用 <iframe>

对于此用途,使用 <iframe> 同样有效,而且不易出现问题。以下小书签使用 insertAdjacentHTML()document.body 的末尾添加了一个 <iframe>。将 <iframe> 添加到文档将导致 mailto URL 被您的浏览器评估。然后浏览器会告诉您的电子邮件程序打开一个发送电子邮件 window 供您发送电子邮件。

javascript:(function(){var now=Date.now(); document.body.insertAdjacentHTML('beforeend', '<iframe id="iframe-to-delete-' + now + '" src="mailto:?subject=' + encodeURIComponent(document.title.trim()) + '&body=' + encodeURIComponent(document.location) + '" style="display: none !important"></iframe>'); setTimeout(() => document.getElementById('iframe-to-delete-'+now).remove(), 3000);})()

一旦您的电子邮件程序打开发送电子邮件对话框,小书签就可以删除 <iframe>,这样页面就不会受到干扰。