ES6扩展语法IE不支持

问题描述:

我有一个JavaScript代码,下面给出的是ES6兼容,但IE 11不支持这一点。什么是替代代码,以便它适用于所有浏览器?ES6扩展语法IE不支持

[...document.querySelectorAll('.row')] 

进出口使用此为 '点击' 事件处理:

Array.prototype.slice.call(document.querySelectorAll('.row')) 
    .forEach(function(header) { 
     return header.addEventListener('click', function(e) { 
     headerClick(e, header, header.querySelector('.exy')) 
     }); 
    }); 
+0

'Array.prototype.slice.call(document.querySelectorAll('。row'))' – gcampbell

+2

您可以使用Babel。 – gcampbell

+0

而不是babel,在您放弃对旧版浏览器的支持时使用抽象和升级。 Javascript正在编写脚本,但转移到您很快必须编译的地方。我不是火箭科学,但我们正在使它变成这样...... – Asken

对于所有浏览器,您可以通过callapply(它的工作原理任何阵列状对象)上使用Array.prototype.slice

Array.prototype.slice.call(document.querySelectorAll('.row')) 

绕Y我们更新的问题:

进出口使用此为“点击”事件处理:

Array.prototype.slice.call(document.querySelectorAll('.row')) 
    .forEach(function(header) { 
     return header.addEventListener('click', function(e) { 
     headerClick(e, header, header.querySelector('.exy')) 
     }); 
    }); 

我不会用querySelectorAll为此不惜一切,我会使用事件委托。据推测,所有这些.row元素都在一个普通容器内(当然,最终它们都在body之内,但希望有一个容器比它“更接近”)。随着事件委托,你这样做:

  • 挂钩click只有一次,容器

  • 点击发生时,请查看是否通过你的目标要素之一传递途中在容器上

为您引用代码,这看起来是这样的:

// A regex we'll reuse 
var rexIsRow = /\brow\b/; 
// Hook click on the container 
document.querySelector("selector-for-the-container").addEventListener(
    "click", 
    function(e) { 
     // See if we find a .row element in the path from target to container 
     var elm; 
     for (elm = e.target; elm !== this; elm = elm.parentNode) { 
      if (rexIsRow.test(elm.className)) { 
       // Yes we did, call `headerClick` 
       headerClick(e, elm, elm.querySelector('.exy')); 
       // And stop looking 
       break; 
      } 
     } 
    }, 
    false 
); 

关于更多modern browsers,您可以使用elm.classList.contains("row")而不是正则表达式,但遗憾的是不在IE9或更早的版本中。


这就是说,而不是维护一个单独的代码库,为gcampbell pointed out你可以使用ES6(ES2015)功能在你的代码,然后与转换他们transpiler transpile(当然,在那些可以转换,这是很多)ES5语法。 Babel就是这样一个转译器。

+0

但是,这就像一个安装权? – Neophile

+0

非高性能选项可能是'for'循环。 'for'循环允许在非常旧的浏览器上进行一些过滤,但不支持'Array.filter()'。 –

+1

@IK你可以继续https://babeljs.io/repl/来试用它,并且可以传输简单的东西。 –