Хотя другие предложенные решения (на blur
или на keydown
, если это клавиша ввода), сработают, я думаю, что они не то, что вы ищете.
Что еслипользователь не щелкает за пределами текстовой области и не использует ввод? Вместо этого я бы использовал технику, называемую debounce. Вы можете прочитать об этом, например, здесь: https://davidwalsh.name/javascript-debounce-function или посмотреть пример здесь: https://www.geeksforgeeks.org/debouncing-in-javascript/
Короткая версия такова, что она вызывает функцию только после того, как событие прекратило срабатывать на заданную длинувремени.
Добавьте функцию debounce в свой код, используя пакет NPM (например, https://www.npmjs.com/package/debounce) или непосредственно добавив необходимый код:
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
Источник: https://davidwalsh.name/javascript-debounce-function, который взят из Underscore.js
Затем создайте функцию, выполняющую ваши вызовы ajax, например:
var makeAjaxCall = function(e) {
$.ajax({ ... });
};
Теперь вы можете просто добавитьслушатель вроде:
var minTimeoutBetweenCallsInMilliSeconds = 500;
notesTextarea.on('change', debounce(makeAjaxCall, minTimeoutBetweenCallsInMilliSeconds));
Теперь функция makeAjaxCall
будет вызываться только через 500 мс после того, как произошло последнее событие изменения, иначе пользователь перестал печатать.