2013-12-20 85 views
2

在IE8中測試Object方法不受支持時出現錯誤。我使用Object.keys()用於與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支持?

+2

[Message:Object不支持此屬性或方法]的可能重複(http://stackoverflow.com/questions/17316428/message-object-doesnt-support-this-property-or-method) –

回答

2

如果jsoncont是一個對象,你可以使用for...in

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

Mozilla的創建它的如何填充工具功能的說明在較舊的瀏覽器中: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

This通過「插入」我的用法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+支持

注意,您可以使用iterate功能遍歷objectsarrays爲你的願望(IE 6+ )。