IE не поддерживает forEach даже с Polyfill.

Я добавил polyfill forEach в начало моего файла JavaScript, однако Internet Explorer все еще говорит, что он не поддерживает эту функцию.

Я в основном хочу перебрать результаты запросаSelector, однако я использую forEach для некоторых других объектов массива в моем скрипте.

Все это отлично работает в Chrome.

// Production steps of ECMA-262, Edition 5, 15.4.4.18
// Reference: http://es5.github.io/#x15.4.4.18
if (!Array.prototype.forEach) {

  Array.prototype.forEach = function(callback/*, thisArg*/) {

    var T, k;
    if (this === null) {
      throw new TypeError('this is null or not defined');
    }
    var O = Object(this);
    var len = O.length >>> 0;
    if (typeof callback !== 'function') {
      throw new TypeError(callback + ' is not a function');
    }
    if (arguments.length > 1) {
      T = arguments[1];
    }
    k = 0;
    while (k < len) {
      var kValue;
      if (k in O) {
        kValue = O[k];
        callback.call(T, kValue, k, O);
      }
      k++;
    }
  };
}

(function() {

  var instance = null,
      container;

  // Constructor
  this.MarvLightbox = function() {
    // Initialise plugin
    this.init();
  };

  // Initilise the plugin
  MarvLightbox.prototype.init = function() {

    document.querySelectorAll('[data-click]').forEach(function(e) {
      e.addEventListener('click', [clickevent]);
    });

  };

}());

Не следует ли добавлять многопользовательскую версию этой проблемы в IE?

Ответ 1

Вы добавляете прототип к объекту Array и пытаетесь использовать его в NodeList (который возвращает запрос NodeList вместо массива), который не будет работать. Извлеките массив из списка узлов или используйте

Array.prototype.forEach.call(document.querySelectorAll('[data-click]'), function (e) {
    // your code
});

Ответ 2

Другой способ заставить IE9+ поддерживать forEach:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <span class="demo">See me.</span>
    <span class="demo">See me.</span>
    <span class="demo">See me.</span>
    <span class="demo">See me.</span>
    <script>
        // Function to make IE9+ support forEach:
        if (window.NodeList && !NodeList.prototype.forEach) {
            NodeList.prototype.forEach = Array.prototype.forEach;
        }

        // Works with Nodelists (i.e. HTMLcollections):
        var demos = document.querySelectorAll('.demo');
        demos.forEach(function(item) {
            item.style.color = 'red';
        });

        // As well as with Arrays:
        var gherkins = ['gher1', 'gher2', 'gher3'];
        gherkins.forEach(function(item) {
            console.log(item);
        });
    </script>
</body>
</html>