2013-12-20 1 views
2

IE8에서 Object 메서드가 지원되지 않는다고 테스트 할 때 오류가 발생합니다. 나는IE8과의 호환성을위한 JavaScript Object.keys() 메소드 대안

Object.keys(jsoncont).sort(function(a,b){ 
    return b.localeCompare(a) 
}).forEach(function(key) { 
    var val = jsoncont[key]; 

    /* My code here */ 
}); 
} 

IE8 지원이 방법에 대한 좋은 해결 방법은 Object.keys()을 사용하고 있습니다? jsoncont가 객체

+2

[메시지 : 개체가이 속성 또는 메서드를 지원하지 않습니다] (http://stackoverflow.com/questions/17316428/message-object-doesnt-support-this-property-or-method) –

답변

2

경우

for (var key in jsoncont) { 
... 
} 

또는 this blog post에 제안,이

if (!Object.keys) Object.keys = function(o) { 
    if (o !== Object(o)) 
    throw new TypeError('Object.keys called on a non-object'); 
    var k=[],p; 
    for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p); 
    return k; 
} 
6

모질라처럼 만들 수 있습니다 for...in이 기능을 polyfill하는 방법에 대한 설명을 가지고 사용할 수 있습니다 이전 브라우저의 경우 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

// 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()를 "사용하기 전에"삽입하기 만하면 작동하지 않습니다.이 스 니펫을 통합하려면 어떻게해야합니까? 나는 JavaScript가있는 프로가 아니다. – Mikarma

+0

코드가 작동해야합니다. 동일한 오류가 발생하면 중단 점을 설정하거나 console.log 문을 삽입하여 사용하기 전에이 코드가로드되었는지 확인하십시오. – Daab

+0

로드되었지만 여전히 IE8에서 오브젝트 메소드가 지원되지 않습니다. – Mikarma

2

다음 코드는 모든 브라우저에서 (MDN 문서 사용) 지원합니다 (IE6 +, IE에서는 아직 테스트하지 않았 음).

function getKeys(obj) { 
    var keys = []; 
    iterate(obj, function (oVal, oKey) { keys.push(oKey) }); 
    return keys; 
} 

function iterate(iterable, callback) { 
    for (var key in iterable) { 
    if (key === 'length' || key === 'prototype' || !Object.prototype.hasOwnProperty.call(iterable, key)) continue; 
    callback(iterable[key], key, iterable); 
    } 
} 

당신은 우리가 여기서 무엇을 가지고

js compatibility checker를 사용하여 확인할 수 있습니다

  1. for...in 모든 브라우저 (IE6 +)
  2. hasOwnProperty 모든 브라우저
  3. Function.prototype.call 모든 브라우저를
  4. continue 모든 브라우저
  5. Array.prototype.push 모든 브라우저 (+ IE 5.5)

요약 : IE 6 + 지원 당신이 원하는대로 objectsarrays을 반복 iterate 기능을 사용할 수 있습니다

주 (IE 6 +).