如何从Chrome扩展程序打开mailto:链接?

Tra*_*Guy 8 javascript google-chrome google-chrome-extension

我有一个名为Shrtr的网址缩短Chrome扩展程序.现在,它允许用户将缩短的URL复制到剪贴板,但在下一个版本中,我添加了使用mailto:链接(即mailto:?subject=<original page title>&body=<short URL>)通过电子邮件发送缩短的URL的功能.

问题是,你不能只是document.location.href = 'mailto...';从扩展分配.以下两种方法对我有用,但两者都有,我最终在浏览器中打开了一个空白选项卡:

方法1: window.open

var wnd = window.open(emailUrl);
setTimeOut(function() {
    wnd.close();
}, 500);
Run Code Online (Sandbox Code Playgroud)

注意在关闭窗口之前需要等待.这有效(即预先填充邮件客户端新消息对话框),但新选项卡仍保持打开状态.

方法2:使用 chrome.tabs

chrome.tabs.create({ url: emailUrl }, function(tab) {
    setTimeOut(function() {
        chrome.tabs.remove(tab.id);
    }, 500);
});
Run Code Online (Sandbox Code Playgroud)

同样,工作 - 但标签保持打开状态.有任何想法吗?

Gab*_*ary 6

我意识到这是一个老问题,但我自己也有同样的问题,我想出了如何解决问题,所以我想我会分享.

问题源于(我相信)您从扩展程序弹出页面调用以下代码.

chrome.tabs.create({ url: emailUrl }, function(tab) {
    setTimeout(function() {
        chrome.tabs.remove(tab.id);
    }, 500);
});
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,只要创建一个新选项卡,弹出页面就会死掉,并且永远不会执行回调代码.

我们可以通过将代码移动到后台页面中的函数来解决这个问题,后台页面的生命周期与弹出页面无关:

function sendEmail() {
    var emailUrl = "mailto:blah@blah.com";
    chrome.tabs.create({ url: emailUrl }, function(tab) {
        setTimeout(function() {
            chrome.tabs.remove(tab.id);
        }, 500);
    });
}
Run Code Online (Sandbox Code Playgroud)

chrome.extension.getBackgroundPage().sendEmail()从弹出页面调用它.

使用上述方法,将打开默认电子邮件客户端,新选项卡将在500毫秒后自动关闭.


Yip*_*ing 5

var emailUrl = "mailto:blah@blah.com";

    chrome.tabs.update({
        url: emailUrl
    });
Run Code Online (Sandbox Code Playgroud)