JavaScript中数组的indexOf函数在IE7/8上无法正常工作。

15

请问IE 7和IE 8是否支持JavaScript的.indexOf()方法?因为我收到了以下错误:

SCRIPT438: Object doesn't support property or method 'indexOf' 

从IE9调试控制台中(在IE7和IE8浏览器模式下使用)。

对于以下注释,使用.indexOf()的代码如下:

if(shirt_colour == 'black') {
    p_arr=['orange','red','green','yellow','bblue','rblue','pink','white','silver','gold'];
    if( p_arr.indexOf(print_colour) != -1 ) rtn = true;
}

1
我从IE3 / Netscape 4.7开始就使用indexOf(),从未遇到过那个问题。您确定您正在对字符串对象使用它吗?展示一下返回错误的代码。 - Guidhouse
@Guidhouse 对于上述内容有什么想法吗?我肯定认为像那样的一个基本函数应该在IE7中存在。 - Gga
1
这个问题的答案并没有很好地表达我对这个主题的想法。所以我只是投了一票 :-) - Guidhouse
3个回答

36

在IE<9中,indexOf()函数实现不够完善。尝试在您的代码中添加此函数:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

如果在ECMA-262标准中找不到它,它将“替换”原始函数。


2

以下代码可能会有帮助。

function findIndexOf(findfrom, findthis) {
    for (i = 0; i < findfrom.length; i++) {
        if (findfrom[i] == findthis) {
            return i;
        }
    }
    return -1;
}

0
如果你需要在IE<=8中使用indexOf,你应该考虑使用以下polyfill,它是MDN推荐的
// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Let o be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var o = Object(this);

    // 2. Let lenValue be the result of calling the Get
    //    internal method of o with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = o.length >>> 0;

    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }

    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of o with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of o with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接