5

次の機能がFirefoxで正しく機能するのに、Chromeでは機能しないのはなぜですか?.eachループの戻り値を「true」に変更すると、FirefoxではなくChromeで機能します。何が得られますか?

(機能しない場合は、正しい日、時間などに対して秒単位でのみ返されます。)

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

jQueryの各関数は配列のみを受け入れるため、オブジェクトであり、何らかの形で失敗することは$.each問題ありません。var a = {};$.each(a, function (secs, str) {})

関数を使用するように変換する必要があり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;

}
于 2012-09-12T00:40:58.593 に答える