2013-09-20 2 views
21

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

  • App Initializing
  • Получение JSON
  • Got JSON
  • Got Ключи (не отображается в IE)

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

Я не уверен, что Object.keys является проблемой, поэтому здесь приведена ссылка на полную страницу. I 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: {} 
} 
+0

Какая версия IE? – jabclab

+3

Если до IE 9, вот решение :: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys как Object.keys(); не работает ниже IE9 версии –

+0

Я использую версию 10 –

ответ

72

Object.keys является not avaiable in 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; 
    }; 
    }()); 
} 
+0

В вашем первом разделе кода у вас есть строка, в которой говорится, что этот код используется только в том случае, если object.keys is not настоящее время. как только вы создали работу, почему бы вам не использовать ее для всех случаев? –

+3

@PeterSaxton, потому что прокладка, вероятно, будет намного менее эффективной, чем родная версия. – cmbuckley

+1

На самом деле я всегда предполагал, что встроенные функции снабжены большим количеством багажа, чтобы проверять все возможные события, приводящие к более медленному общему процессу. Это довольно ревальвация –

Смежные вопросы