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

标签 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 

最佳答案

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/

相关文章:

javascript - native $ 函数应该是什么?

asp.net - Microsoft Ajax Minifier 是否可以拒绝缩小 css 文件中的一行(或区域)?

html - SVG gooey 效果不适用于最新版本的 FireFox

javascript - 无法在 Chrome 47 中获取地理位置

javascript - 我如何使用 :focus when browsers behave differently? Chrome 显示 :focus style after click on buttons. Firefox 将其保留在链接上

google-chrome - 有效的 Lighthouse URL 模式

javascript - Html 5 拖放至输入文件

javascript - 如何从 React 组件中的 React 函数获取值

javascript - 在 Protractor angularjs 上指定了无效或非法的选择器错误

javascript - 使用来自父 Controller 的表达式禁用 angularjs 指令中的项目