【问题标题】:.indexOf function on an array not working in IE7/8 using JavaScript数组上的 .indexOf 函数在 IE7/8 中使用 JavaScript 不起作用
【发布时间】:2012-07-18 15:33:09
【问题描述】:

当我收到错误消息时,谁能告诉我 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;
}

【问题讨论】:

  • 我从 IE3/Netscape 4.7 开始就使用 indexOf(),从来没有遇到过这个问题。你确定你在字符串对象上使用它吗?向我们展示返回错误的代码。
  • @Guidhouse 基于上述内容有什么想法吗?我当然会认为像这样的基本功能会出现在 IE7 中。
  • 这个问题的答案确实很好地表达了我对这个主题的任何想法。所以我只是投赞成票:-)

标签: javascript internet-explorer-8 internet-explorer-7


【解决方案1】:

在 IEindexOf() 上,它没有“很好”地实现。尝试在您的代码中添加此功能:

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;
    }
    

    【讨论】:

      【解决方案3】:

      如果你在IEindexOf,你应该考虑使用下面的polyfill,也就是recommended at the 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;
        };
      }
      

      【讨论】:

        猜你喜欢
        • 2015-01-18
        • 2017-02-02
        • 1970-01-01
        • 2013-02-20
        • 2015-02-01
        • 1970-01-01
        • 2011-04-07
        相关资源
        最近更新 更多