Javascript setTimeout立即执行/清除

Javascript setTimeout立即执行/清除,javascript,Javascript,我正在制作一个登录用户事件的网页。 为了测试这个特性,我制作了一个独立的小网页,带有一个teaxtarea和一个文本输入。记录的事件是在输入元素上执行的事件 我想阻止同一事件文本连续多次显示,但我似乎无法阻止它们显示 我还想在没有其他事件发生0.5秒后为单独的事件组添加一行,但该行似乎出现在每个事件触发器上,即使我使用带有超时ID的clearTimeout 基本上:我不想重复任何一行。如果最后一行是分隔行,则不能添加另一行。但它似乎不起作用 这是我的密码: JavaScript HTML 从

我正在制作一个登录用户事件的网页。 为了测试这个特性,我制作了一个独立的小网页,带有一个teaxtarea和一个文本输入。记录的事件是在
输入
元素上执行的事件

我想阻止同一事件文本连续多次显示,但我似乎无法阻止它们显示

我还想在没有其他事件发生0.5秒后为单独的事件组添加一行,但该行似乎出现在每个事件触发器上,即使我使用带有超时ID的
clearTimeout

基本上:我不想重复任何一行。如果最后一行是分隔行,则不能添加另一行。但它似乎不起作用

这是我的密码:

JavaScript HTML

从HTML属性调用的事件

因为您实际上并没有以任何方式停止
show
功能。
clearTimeout
仅适用于分隔符添加。我有。您需要用

if (+new Date() - lastfire < 500) return; 

(在最后一次返回之前——请参阅更新的小提琴)。另外,确保粘贴全局定义
var lastfire=-1在顶部的某个地方。

听起来您想要的是在500毫秒的不活动后打印的行,但您的代码当前要做的是“在任何操作后500毫秒打印一行,除非取消”。通过使代码结构更接近预期目标,可以获得更好的结果

具体地说,不是每次事件发生时都安排一个新的超时,而是在第一个事件发生时启动一个循环,检查自接收到最近的事件以来经过的时间,然后在经过的时间超过所需的阈值(500毫秒)时打印一行。比如:

function addSeparateLine() {
    var elapsed = new Date().getTime() - lastEventTime;
    if (elapsed >= 500) {
        document.getElementById('listeEvenements').value += "--------------------\n";
        clearInterval(timerID);
        timerID = -1;
    }
}
…然后你可以像这样安排:

if(newEventText !== "") {
    lastEventTime = new Date().getTime();
    eventListField.value += newEventText+"\n";
    if (timerID == -1) {
        timerID = setInterval(addSeparateLine,100);
    }
}
此处的工作示例:

lastfire = +new Date();
function addSeparateLine() {
    var elapsed = new Date().getTime() - lastEventTime;
    if (elapsed >= 500) {
        document.getElementById('listeEvenements').value += "--------------------\n";
        clearInterval(timerID);
        timerID = -1;
    }
}
if(newEventText !== "") {
    lastEventTime = new Date().getTime();
    eventListField.value += newEventText+"\n";
    if (timerID == -1) {
        timerID = setInterval(addSeparateLine,100);
    }
}