【问题标题】:ES6 spread syntax IE not supported不支持 ES6 扩展语法 IE
【发布时间】:2016-08-01 10:05:40
【问题描述】:

我有一个 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'))
      });
    });

【问题讨论】:

  • Array.prototype.slice.call(document.querySelectorAll('.row'))
  • 你可以只使用 Babel。
  • 当你放弃对旧浏览器的支持时,使用抽象和升级来代替 babel。 Javascript 是脚本,但很快就会转移到您必须编译的地方。我不是火箭科学,但我们正在让它变得……

标签: javascript internet-explorer-11


【解决方案1】:

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

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 就是这样一种转译器。

【讨论】:

  • 性能不佳的选项可能是for 循环。 for 循环允许在不支持 Array.filter() 的非常旧的浏览器上进行一些过滤。
  • @IK 你可以继续babeljs.io/repl 尝试并转换简单的东西。
  • 听起来是个好主意。让我试一试!谢谢。这个链接应该可以用于我认为的所有 ES6 转换代码。
  • @IK 它确实涉及向您的工具链中添加一个工具,是的。
  • 使用正则表达式解决方案,只需将正则表达式更改为/\b(?:row|row1|row2)\b/,意思是“一个单词边界,然后rowrow1row2,然后另一个单词边界。”跨度>
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2017-12-24
  • 1970-01-01
相关资源
最近更新 更多