如何在不覆盖选项卡内容的情况下使用书签通过电子邮件发送指向当前页面的链接?

Mik*_*Eng 2 javascript google-chrome bookmarklet

我正在尝试创建一个 Chrome JavaScript 书签,它将打开我的电子邮件处理程序以撰写一封电子邮件,其正文包含指向当前页面的链接,主题是页面的标题。我找到了这个指南,它建议在书签中使用以下代码:

javascript:document.location="mailto:?subject="+document.title+"&body="+escape(document.location);
Run Code Online (Sandbox Code Playgroud)

这有效,但有一个恼人的行为,即用文字mailto链接位置替换当前选项卡的内容:

显示文字 mailto 链接的 Chrome 窗口

如何修改 JavaScript 以便书签通过邮件发送链接,但在浏览器中保留原始页面内容?

我试过:

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

  2. location.reload()在分号后添加,如下所示:

    javascript:document.location="mailto:?subject="+document.title+"&body="+escape(document.location); location.reload();
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. location.reload()在分号前添加,如

    javascript:document.location="mailto:?subject="+document.title+"&body="+escape(document.location) location.reload();
    
    Run Code Online (Sandbox Code Playgroud)

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

我宁愿不为此使用扩展名,因为:

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

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

Mak*_*yen 5

您可以使用 window.open()

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

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

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

清洁剂:使用 <iframe>

对于这种用途,使用<iframe>. 以下书签<iframe>document.bodyusing的末尾添加了insertAdjacentHTML()。添加<iframe>到文档将导致mailto您的浏览器评估 URL。然后浏览器会告诉您的电子邮件程序打开一个发送电子邮件窗口供您发送电子邮件。

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);})()
Run Code Online (Sandbox Code Playgroud)

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