使用Javascript注册`keydown`事件后,Textarea滞后

adi*_*tya 5 html javascript events textarea keydown

如何将一堆代码附加到onkeydown事件中,但是继续将文本textarea快速而清晰地输入?任何超过几个IF语句的东西似乎都会大大降低它的速度.

编辑:我应该添加(不能相信我忘了!)这不会影响桌面浏览器.这主要是iPhone Safari的一个问题.其他移动浏览器也可能受到影响,但我们专注于iPhone Safari,因为它最好地执行JS(AFAIK)

Jon*_*ski 2

考虑到您对此的编辑重点是 iPhone 访问......

iPhone确实没有那么强大的功能。onchange使用oronblur代替会更好onkeydown



Dave 答案的另一种选择是等待用户暂停(例如 5 秒):

var textarea = document.getElementById('textarea');

function checkTextArea() {
   if (textarea.value /* ... */) {
     /* ... */
   }
}

textarea.keyDownTimeout = null;
textarea.onkeydown = function () {
  if (textarea.keyDownTimeout) clearTimeout(textarea.keyDownTimeout);
  textarea.keyDownTimeout = setTimeout(checkTextArea, 5000);
};
Run Code Online (Sandbox Code Playgroud)

这应该在第一次按键时设置计时器,为每个连续的按键停止并重新创建计时器。最后在用户停止打字 5 秒后调用。

另外,请注意 后面缺少括号checkTextArea。这将给出setTimeout函数的引用与其return.


您还可以在函数中进行设置,以便更轻松地用于多个元素:

function setPauseTimer(element, timeout, callback) {
  var timer = null;
  element.onkeydown = function () {
    if (timer) clearTimeout(timer);
    timer = setTimeout(function(){ callback(element); }, timeout);
  };
}

function checkTextArea(textarea) { /* moved from global to argument */
   if (textarea.value /* ... */) {
     /* ... */
   }
}

setPauseTimer(document.getElementById('textarea'), 5000, checkTextArea);
Run Code Online (Sandbox Code Playgroud)