【问题标题】:Symbol.iterator in Internet Explorer doesn't workInternet Explorer 中的 Symbol.iterator 不起作用
【发布时间】:2018-02-13 18:11:04
【问题描述】:

在一个 AngularJS 网络应用程序中,我有这段 JS 代码:

var _loop = function _loop(file) {
  // For each file a reader (to read the base64 URL)
  // and a promise (to track and merge results and errors)
  var promise = new Promise(function (resolve, reject) {
    var reader = new FileReader();
    reader.addEventListener('load', function (event) {
      var type = void 0;
      var name = file.name;

      // Try to find the MIME type of the file.
      var match = mimeTypeMatcher.exec(file.type);
      if (match) {
        type = match[1]; // The first part in the MIME, "image" in image/png
      } else {
        type = file.type;
      }

      // If it's an image, try to find its size
      if (type === 'image') {
        var data = {
          src: reader.result,
          name: name,
          type: type,
          height: 0,
          width: 0
        };

        var image = new Image();
        image.addEventListener('error', function (error) {
          reject(error);
        });
        image.addEventListener('load', function () {
          data.height = image.height;
          data.width = image.width;
          resolve(data);
        });
        image.src = data.src;
      } else if (type) {
        // Not an image, but has a type
        resolve({
          src: reader.result,
          name: name,
          type: type
        });
      } else {
        // No type found, resolve with the URL only
        resolve(reader.result);
      }
    });
    reader.addEventListener('error', function (error) {
      reject(error);
    });
    reader.addEventListener('abort', function (error) {
      reject('Aborted');
    });

    reader.readAsDataURL(file);
  });

  promises.push(promise);
};

var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;

try {
  for (var _iterator = files[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
    var file = _step.value;

    _loop(file);
  }    } catch (err) {
  _didIteratorError = true;
  _iteratorError = err;
} finally {
  try {
    if (!_iteratorNormalCompletion && _iterator.return) {
      _iterator.return();
    }
  } finally {
    if (_didIteratorError) {
      throw _iteratorError;
    }
  }
}

在 Internet Explorer 11 的最后一个块中:

  for (var _iterator = files[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
    var file = _step.value;

    _loop(file);
  }

我得到这个错误:

对象不支持该属性或 'jscomp_symbol_iterator0' 方法

我读到 IE 不支持 Symbol。于是,我尝试将代码改写成:

for (var _iterator = files.length, _step; !(_iteratorNormalCompletion = (_step = _iterator[_iterator++]).done); _iteratorNormalCompletion = true) {
var file = _step.value;

_loop(file);

}

但我有这个错误:

无法读取未定义的“完成”属性

所以,我知道 IE 不支持它。但是是否有另一种方式来编写该循环,受 IE 支持?

【问题讨论】:

  • 是的,但是有没有写我的代码的替代方法?
  • 它不是我的,如果它是一个在 IE 上不起作用的组件,我必须修复它
  • babeljs.io 可能是一个解决方案..?
  • babel-polyfill?
  • 我尝试使用 cdn cdnjs.com/libraries/babel-polyfill 导入 polyfill 但 IE 崩溃

标签: javascript angularjs for-loop iterator internet-explorer-11


【解决方案1】:

在更改代码之前,如果在 Chrome 中一切正常,并且如果您对项目使用编译,则可以考虑在入口点顶部添加

import 'core-js'

目前core-js polyfill library 是实现跨浏览器支持的最简单方法

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 2015-03-16
    • 2012-05-06
    • 2011-06-02
    • 2015-12-17
    • 2013-04-30
    • 2013-09-25
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多