我正在尝试调用存储在变量中的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
答案 0 :(得分:1)
Firefox显然无法处理网址中128以上的ISO 8859-1字符。如果从已记录的示例中删除%CE
(Î)和%E9
(é),问题就会消失。遗憾的是,我能想到的唯一解决方法是手动替换具有等效字符的扩展字符(可能是HTMLEntities *)。由于在Javascript中没有本机功能,这可能会非常烦人。
**因为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使用此BEFORE编码:
var nom = $('#nom').val();nom = encodeURIComponent(encodeISO8859(nom));
当然,只有当重音字符对于理解是绝对必要的时才这样做,并且在使用相同基本字符的许多重音之间可能存在重叠(如A
)。