5

如何将一堆代码附加到一个事件中,但又能快速而清晰onkeydown地输入文本?textarea任何超过几个 IF 语句似乎都会大大减慢它。

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

4

4 回答 4

2

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

iPhone真的没有那么大的力量。最好使用onchangeoronblur代替onkeydown.



戴夫回答的另一种方法是等待用户暂停(例如 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);
};

这应该使用第一次按键设置计时器,为每个连续的按键停止并重新创建计时器。最后在用户停止输入 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);
于 2009-01-17T07:37:17.113 回答
1

也许您可以发布“一堆代码”,我们可以讨论那里是否有一些重构(在使用计时器将其复杂化之前)。看起来你可能会先跳到二级优化。

于 2009-01-17T07:55:25.453 回答
0

我想到了计时器方法。我相信setTnterval会比 a 更好setTimeout,但这似乎不是最佳解决方案,不是吗?

于 2009-01-17T08:30:29.253 回答
0

好吧,一种方法是不使用 onkeydown,而是使用计时器。您可以设置运行检查 TextArea 内容的函数的间隔并在那里运行您的逻辑。似乎它会绕过大部分开销。无论如何,试一试,我认为它可能会有所帮助。

以下是您将如何使用它:

// First param is the function to call, second is 
// time interval in miliseconds
var timer = setTimeout(checkTextArea(), 5000);

function checkTextArea() {
    var text = document.getElementById("textarea").value;
    // logic...
    timer = setTimeout(checkTextArea(), 5000); // we loop it back to 
                                               //the function with the timer
}
于 2009-01-17T06:50:23.400 回答