2009-08-20 16 views
234

¿Cómo puedo agregar readonly a un <input> específico? .attr('readonly') no funciona.¿Cómo agregar un atributo de "solo lectura" a un <input>?

+2

.attr ('readonly', true) funciona, otro no – Qiao

+3

.attr ('readonly', 'readonly') también funciona – Qiao

+3

Depende de qué DOCTYPE use. Para HTML 4.01 DTD, la respuesta de CMS está funcionando y HTML 4.01 válido. Si usa una DTD XHTML, la respuesta de ceejayoz es XHTML válida y válida. – bjoernwibben

Respuesta

406

jQuery < 1,9

$('#inputId').attr('readonly', true); 

jQuery 1.9+

$('#inputId').prop('readonly', true); 

Leer más sobre difference between prop and attr

+3

no es válido xhtml! –

+1

¿Estás seguro? Pensé que también, pero no puedo encontrar nada en las especificaciones. valida perfectamente en validator.w3.org con xhtml 1.0 strict. –

+15

Esta publicación debe cambiarse a .prop() en lugar de .attr(), como se indica en la API de jQuery: http://jquery.com/upgrade-guide/1.9/#attr-versus-prop- – frshca

19

.attr('readonly', 'readonly') deberían hacer el truco. Su .attr('readonly') solo devuelve el valor, no establece uno.

+15

jQuery's attr() funciona en propiedades de JavaScript, no en atributos HTML, aunque los nombres implican lo contrario. attr ('readonly') está realmente operando en la propiedad de HTML del nivel 1 de DOM readOnly, que es un booleano, por lo que 'verdadero' es más apropiado. Sin embargo, la cadena 'readonly' también es un valor verdadero cuando se convierte automáticamente a booleano, por lo que lo anterior aún funciona. – bobince

+0

No creo que quiera establecer el atributo en 'verdadero'. El valor '.attr' solo debe ser una cadena o un número, no un booleano, de acuerdo con los documentos jQuery: http://api.jquery.com/attr/#attr2 Además, los" atributos booleanos "HTML solo deben estar en una cadena vacía o el valor del atributo. Creo que la solución es usar '.prop()' para evitar confusiones. – Luke

12

creo "desactivado" excluye la entrada de ser enviado en el puesto

+3

Sí, lo hace. Encontré este hilo mientras buscaba una alternativa a "deshabilitado" solo por este motivo. –

+0

pero puede habilitarlo justo antes de enviarlo, y deshabilitarlo más tarde $ (documento) .on ('submit', "#myform", function (e) {// habilitar las entradas return true; // luego deshabilitarlo de nuevo si lo que necesita} funciona lo probé – Geomorillo

+0

¿Se permiten solo los valores de entrada en html enviados en POST sin usar ocultos? –

5

Para habilitar solo lectura:

$("#descrip").attr("readonly","true"); 

Para deshabilitar sólo lectura

$("#descrip").attr("readonly",""); 
+1

¿Por qué no '$ (" # descrip "). removeAttr (" readonly ");'? –

+0

desde http : //api.jquery.com/attr/ "A partir de jQuery 1.6, el método .attr() devuelve indefinido para los atributos que no se han establecido. Para recuperar y cambiar las propiedades DOM como el estado marcado, seleccionado o deshabilitado de elementos de formulario, use el método .prop() " –

+0

El atributo no se debe establecer en una cadena de" verdadero ". Esto puede funcionar, pero no es técnicamente correcto. (Consulte mis comentarios anteriores más arriba) – Luke

11

Puede desactivar el de sólo lectura mediante el uso de la .removeAttr;

$('#descrip').removeAttr('readonly'); 
139

Uso $.prop()

$("#descrip").prop("readonly",true); 

$("#descrip").prop("readonly",false); 
+8

Después de leer el jQuery API para .prop, esta debería ser la respuesta aceptada. siempre hecho .attr ('readonly', 'readonly') y .removeAttr ('readonly') en el pasado, pero esto parece ser más correcto y también hace que el código sea más limpio. –

+4

Todos deberían usar esta respuesta, como se indica aquí: http://jquery.com/upgrade-guide/1.9/#attr-versus-prop- – frshca

+3

Una palabra de advertencia con el uso de '$ .prop()': Prop se establecerá el atributo readonly en blanco/cadena vacía, así que si tiene cualquier CSS que use el selector de atributo para '[readonly =" readonly "]', tendrá que cambiar esto a '[readonly]' (o incluir ambos) – Luke

22

Sólo lectura es un atributo tal como se define en html, lo que tratarlo como tal.

Debe tener algo como readonly = "readonly" en el objeto con el que está trabajando si desea que no se pueda editar. Y si quiere que se pueda editar nuevamente, no tendrá algo como readonly = '' (esto no es estándar si entendí correctamente). Realmente necesita eliminar el atributo como un todo.

Como tal, al usar jquery agregarlo y eliminarlo es lo que tiene sentido.

Conjunto algo de sólo lectura:

$("#someId").attr('readonly', 'readonly'); 

Retire sólo lectura:

$("#someId").removeAttr('readonly'); 

Ésta era la única alternativa que realmente trabajó para mí. Espero que ayude!

2

Utilice la propiedad setAttribute. Tenga en cuenta en el ejemplo que si selecciona 1 aplica el atributo de solo lectura en el cuadro de texto, de lo contrario elimine el atributo de solo lectura.

http://jsfiddle.net/baqxz7ym/2/

document.getElementById("box1").onchange = function(){ 
    if(document.getElementById("box1").value == 1) { 
    document.getElementById("codigo").setAttribute("readonly", true); 
    } else { 
    document.getElementById("codigo").removeAttribute("readonly"); 
    } 
}; 

<input type="text" name="codigo" id="codigo"/> 

<select id="box1"> 
<option value="0" >0</option> 
<option value="1" >1</option> 
<option value="2" >2</option> 
</select> 
-4

Para jQuery versión < 1,9:

$('#inputId').attr('disabled', true); 

Para la versión jQuery> = 1,9:

$('#inputId').prop('disabled', true); 
Cuestiones relacionadas