Как присоединить кучу кода к событию onkeydown, но продолжать вводить текст в textarea быстро и четко? Что-то большее, чем пара операторов IF, кажется, значительно замедляет его.
РЕДАКТИРОВАТЬ: Я должен добавить (не могу поверить, что забыл!), Что это не влияет на настольные браузеры. В основном это проблема iPhone Safari. Другие мобильные браузеры также могут быть затронуты, но мы ориентируемся на iPhone Safari, поскольку он лучше всего выполняет JS (AFAIK).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что ж, один из способов - не использовать 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
}
Учитывая ваше редактирование, касающееся доступа к iPhone ...
У iPhone действительно просто не так много энергии. Вам будет лучше просто использовать onchange или onblur вместо 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 был бы лучше, чем setTimeout, но вряд ли это кажется оптимальным решением, не так ли?
К сожалению, я не могу, так как это часть политики компании. Да, это усложняет ситуацию, но я надеялся, что кто-то, возможно, нашел общее решение.