我正在尝试调用存储在变量中的 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 和更低版本)。
这是 mailto_link 内容的 console.log()
:
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
最佳答案
Firefox 显然无法处理 URL 中超过 128 个的 ISO 8859-1 字符。如果从记录的示例中删除 %CE
(È) 和 %E9
(é),问题就会消失。不幸的是,我能想到的唯一解决方法是手动将扩展字符替换为等效字符(可能是 HTMLEntities*)。由于在 Javascript 中没有这样做的 native 函数,这可能会非常烦人。
**因为 HTMLEntities 只能在 HTML 上下文中正确呈现,并且 mailto: URI 会生成纯文本消息正文,所以这是一个不完美的解决方案。下面是执行此操作的函数,但消息将包含 é
等实例。也许更方便的解决方案是 convert accented characters to their equivalents in the first 128 ASCII characters正如您在评论中提到的。*
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 character set 中的任何字符(见页面底部)转换为等效的 HTMLEntity。在 URI 编码之前使用这个:
var nom = $('#nom').val();nom = encodeURIComponent(encodeISO8859(nom));
当然,只有在重音字符对于理解来说绝对必要时才这样做,并且许多使用相同基本字符(如 A
)的重音之间可能会重叠。
关于javascript - 如果值在变量中,Firefox 和 IE 不会调用 window.location.href,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13459487/