Estoy usando este script para permitir solo letras y números de texto de entrada
function setInputFilter(textbox, inputFilter) { ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) { textbox.addEventListener(event, function() { if (inputFilter(this.value)) { this.oldValue = this.value; this.oldSelectionStart = this.selectionStart; this.oldSelectionEnd = this.selectionEnd; console.log("If 1"); } else if (this.hasOwnProperty("oldValue")) { this.value = this.oldValue; this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd); console.log("if 2"); } else { console.log("if 3"); this.value = ""; } }); }); } setInputFilter(document.getElementById("frm_nuevo_proveedor:j_idt35"), function(value) { return /^[^\W_]+$/i.test(value); });Mi problema es que una vez que escribo el primer valor ya no me deja borrarlo
Así que el primer valor no me deja eliminarlo.
Cuando intenta eliminar el último carácter, RegExp devuelve falso porque no está configurado para aceptar cadenas en blanco. Esto hace que el script restaure el valor antiguo , que sería esa única letra.
La solución más simple parece ser actualizar el RegExp utilizado como filtro. Esto debería funcionar para usted, aunque no soy un experto en expresiones regulares, por lo que puede haber una mejor manera:
setInputFilter(document.getElementById("testEl"), function(value) { return /(^$|^[^\W_]+$)/i.test(value); });