¿Cómo evitar que el usuario escriba en el campo de texto sin deshabilitar el campo?

80

Lo intenté:

$('input').keyup(function() {

   $(this).attr('val', '');

});

pero elimina el texto ingresado un poco después de ingresar una letra. ¿Existe alguna forma de evitar que el usuario ingrese texto por completo sin tener que deshabilitar el campo de texto?

Jacob
fuente
es keydown()o es keypress()más eficaz?
vender

Respuestas:

189

Una alternativa sin JavaScript que puede pasarse por alto fácilmente: ¿puede utilizar el readonlyatributo en lugar del disabledatributo? Evita editar el texto en la entrada, pero los navegadores le dan un estilo diferente a la entrada (es menos probable que la "atenúe"),<input readonly type="text" ...>

Mike Mertsock
fuente
4
Honestamente, esta yo diría que es la mejor solución.
Christian Mann
3
El atributo readonly no tiene un valor, solo necesita estar presente tanto en HTML 4.01 como en HTML5 . La única vez que necesita un valor es en documentos XHTML válidos (que son extremadamente raros en la web).
RobG
Eso es exactamente correcto RobG, debería haberlo mencionado. También quiero mencionar que este atributo debería funcionar para elementos de área de texto, y creo que también funciona para entradas de casilla de verificación / radio.
Mike Mertsock
4
Hay una desventaja en este método. El usuario aún puede hacer clic en el campo para que parezca editable. Si presionan la tecla de retroceso para eliminar lo que hay allí, puede activar la funcionalidad de "retroceso" del navegador. No fue una buena experiencia.
caltrop
1
Si hay dudas sobre la experiencia del usuario o si el estilo predeterminado de un campo de solo lectura es simplemente feo, adopte el enfoque de mejora progresiva y use CSS para que sea más obvio que no es editable: jsfiddle.net/eBh5N
Mike Mertsock
64

si no desea que el campo se vea "deshabilitado" o algo, simplemente use esto:

onkeydown="return false;"

es básicamente lo mismo que dijeron Greengit y Derek, pero un poco más corto

Arte
fuente
Tuve que e.preventDefault();en addEventListener
Jim Jones
3
aún más corto:onkeydown="return false"
CoderPi
4
Solo tenga en cuenta que esto no impide que el usuario pegue texto con el mouse.
gsanta
2
Esto es perfecto cuando se usa un selector de fecha, por ejemplo, para evitar que el usuario escriba la fecha y realmente use el selector de fecha. Pero como dijo @gsanta, aún podrán pegar texto, así que asegúrese de tener una validación de back-end también :)
MattiasH
1
En un sitio web ASP.NET, configurar un cuadro de texto para que sea de solo lectura hace que el texto se pierda en una publicación. Esta es la mejor solución en tales casos.
Yass
30
$('input').keydown(function(e) {
   e.preventDefault();
   return false;
});
codificador de árbol
fuente
2
de hecho, tengo un campo de fecha de nacimiento y quiero evitar que el usuario escriba, así que para mí tu respuesta es BUENA !! Si utilizo el atributo "solo lectura", el usuario no podrá hacer clic en la entrada y aparecerá la ventana emergente DOB. Haga clic en la entrada .. :) ¡¡¡¡SALUD! y gracias
Neeraj Singh
16
$('input').keypress(function(e) {
    e.preventDefault();
});
Derek Hunziker
fuente
2
Esto solo evitará la entrada, mientras que aún puede usar las teclas de flecha y así sucesivamente. ¡Gracias!
CoderPi
7

Si desea evitar que el usuario agregue algo, pero bríndele la capacidad de borrar caracteres:

<input value="CAN'T ADD TO THIS" maxlength="0" />

Establecer el maxlengthatributo de una entrada en "0"hace que el usuario no pueda agregar contenido, pero aún así borre el contenido como lo desee .


Pero si quieres que sea verdaderamente constante e inmutable:

<input value="THIS IS READONLY" onkeydown="return false" />

Establecer el onkeydownatributo en return falsehace que la entrada ignore al usuario keypresses, evitando así que cambie o afecte el valor.

Místico
fuente
2

Otro método que podría usarse dependiendo de la necesidad $('input').onfocus(function(){this.blur()}); , creo que así es como lo escribirías. No soy competente en jquery.

qw3n
fuente
1

Margen

<asp:TextBox ID="txtDateOfBirth" runat="server" onkeydown="javascript:preventInput(event);" onpaste="return false;"
                                TabIndex="1">

Guión

function preventInput(evnt) {
//Checked In IE9,Chrome,FireFox
if (evnt.which != 9) evnt.preventDefault();}
Biju kalanjoor
fuente
Esto le ayudará a implementar la funcionalidad de pestaña en su DatePicker Filed y evitar la edición.
Biju kalanjoor
1

Me gusta agregar uno que también funcione con la creación dinámica de DOM javascript como D3 donde es imposible agregar:

//.attr(function(){if(condition){"readonly"]else{""}) //INCORRECT CODE !

para evitar acciones en un elemento DOM de entrada HTML, agregue readonly a la clase:

var d = document.getElementById("div1");
d.className += " readonly";

O en D3:

 .classed("readonly", function(){
   if(condition){return true}else{return false}
 })

Y agregar a CSS o menos:

.readonly {
  pointer-events: none;
}

Lo bueno de esta solución es que se puede activar y desactivar dinámicamente en una función para que pueda integrarse, por ejemplo, en D3 en el momento de la creación (no es posible con el atributo "readonly" único).

para eliminar el elemento de la clase:

document.getElementById("MyID").className =
  document.getElementById("MyID").className.replace(/\breadonly\b/,'');

o usa Jquery:

$( "div" ).removeClass( "readonly" )

o alternar la clase:

$( "div" ).toggleClass( "readonly", addOrRemove );

Para estar completo, buena suerte = ^)

irJvV
fuente
1

simplemente use onkeydown = "return false" a la etiqueta de control como se muestra a continuación, no aceptará valores del usuario.

    <asp:TextBox ID="txtDate" runat="server" AutoPostBack="True"
ontextchanged="txtDate_TextChanged" onkeydown="return false" >
    </asp:TextBox>
anandd360
fuente
0

Una opción es vincular un controlador al inputevento.

La ventaja de este enfoque es que no evitamos los comportamientos del teclado que el usuario espera (por ejemplo, tabulación, página arriba / abajo, etc.).

Otra ventaja es que también maneja el caso cuando se cambia el valor de entrada pegando texto a través del menú contextual.

Este enfoque funciona mejor si solo le importa mantener la entrada vacía. Si desea mantener un valor específico, tendrá que rastrearlo en otro lugar (¿en un atributo de datos?) Ya que no estará disponible cuando inputse reciba el evento.

const inputEl = document.querySelector('input');

inputEl.addEventListener('input', (event) => {
  event.target.value = '';
});
<input type="text" />

Probado en Safari 10, Firefox 49, Chrome 54, IE 11.

JKS
fuente
0

Para una solución de solo CSS, intente configurar pointer-events: noneen la entrada.

Stephen L.
fuente