Подтвердить что ты не робот

Object.keys не работают в Internet Explorer

У меня есть программа для возврата списка ключей из словаря. Код работает корректно в Chrome, Opera и Firefox, но не в Internet Explorer. Я добавил предупреждающие комментарии, чтобы закрыть, где проблема. Ниже приведен код, вызывающий проблему. Предупреждения отображаются в порядке

  • Инициализация приложений
  • Получение JSON
  • Got JSON
  • Got Keys (не отображается в IE)

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

Я больше не уверен, что Object.keys является проблемой, поэтому вот ссылка на полную страницу. Я JavaScript на странице, чтобы было легче просмотреть

http://www.londonlayout.co.uk/dev/live.htm

 var myApp = {
    init: function () {
        var def = $.Deferred();
        alert('App Initializing');
        $.getJSON('data/data.json', function (raw) {
            alert('Getting JSON');
            myApp.data = raw;
            $.each(myApp.data, function (code, details) {
                try {
                    myApp.nameDict[details.name] = code;
                }
                catch (e) {}
            });
            alert('Got JSON');
            myApp.names = Object.keys(myApp.nameDict);
            alert('Got Keys')
            def.resolve();
        });
        return def.promise();
    },
    data: {},
    nameDict: {}
}
4b9b3361

Ответ 1

Object.keys не доступен в IE < 9. В качестве простого обходного пути вы можете использовать:

if (!Object.keys) {
  Object.keys = function(obj) {
    var keys = [];

    for (var i in obj) {
      if (obj.hasOwnProperty(i)) {
        keys.push(i);
      }
    }

    return keys;
  };
}

Вот более полный polyfill:

// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
if (!Object.keys) {
  Object.keys = (function () {
    'use strict';
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

    return function (obj) {
      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
        throw new TypeError('Object.keys called on non-object');
      }

      var result = [], prop, i;

      for (prop in obj) {
        if (hasOwnProperty.call(obj, prop)) {
          result.push(prop);
        }
      }

      if (hasDontEnumBug) {
        for (i = 0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) {
            result.push(dontEnums[i]);
          }
        }
      }
      return result;
    };
  }());
}