2015-10-22 28 views
1

我使用此div元素显示自创建以来的时间。但它并没有得到更新,并且在几秒前仍然在上。它看起来像这样在div元素中更新Momentjs FromNow()

var newMsg= "<div id="chat-time">'+ moment().fromNow()+'</div>"; 
$("#chat-list").html(newMsg); 

如何更新此文本。我知道我可以用sentInterval做到这一点,但我无法弄清楚如何正确地做到这一点。它只是打印秒数!我正在使用这个聊天室。所以每条消息都会有一个timejs.fromNow()格式的时间戳。 为所有这些消息设置计时器是否会产生问题?我会欣赏一个提示。

编辑:我使用的是如下提到这个代码,但它没有显示任何东西:既然你正在使用socket.io,你

<div id="chat-time"></div> 

var messageTimeStamp = new Date(); 
setInterval(function(){ 
    var time = moment(messageTimeStamp).fromNow(); 

    $("#chat-time").html(time); 
}, 1000); 
+0

该代码没有意义,请展示它的使用的完整上下文。 'setInterval()'为每次使用返回一个唯一的标识符,所以它可以被取消。您的代码永远不会将'moment()'值返回给字符串 – charlietfl

+0

@charlietfl,那么我如何每秒更新一次该文本? –

+0

@HiradRoshandel让我知道如果我的答案不适合你。我也提供了一个演示。 –

回答

0

更新2

倒是做这样的事情(演示:http://plnkr.co/edit/QuaMV6x1vNB0kYPaU6i1?p=preview):

// The messages the user can currently see. 
    var messages = []; 

    // You have something like this in your code, presumably. 
    socket.on('new message', function(data) { 
    addChatMessage(data); 
    }); 

    function addChatMessage(data) { 
    // First add the message to the dome, with a unique id for the timestamp text. 
    var messageElementId = 'chat-message-' + data.messageId; 
    $("#chat-list").prepend($("<div>" + data.message + "<i> (sent: <span id='" + messageElementId + "'>just now</span>)</i></div>")); 

    // When you no longer display that message in the DOM it from clear this array. I'd render the DOM based on this list if I were you. 
    messages.push({ 
     messageElementId: messageElementId, 
     timestamp: data.timestamp 
    }); 
    } 

    // By updating all the messages at once you don't have memory leaks. 
    setInterval(function() { 
    messages.forEach(function(message) { 
     var time = moment(message.timestamp).fromNow(); 
     $("#" + message.messageElementId).text(time); 
    }); 
    }, 1000); 

更新1

鉴于这是你的代码:

var newMsg= "<div id="chat-time">'+ moment().fromNow()+'</div>"; 
$("#chat-list").html(newMsg); 

你可以这样做,而不是:

var messageTimeStamp = new Date(); // You need to grab this from somewhere. 

setInterval(function(){ 
    var time = moment(messageTimeStamp).fromNow();   
    $("#chat-list").html(time); 
}, 1000); 

您需要使用moment(TIMESTAMP_OF_MESSAGE)moment()做像这样:

$(function(){ 
    $("body").append($('<div id="chat-time"></div>')); 

    var messageTimeStamp = new Date(); 
    var i = 0; 
    setInterval(function(){ 
    var time = moment(messageTimeStamp).fromNow(); 

    $("#chat-time").html('moment().from(messageTimeStamp): ' + time + '; setInterval calls made ' + i++); 
    }, 1000); 
}); 

下面是演示。

http://plnkr.co/edit/QuaMV6x1vNB0kYPaU6i1?p=preview

+0

它不起作用。它显示没有结果: - /我更新我的问题与您的代码 –

0

为了使这项工作,你需要在DOM和元素setInterval运行没有被列入任何字符串连接

HTML

<div id="chat-time"></div> 

JS

var $chatTime = $('#chat-time').text(moment().fromNow()); 
setInterval(function(){ 
    var time = moment().fromNow(); 
    $chatTime.txt(time); 
}, 1000); 
+0

它不起作用。它不显示任何东西 –

-1

我没有看到任何问题usi ng setInterval()。 $ interval服务模块上的AngularJS包装setInterval。看看这些网址:interval AngularWrapper SetInterval

+1

我没有使用角度 –

+0

我明白。但我只是想告诉你,这不是丑陋的使用setInterval。像Jared这样的词语对我来说就像是一种魅力。 –

+1

我明白了,但在agular中重新编写所有代码并不是这个问题的答案。谢谢。顺便说一句,downvote不是我的。 –