[javascript] 对于将gmail作为默认邮件处理程序的用户,如何在新选项卡中打开mailto链接?


Answers

我收到了在ownCloud Contacts中实现此请求的请求 ,虽然我也认为它有点hackish,似乎没有另一种方法来检测mailto处理程序是否设置为webmail地址。

无需外部文件即可实现此示例。

注意:此示例需要jQuery,但它可能会被重写为严格的javascript。

为了避免使用data-mailto或其他技巧,您可以改为拦截处理程序:

$(window).on('click', function(event) {
    if(!$(event.target).is('a[href^="mailto"]')) {
        return;
    }

    // I strip the 'mailto' because I use the same function in other places
    mailTo($(event.target).attr('href').substr(7));
    // Both are needed to avoid triggering other event handlers
    event.stopPropagation();
    event.preventDefault();
});

现在为mailTo()函数:

var mailTo = function(url) {
    var url = 'mailto:' + data.url;
    // I have often experienced Firefox errors with protocol handlers
    // so better be on the safe side.
    try {
        var mailer = window.open(url, 'Mailer');
    } catch(e) {
        console.log('There was an error opening a mail composer.', e);
    }
    setTimeout(function() {
        // This needs to be in a try/catch block because a Security 
        // error is thrown if the protocols doesn't match
        try {
            // At least in Firefox the locationis changed to about:blank
            if(mailer.location.href === url 
                    || mailer.location.href.substr(0, 6) === 'about:'
            ) {
                mailer.close();
            }
        } catch(e) {
            console.log('There was an error opening a mail composer.', e);
        }
    }, 500);

}

我将超时时间减少到500.为我工作,让我们看看用户在推送时的内容;)

如果您想避免打开新的标签/窗口,可以使用iframe。 这将需要额外的请求,但如果您自己使用网络邮件则不那么烦人。 这对于ownCloud是不可行的,因为默认情况下Content-Security-Policy非常严格,并且不允许将“外部”URL注入iframe(未经过多次测试):

var mailTo = function(url) {
    var url = 'mailto:' + data.url, $if;
    try {
        $if = $('<iframe />')
            .css({width: 0, height: 0, display: 'none'})
            .appendTo($('body'))
            .attr('src', url);
    } catch(e) {
        console.log('There was an error opening a mail composer.', e);
    }
    setTimeout(function() {
        try {

            if($if.attr('src') !== url 
                    && $if.attr('src').substr(0, 6) !== 'about:'
            ) {
                window.open($if.attr('src'), 'Mailer');
            }
        } catch(e) {
            console.log('There was an error opening a mail composer.', e);
        }
        $if.remove();
    }, 500);

}
Question

在网页上,mailto链接打开默认的电子邮件客户端。 既然Chrome提供了将Gmail设置为默认电子邮件客户端的功能,则某些用户可以在同一窗口中打开这些链接,从而使他们远离他们点击链接的页面(他们不喜欢)

我已经尝试将目标_blank添加到链接,这对gmail用户非常有用,但会让Outlook用户感到愤怒,因为每次单击mailto链接时都会打开一个新的空白选项卡。

我有办法检测默认的电子邮件处理程序,并为这两类用户提供良好的体验?






Related