0

私のウェブサイトに投稿されたコメントの時間を定期的に更新したいと思います。私が興味を持っている形式は、Facebook や他の人が行っているように、投稿の時間が現在の時間に関連してリストされている場所です。たとえば、投稿は最初に送信されたときは「ただ今...」と表示されますが、1 分後には「1 分前」、「2 分前」などと表示されます。

これを行うためのこの素敵なスクリプトを見つけました: http://forrst.com/posts/Facebook_style_live_dates_in_JavaScript-hro そして、おそらく途中まで行きました。

これまでのところ、私のコードには 2 つの問題があります。

  1. 報告されている時間はめちゃくちゃです。
  2. 正常に動作しているにもかかわらず、時刻が毎秒更新されていませんsetinterval()

これは、jsfiddle に全体を入れたコードのスニペットです: http://jsfiddle.net/Y8Q7p/16/。問題はにあると思いますvar time

$(document.body).on('click', 'button', function(){
var id= $(this).data('id'),
comment=$('textarea[data-id="'+id+'"]').val(),
start_timer = setInterval(function() { 
    var time =  new Date();
    time = time_since(time);

    $('div[data-id="'+id+'"]').html(time);

    }, 
    1000);
    $('#'+id).html(comment); 
});
4

1 に答える 1

2

私はそれをテストしましたが、これはうまくいきます:

$(document.body).on('click', 'button', function(){
    var id= $(this).data('id'),
    comment=$('textarea[data-id="'+id+'"]').val();
    var time =  new Date();
    start_timer = setInterval(function() {

        //var time =  new Date();
        var time2 = time_since(time.getTime()/1000);

        $('div[data-id="'+id+'"]').html(time2);

        },
        1000);
        $('#'+id).html(comment);
});


/**
 * date_suffix()
 * returns the date suffix (st,nd,rd,th) for a given day in a month
 *
 * @author: Andy Thomas (forrst@antom.co.uk)
 * @date: 27/09/2010
 */

function date_suffix(date) {
        if (date == 1 ||  date == 21 || date == 31) {
                return 'st';
        } else if (date == 2 || date == 22) {
                return 'nd';
        } else if (date == 3 || date == 23) {
                return 'rd';
        } else {
                return 'th';
        }
}

/**
 * time_since()
 * returns the time passed since a given unix_timestamp.
 * eg. 10 seconds ago, 1 hour ago, 10th Sep etc
 *
 * @author: Andy Thomas (forrst@antom.co.uk)
 * @date: 27/09/2010
 */
function time_since(original) {
        original = new Date(original * 1000);

        var str = '';

        var months = [
                'Jan',
                'Feb',
                'Mar',
                'Apr',
                'May',
                'Jun',
                'Jul',
                'Aug',
                'Sep',
                'Oct',
                'Nov',
                'Dec'
        ];

        var chunks = [
                [31536000000, 'year'],
                [2592000000, 'month'],
                [604800000, 'week'],
                [86400000, 'day'],
                [3600000, 'hour'],
                [60000, 'minute'],
                [1000, 'second'],
        ];

        var today = new Date();
        var since = new Date(today.getTime() - original.getTime());

        if (since.getTime() > 604800000) {
                str = months[original.getMonth()] + ' ' + original.getDate() + date_suffix(original.getDate());

                if (since.getTime() > 31536000000) {
                        str = str + ', ' + original.getFullYear();
                }

                return str;
        }

        var ms = 0;
        var name = 0;
        var i = 0;
        var ic = chunks.length;
        var count = 0;

        for (i=0;i<ic;i++) {
                ms = chunks[i][0];
                name = chunks[i][1];

                count = Math.floor(since.getTime() / ms);

                if (count != 0) {
                        break;
                }
        }

        return count + ' ' + name + ((count == 1) ? '' : 's') + ' ago';
}
于 2012-05-04T23:17:51.190 に答える