0

我正在做一个小聊天:)

当用户正在输入(或停止输入)时,会向其他用户发出信号,并且仅当用户在输入与否之间切换时(检查 textarea 是否为空)

现在我想防止这些信号一个接一个地发送得太快。我认为一些 settimeout 可以做到这一点,但我不知道如何或将它放在我的代码中的位置:

var istyping = false;
var wastyping = false;

chatfield.keyup(function(e) {
    if (e.keyCode != 13) {

        function typesignal(state) {
            channel.send(JSON.stringify({
                username: username,
                type: 'typing',
                message: state
            }));
        }

        if (chatfield.val()) {

            istyping = true;

                if (wastyping==false) {
                    typesignal(1);
                    wastyping = true;
                }

        } else {

            istyping = false;

                if (wastyping==true) {
                    typesignal(0);
                    wastyping = false;
                }

        }
    }
});
4

2 回答 2

1

你可能会称之为“节流”,我已经在自动完成下拉列表之类的东西上使用了它,这样你就不会在每次击键时都杀死服务器。JS 标准库允许您清除超时,并且在调用 setTimeout 时还返回一个 id。所以如果在一定时间内再次调用该函数,可以使用这个id来清除超时(防止回调在该时间段内被调用)。例如:

var timeId;

function throttle(callback, ms) {
    if (timeId) {
      clearTimeout(timeId);
    }

    timeId = setTimeout(callback, ms)
}

chatfield.keyup(function(e) {
  throttle(your_fn, 500);
});

如果不清楚,setTimeout 会在一定时间后执行一个函数,以毫秒为单位指定为第二个参数。因此,如果我调用 setTimeout(function(){},300) 该函数将在 300 毫秒后调用。我也可以说,“取消”最初的请求。因此,如果我在第一个请求被触发之前收到另一个请求,只需取消它并重新开始。这就是我在上面试图描述的模式:-)

于 2012-05-11T02:36:17.307 回答
-1

我会这样做

chatfield.keyup(function(e) {
    if (e.keyCode != 13) {

        function typesignal(state) {
            channel.send(JSON.stringify({
                username: username,
                type: 'typing',
                message: state
            }));
        }

        if (chatfield.val()) {

            istyping = true;

                if (wastyping==false) {
                    typesignal(1);
                    wastyping = true;
                }

        } else {

            istyping = false;

                if (wastyping==true) {
                    typesignal(0);
                    wastyping = false;
                }

        }
    }
function doNothing() { 
}
setTimeout("doNothing()",1000);
});
于 2012-05-11T01:44:53.143 回答