(function() { var timerId = null, waitingTime = 2000, selector = 'input[type="text"],textarea', isValid = function(keycode) { return (keycode > 47 && keycode < 58) || // number keys keycode == 32 || keycode == 13 || // spacebar & return key(s) (if you want to allow carriage returns) (keycode > 64 && keycode < 91) || // letter keys (keycode > 95 && keycode < 112) || // numpad keys (keycode > 185 && keycode < 193) || // ;=,-./` (in order) (keycode > 218 && keycode < 223) || // [\]' (in order) (keycode == 46 || keycode == 8) //delete & backspace } $(document).on('keyup', selector, function(e) { if(!isValid(e.keyCode)){ return } clearTimeout(timerId) if (this.value) { var callback = function(element) { var evt = new CustomEvent('finishtyping'); element.dispatchEvent(evt) }.bind(null, this) timerId = setTimeout(callback, waitingTime) } }) })()