1

我正在使用 Node.js 并制作一个聊天应用程序。

假设用户 A 正在与用户 B 聊天。在所有聊天应用程序中,每当每个用户开始打字时,都会出现一个通知器,上面写着“用户 X 正在打字...”。

我有一个“打字......”这样的功能。使用这种方法:

$(document).on('keyup','form.chat input:text', function(e){
    var $id = $(this).attr('id'); // text id is the user id we are chating with.
    if ( $(this).val().trim().length > 0 )
        socket.emit("writingOn", $id );
    if ( $(this).val().trim().length === 0 )
        socket.emit("writingOff", $id );
});

它运作良好。但问题是:
这是一个好方法吗?因为 foreach keyUp 客户端向服务器发送请求

提前致谢。

4

1 回答 1

6

这是一个好方法吗?

对于在实时编辑应用程序中发送每个按键,是的。为了提供“正在打字”功能,不。

您只需要在用户开始输入时发送一条消息,并在他预定的一段时间内没有输入时发送一条消息。对在每次后续击键时重置的超时使用超时。在您的情况下,您需要为他可能输入的每个字段收集超时集合。

var timeouts = {},
    time = 2000;
$(document).on('keyup','form.chat input:text', function(e){
    var id = this.id/*,
        isEmpty = /^\s*$/.test(this.value) */;
    if (id in timeouts) // if something is scheduled
        clearTimeout(timeouts[id]); // remove it
    else /* if (!isEmpty) */ // else this is the first stroke
        socket.emit("writingOn", id);
    // schedule sending the off-message, which will be canceled when another
    // keystroke happens
    timeouts[id] = setTimeout(function() {
        socket.emit("writingOff", id);
        delete timeouts[id];
    }, /* isEmpty ? 0 : */ time);
});
于 2013-10-07T14:35:11.473 回答