如果值在变量中,Firefox和IE将不会调用window.location.href

时间:2012-11-19 18:02:26

标签: javascript firefox google-chrome mailto

我正在尝试调用存储在变量中的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 

1 个答案:

答案 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)。