简单的JSON对象抛出“对象不支持此属性或方法”

时间:2014-02-04 07:17:47

标签: javascript json internet-explorer-8

我写了一个小framework for asynchronous resource loading (link)。在Opera,Chrome,Firefox等大多数现代浏览器中,它都按预期工作。

我也在IE8中尝试过,但代码没有执行。 IE在简单格式良好的[通过eval()] JSON对象检查时抛出“对象不支持此属性或方法”。

如何解决此错误或导致此错误的原因?

2 个答案:

答案 0 :(得分:2)

可能会引发错误,因为IE8不支持.indexOf()

价:

  

indexOf被添加到第5版的ECMA-262标准中;因此   它可能不会出现在所有浏览器中。你可以解决这个问题   在脚本的开头使用以下代码。这个   将允许您在仍然没有本机支持时使用indexOf。   此算法与ECMA-262第5版中指定的算法匹配,   假设TypeError和Math.abs具有原始值。

使用polyfill代码:

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
    "use strict";
    if (this == null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;

    if (len === 0) {
      return -1;
    }
    var n = 0;
    if (arguments.length > 1) {
      n = Number(arguments[1]);
      if (n != n) { // shortcut for verifying if it's NaN
        n = 0;
      } else if (n != 0 && n != Infinity && n != -Infinity) {
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
      }
    }
    if (n >= len) {
      return -1;
    }
    var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
    for (; k < len; k++) {
      if (k in t && t[k] === searchElement) {
        return k;
      }
    }
    return -1;
  }
}

答案 1 :(得分:1)

IE8中不支持Array.indexOf。您可以按照Irvin Dominin aka Edward的建议将其添加到Array原型中。但是,这可能会导致在不使用array.hasOwnProperty(x)时使用for (x in array)构造迭代数组时出现问题。

也许您可以像这样使用underscorejs contains function

_.contains(resourceType[t].type, src.substr(src.lastIndexOf('.')+1))

由于您正在编写用于加载文件的框架,因此您可能不希望依赖任何其他第三方框架。在你的情况下,我既不会使用indexOf进行polyfilling数组,也不会使用第三方解决方案,例如下划线的_.contains函数。 我只想编写一个简单的函数来搜索索引中的值,如:

function arrayContains(array, element) {
    var i;
    for (i=0; i<array.length; i++) {
        if (array[i] === element) {
            return true;
        }
    }
    return false;
}