正确地跳出jQuery $.each()循环-- 这是浏览器问题吗?

5
为什么下面的代码在Firefox下能正确运行而在Chrome下不能?如果我将.each循环中的返回值更改为“true”,则它可以在Chrome中正常工作,但在Firefox中不行。为什么会出现这种情况?当它不能正常工作时,它只返回秒数而不是正确的天、小时等。请帮忙检查一下。
function time_remaining(expire_time)
    {
        var now = new Date().getTime()/1000,
        time_left = expire_time - now,
        time_left_str = '0 seconds';

        if (time_left < 1) {
            return time_left_str;
        }

        var a = {};
            a[ 12 * 30 * 24 * 60 * 60 ] = 'year',
            a[      30 * 24 * 60 * 60 ] = 'month',
            a[           24 * 60 * 60 ] = 'day',
            a[                60 * 60 ] = 'hour',
            a[                     60 ] = 'minute',
            a[                      1 ] = 'second';


        $.each(a, function (secs, str) {
            var d = time_left / secs;
            if (d >= 1) {
                var r = Math.round(d);
                time_left_str = r + ' ' + str + ((r > 1) ? 's' : '');
                return false;
            }
        });

        return time_left_str;
    }

1
根据文档,我们可以通过使回调函数返回false来在特定迭代中断$.each()循环。返回非false与for循环中的continue语句相同;它将立即跳过下一次迭代。 - MrOBrian
尝试在回调函数中使用 return (false)。这应该可以解决你的问题,因为它会像 break 一样起作用。 - Sushanth --
我已经尝试了'return false'和'return (false)'. 在Firefox上这确实可以正常工作。但是,在Chrome上它无法正常工作。只有当我使用'return true'时,Chrome才能正常工作.. 不太确定? - Scott Chasin
1个回答

3

这不是$.each的问题,var a = {};是一个对象,$.each(a, function (secs, str) {})失败了,因为jQuery的each函数只接受数组。

需要将object转换成array,然后使用$.each函数。

在函数体中添加新代码,将object转换成array

// converting object to array
var temp = [];
var finalArr = [];
for (val in a) {
    temp.push(val);
}

temp = temp.sort(function (a, b) {
    return a - b
});
for (var i = 0; i < temp.length; i++) {
    finalArr.push(a[temp[i]] + "|" + temp[i]);
}

同时还修改了访问新创建数组的数据和索引值的方式。

 function time_remaining(expire_time) {
    var now = new Date().getTime() / 1000,
        time_left = expire_time - now,
        time_left_str = '0 seconds';

    if (time_left < 1) {
        return time_left_str;
    }

    var a = {};
    a[12 * 30 * 24 * 60 * 60] = 'year',
    a[30 * 24 * 60 * 60] = 'month',
    a[24 * 60 * 60] = 'day',
    a[60 * 60] = 'hour',
    a[60] = 'minute',
    a[1] = 'second';


    // converting object to array
    var temp = [];
    var finalArr = [];
    for (val in a) {
        temp.push(val);
    }

    temp = temp.sort(function (a, b) {
        return a - b
    });
    for (var i = 0; i < temp.length; i++) {
        finalArr.push(a[temp[i]] + "|" + temp[i]);
    }

    $.each(finalArr, function (secs, str) {
        var time = time_left / parseInt(str.split("|")[1], 10);

        if (time >= 1) {

            var randomNum = Math.round(time);
            time_left_str = randomNum + ' ' + str.split("|")[0] + ((randomNum > 1) ? 's' : '');
            return true;
        }
    });

    return time_left_str;

}

1
这个确实可以运行。Chrome和FF处理方式不同,有点奇怪。谢谢KK。 - Scott Chasin

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