Textarea лагает после регистрации событий `keydown` с помощью Javascript

Как присоединить кучу кода к событию onkeydown, но продолжать вводить текст в textarea быстро и четко? Что-то большее, чем пара операторов IF, кажется, значительно замедляет его.

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
2 404
4

Ответы 4

Что ж, один из способов - не использовать 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);

Может быть, вы могли бы опубликовать «кучу кода», и мы могли бы обсудить, есть ли там какой-то рефакторинг (прежде чем усложнять его с помощью таймера). Похоже, вы сначала можете перейти к вторичной оптимизации.

К сожалению, я не могу, так как это часть политики компании. Да, это усложняет ситуацию, но я надеялся, что кто-то, возможно, нашел общее решение.

aditya 17.01.2009 11:26

Учитывая, что качество приложений для мобильных телефонов очень сильно зависит от микрозернистого управления нажатиями клавиш, я бы попытался избежать таймеров и т. д. - взгляд пользователя часто плотно прикован к взаимодействию между дисплеем и клавиатурой. Вы можете что-то обобщить и опубликовать?

dkretz 17.01.2009 21:40

Я думал о методах таймера. Я считаю, что setTnterval был бы лучше, чем setTimeout, но вряд ли это кажется оптимальным решением, не так ли?

Другие вопросы по теме