相关疑难解决方法(0)

iOS上的jQuery.each()和Underscore.each()的神秘失败

从Google登陆此处的任何人的简短摘要:iOS8中存在一个错误(仅限64位设备),间歇性地导致幻像"长度"属性出现在仅具有数字属性的对象上.这会导致$ .each()和_.each()等函数错误地尝试将对象作为数组进行迭代.

我已经使用jQuery(https://github.com/jquery/jquery/issues/2145)提交了一份问题报告(实际上是一个解决方法请求),并且在Underscore跟踪器上存在类似的问题(https://github.com/jashkenas/underscore/issues/2081).

更新:这是一个已确认的webkit错误.修复程序在2015-03-27进行了调整,但没有迹象表明哪个版本的iOS将具有此修复程序.请参阅https://bugs.webkit.org/show_bug.cgi?id=142792.目前已知iOS 8.0 - 8.3受到影响.

更新2: iOS错误的解决方法可以在jQuery 2.1.4+和1.11.3+以及Underscore 1.8.3+中找到.如果您正在使用这些版本中的任何一个,那么库本身将表现正常.但是,您仍然需要确保自己的代码不受影响.

这个问题也可以称为:"没有长度的物体如何长度?"

我在移动Safari上遇到了一个暮光之城的问题(在运行iOS 8的iPhone和iPad上都可以看到).我的代码使用jQuery($.each())和Underscore(_.each())的"each"实现有很多间歇性的失败.

经过一番调查,我发现在所有失败的情况下,该each函数都将我的对象视为一个数组.然后,它会尝试迭代它像一个数组(obj[0],obj[1],等),并会失败.

jQuery和Underscore都使用该length属性来确定参数是对象还是类似数组/数组的集合.例如,Underscore使用此测试:

if (length === +length) { ... this is an array
Run Code Online (Sandbox Code Playgroud)

我的对象没有长度参数,但它们触发了上述if语句.我双重验证没有length通过:

  1. obj.length在调用之前将值发送到服务器以进行记录each()(确认length was undefined)
  2. 在打电话delete obj.length之前打电话each()(这没有改变任何东西.)

我终于能够在调试器中捕获此行为,并在Mac上将Safari连接到Safari.

下图显示$ .isArrayLike认为length是7.

调试器在$ .isArrayLike中停止

然而,一个控制台跟踪显示lengthundefined,符合市场预期: 控制台跟踪

此时我相信这是iOS Safari中的一个错误,特别是因为它是间歇性的.我很乐意听到其他人看到这个问题并且可能找到了解决问题的方法.

更新

我被要求创造一个这样的小提琴,但不幸的是我做不到.似乎有一个时间问题(设备之间甚至可能不同),我无法在小提琴中重现它.这是我能够重现问题的最小代码集,它需要一个外部.js文件.使用此代码在我的iPhone …

javascript jquery mobile-safari ios underscore.js

24
推荐指数
1
解决办法
5098
查看次数

TypeError:尝试分配给readonly属性.在iOS8 Safari上

您好我的网站上的这个页面在桌面浏览器上工作正常,但在iOS8 Safari上有一个奇怪的错误:

索引模板未显示,控制台中出现错误:

TypeError:尝试分配给readonly属性.

它指向以下行:

}), e("rsvp/promise/all", ["../utils", "exports"], function(e, t) {
    "use strict";
    var r = e.isArray, n = e.isNonThenable;
    t["default"] = function(e, t) {
        var i = this;
        return new i(function(t, a) {
            function o(e) {
                return function(r) {
                    c[e] = r, 0===--u && t(c)
                }
            }
            function s(e) {
                u = 0, a(e)
            }
            if (!r(e))
                throw new TypeError("You must pass an array to all.");
            var l, u = e.length, c = new Array(u);
            if …
Run Code Online (Sandbox Code Playgroud)

javascript safari ios

13
推荐指数
2
解决办法
1万
查看次数

标签 统计

ios ×2

javascript ×2

jquery ×1

mobile-safari ×1

safari ×1

underscore.js ×1