我写了一个小framework for asynchronous resource loading (link)。在Opera,Chrome,Firefox等大多数现代浏览器中,它都按预期工作。
我也在IE8中尝试过,但代码没有执行。 IE在简单格式良好的[通过eval()] JSON对象检查时抛出“对象不支持此属性或方法”。
如何解决此错误或导致此错误的原因?
答案 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;
}