不支持ES6扩展语法IE

时间:2016-08-01 10:05:40

标签: javascript internet-explorer-11

我有一个下面给出的与ES6兼容的javascript代码,但IE 11不支持此功能。什么是替代代码,以便它适用于所有浏览器?

[...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'))
      });
    });

1 个答案:

答案 0 :(得分:6)

对于所有浏览器,您可以通过Array.prototype.slicecall使用apply(适用于任何类似数组的对象):

Array.prototype.slice.call(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'))
      });
    });

我根本不会使用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)功能,然后使用转换它们的转换器进行转换(好吧,那些可以转换的, ES5的语法很多。 Babel就是这样一个转发器。