如何将一堆代码附加到一个事件中,但又能快速而清晰onkeydown地输入文本?textarea任何超过几个 IF 语句似乎都会大大减慢它。
编辑:我应该补充(不敢相信我忘记了!)这不会影响桌面浏览器。这主要是 iPhone Safari 的问题。其他移动浏览器也可能会受到影响,但我们专注于 iPhone Safari,因为它执行 JS 最好(AFAIK)
如何将一堆代码附加到一个事件中,但又能快速而清晰onkeydown地输入文本?textarea任何超过几个 IF 语句似乎都会大大减慢它。
编辑:我应该补充(不敢相信我忘记了!)这不会影响桌面浏览器。这主要是 iPhone Safari 的问题。其他移动浏览器也可能会受到影响,但我们专注于 iPhone Safari,因为它执行 JS 最好(AFAIK)
考虑到您对此的编辑重点是 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);
也许您可以发布“一堆代码”,我们可以讨论那里是否有一些重构(在使用计时器将其复杂化之前)。看起来你可能会先跳到二级优化。
我想到了计时器方法。我相信setTnterval会比 a 更好setTimeout,但这似乎不是最佳解决方案,不是吗?
好吧,一种方法是不使用 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
}