代码之家  ›  专栏  ›  技术社区  ›  KenD Abbas Hadavandi

忽略IE11中的“语法错误”

  •  0
  • KenD Abbas Hadavandi  · 技术社区  · 5 年前

    我有一个(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和IE11。前两个很好,但后一个。。。

    因为IE不支持 navigator.clipboard 我拿到了 if (is_ie) 在那里,效果很好。然而,我不知道 Promise 在非IE部分,他对网站上的“无效语法”大发牢骚

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

    即使它永远不会运行它。

    我怎样才能让IE忽略这些代码,或者解决这个问题呢?我已经考虑过基于浏览器有条件地加载一个单独的JS文件,但这看起来并没有多大乐趣。有更好的选择吗?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Abana Clara    5 年前

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

    你可以试试eval()来回避这个问题。什么 eval() 就是将字符串解析为可执行代码。这会让IE忽略这段代码,因为它无论如何都不会执行。

    是的,我们通常不使用 eval() ,但像这样的罕见场景是使用它的完美理由。

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

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


    正如@Quentin所解释的,仅仅使用函数表达式就可以轻松解决这个问题,而不需要使用 eval() .

        2
  •  1
  •   Quentin    5 年前

    你不能让JavaScript解析器跳过它不打算运行的程序部分的语法(过分简化了情况:它仍然需要解析程序的那一部分才能找到正确的语法) } 这就结束了 else

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