忽略IE11中的“语法错误”

时间:2019-04-12 08:21:25

标签: javascript internet-explorer

我有一个(ASP.Net)应用程序,该应用程序具有以下客户端Javascript,以便于复制到剪贴板:

var ua = window.navigator.userAgent;
var is_ie = /MSIE|Trident/.test(ua);

if (is_ie) {
    var input = document.getElementById("inputcopy"); // select it

    input.value = text;
    input.select();
    document.execCommand("copy");
    this.focus();
}
else {     
    navigator.clipboard.writeText(text).then(() => {
        writeLog('Copy successful');
        if (showalert == true) alert('Copied to clipboard');
    }).catch(() => {
        writeLog('Copy failed');
        if (showalert == true) alert('Copy to clipboard failed');
    });           
}   

我们需要与所有“现代”浏览器兼容-Chrome,Firefox和不要射击Messenger IE11。前两个很好,但是后一个...

由于IE不支持navigator.clipboard,因此我已经安装了if (is_ie),效果很好。但是,IE不了解非IE部分中的Promise,并在

上抱怨“无效语法”

navigator.clipboard.writeText(text).then(() => {

即使它永远不会真正运行它。

如何告诉IE忽略那部分代码,或者解决此问题?我看过有条件地基于浏览器加载一个单独的JS文件,但这看起来并不有趣。有更好的选择吗?

2 个答案:

答案 0 :(得分:1)

您无法使JavaScript解析器跳过将不会运行的程序部分的语法(要彻底简化这种情况:它仍然需要解析程序的那一部分才能找到{{1} } $transaction->to->name; $transaction->from->name; 块的结尾。

编写您的JS以使用IE支持的语法(即使用函数表达式而不是箭头函数),或者将您的JS转换为IE支持的版本(使用Babel之类的工具)。

答案 1 :(得分:0)

根据OP的建议添加我的评论作为答案。

您可以尝试使用eval()解决此问题。 eval()的作用是将字符串解析为可执行代码。从字面上看,这将使IE忽略此代码,因为它无论如何都不会执行。

是的,我们通常不使用eval(),但是这种罕见的情况是使用它的完美理由。

以下是有关评估的一些资源:Why is using the JavaScript eval function a bad idea?

或者,如果可能的话,只需使用promise polyfill。


正如@Quentin解释的那样,仅使用函数表达式即可轻松解决此问题,而无需使用eval()