2

我正在尝试调用mailto:存储在变量中的 URI。当我做window.location.href = mailto_link;Firefox 给我以下错误:

NS_ERROR_ILLEGAL_VALUE: Component returned failure code: 0x80070057        
(NS_ERROR_ILLEGAL_VALUE) [nsIDOMLocation.href] 

window.location.href = mailto_link;` 

什么 IE 说:

Object doesn't support this property or method

该代码适用于 Chrome,但不适用于 IE 或 Firefox。

我原来的功能:

function email()
{
    var nom = $('#nom').val();nom = encodeURIComponent(nom);
    var compagnie = $('#compagnie').val();compagnie = encodeURIComponent(compagnie);
    var rue = $('#rue').val();rue = encodeURIComponent(rue);
    var ville = $('#ville').val();ville = encodeURIComponent(ville);
    var province = $('#province').val();province = encodeURIComponent(province);
    var cp = $('#cp').val();cp = encodeURIComponent(cp);
    var remarques = $('#remarques').val();if(remarques ==""){remarques = "Aucune remarque.";}remarques = encodeURIComponent(remarques);
    var quantite = $('#quantite').val(); 
    var email= "someEmail@somedomain.com";
    var subject= "Nouvelle commande";
    var body_message= "%0D%0D%0D%0D"+nom+"%0D"+compagnie+"%0D"+rue+"%0D"+ville+", "+province+"%0D"+cp+"%0D%0D%0DRemarques:"+remarques+"%0D%0D Quantit%E9:"+quantite;
    var mailto_link = 'mailto:'+email+'?subject='+subject+'&body='+body_message;
    window.location.href = mailto_link;
}

更新 1

我发现了导致 IE 问题的原因,尽管我仍然希望为 Firefox 解决它。IE 的问题是我有一个console.log();无法识别的(IE8 和更低版本)。

这是console.log()mailto_link的内容:

mailto:someEmail@someDomain.com?subject=Nouvelle commande&body=Charger %0Dmodems des %CEseulement%0D%0D%0D%0Djshad%0Daskjda%0Daskdj%0Daskdj, askdj%0DJ9P%204A1%0D%0D%0DRemarques:asldk%0D%0D Quantit%E9:14 
4

2 回答 2

1

Firefox 显然无法处理 URL 中大于 128 的 ISO 8859-1 字符。如果您从记录的示例中删除%CE(Î) 和%E9(é),问题就会消失。不幸的是,我能想到的唯一解决方法需要手动替换扩展字符,例如使用等效字符(可能是 HTMLEntities*)。由于在 Javascript 中没有本地函数可以这样做,这可能会很烦人。

**因为 HTMLEntities 仅在 HTML 上下文中正确呈现,而 mailto: URI 生成纯文本消息正文,这是一个不完美的解决方案。下面是一个函数,它将执行此操作,但消息将具有实例é等。正如您在评论中提到的那样,也许更方便的解决方案是将重音字符转换为前 128 个 ASCII 字符中的等价字符。*


function encodeISO8859 (str) {
    var rstr="";
    for(var i=0; i<str.length; i++) {
        var c = str.charCodeAt(i);
        if(c>191&&c<=255&&!(c==215||c==247)){
            console.log(c);
            rstr += "&#"+c+";";
        } else {
            rstr += str.charAt(i);
        }
    }
    return rstr;
}

这会将ISO8859-1 字符集中的任何字符(见页面底部)转换为等效的 HTMLEntity。对 URI 使用此 BEFORE 编码:

var nom = $('#nom').val();nom = encodeURIComponent(encodeISO8859(nom));

当然,只有当重音字符对于理解是绝对必要的并且使用相同基本字符(如A)的许多重音字符之间可能存在重叠时才这样做。

于 2012-11-19T21:33:54.467 回答
0

我试过了,它对我有用,但我认为错误代码可能与您在 Firefox 或 IE 中安装的插件之一有关,重新启动浏览器应该会有所帮助。

这可能是由一个插件/用户脚本引起的,该插件/用户脚本正在页面上进行一些操作/修改,而​​ google 重定向您执行搜索结果。您可以尝试在使用安全模式解决 Firefox 问题中运行 firefox 并查看错误是否仍然出现。如果不禁用所有插件并重新启用它们,以找出究竟是哪个插件导致它(您可能必须在每个插件之后重新启动浏览器)。

更多的

于 2012-11-19T18:20:33.370 回答