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

1 回答 1

3

这不是$.each问题,var a = {};是一个对象并且$.each(a, function (secs, str) {})以某种方式失败,因为 jQuery 每个函数只接受一个数组。

需要转换objectarray然后使用$.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;

}
于 2012-09-12T00:40:58.593 回答