5

我已经在 IE7 和 IE8(在所有兼容模式下)的 Windows XP SP3 和 IE8(在所有兼容模式下)的 Windows 7 Ultimate 上对此进行了测试,并且两者都以相同的方式失败。我正在从couchapp存储库运行最新的 HEAD。这在我的 OSX 10.6.3 开发机器上运行良好。我已经在 Windows 7 Ultimate 上使用 Chrome 4.1.249.1064 (45376) 和 Firefox 3.6 进行了测试,它们都可以正常工作。OSX 10.6.3 上的 Safari 4 和 Firefox 3.6 也是如此

这是错误消息

网页错误详情

用户代理:Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.1;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Media Center PC 6.0)时间戳: 2010 年 4 月 28 日星期三 03:32:55 UTC

消息:对象不支持此属性或方法行:159 字符:7 代码:0 URI: http: //192.168.0.105 :5984/test/_design/test/vendor/couchapp/jquery.couch.app.js

这是“冒犯”的代码,它在 Chrome、Firefox 和 Safari 上运行得很好。如果说失败发生在qs.forEach()从文件jquery.couch.app.js开始的行上

  157 var qs = document.location.search.replace(/^\?/,'').split('&');
  158 var q = {};
  159 qs.forEach(function(param) {
  160   var ps = param.split('=');
  161   var k = decodeURIComponent(ps[0]);
  162   var v = decodeURIComponent(ps[1]);
  163    if (["startkey", "endkey", "key"].indexOf(k) != -1) {
  164     q[k] = JSON.parse(v);
  165   } else {
  166    q[k] = v;
  167   }
  168 });
4

2 回答 2

6

forEach() 是最近添加到 JavaScript 规范中的函数,因此并非所有浏览器都支持它。

您可以在 MDC 上阅读: https ://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach

在“兼容性”下,您会找到一个使 forEach() 可用的代码段。

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp*/)
  {
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        fun.call(thisp, this[i], i, this);
    }
  };
}

因此,将上面的代码复制并粘贴到您的脚本中,forEach() 应该可以工作。

于 2010-04-28T07:16:31.973 回答
0

在修复 forEach() 问题后,我还必须添加indexOf()到 Array 对象以使其正常工作

if (!Array.prototype.indexOf)
{
    Array.prototype.indexOf = function(elt)
    {
        var len = this.length >>> 0;

        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;
    };
}
于 2010-04-28T17:08:10.810 回答