2009-08-20 7 views
234

Come posso aggiungere readonly a uno specifico <input>? .attr('readonly') non funziona.Come aggiungere un attributo "readonly" a <input>?

+2

.attr ('readonly', true) funziona, altro non – Qiao

+3

.attr ('readonly', 'readonly') funziona anche – Qiao

+3

Dipende da quale DOCTYPE usi. Per DTD HTML 4.01 la risposta da CMS è funzionante e valida HTML 4.01. Se si utilizza un DTD XHTML, la risposta di ceejayoz funziona e ha validità XHTML. – bjoernwibben

risposta

406

jQuery < 1,9

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

jQuery 1.9+

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

Per saperne di più difference between prop and attr

+3

non valido xhtml! –

+1

Sei sicuro? Ho pensato anch'io ma non riesco a trovare nulla nelle specifiche. si convalida perfettamente su validator.w3.org con xhtml 1.0 strict. –

+15

Questo post deve essere modificato in .prop() piuttosto che in .attr(), come indicato nell'API jQuery: http://jquery.com/upgrade-guide/1.9/#attr-versus-prop- – frshca

19

.attr('readonly', 'readonly') dovrebbe fare il trucco. Il tuo .attr('readonly') restituisce solo il valore, non ne imposta uno.

+15

jQuery's attr() funziona su proprietà JavaScript, non su attributi HTML, anche se i nomi implicano altrimenti. attr ('readonly') in realtà opera sulla proprietà HTML DOM Level 1 readOnly, che è un valore booleano, quindi 'true' è più appropriato. Tuttavia, la stringa 'readonly' è anche un valore di verità quando viene convertita automaticamente in un valore booleano, quindi quanto sopra funziona ancora. – bobince

+0

Non penso tu voglia impostare l'attributo su "true". Il valore '.attr' dovrebbe essere solo una stringa o un numero, non un booleano, secondo i documenti jQuery: http://api.jquery.com/attr/#attr2 Inoltre, HTML" attributi booleani "dovrebbe essere solo una stringa vuota o il valore dell'attributo. Penso che la soluzione sia usare '.prop()' per evitare confusione. – Luke

12

Credo che "disabile" esclude l'ingresso di essere inviato sul POST

+3

Sì, sì. Ho trovato questo thread mentre cercavo un'alternativa a "disabled" solo per questo motivo. –

+0

ma è possibile abilitarlo appena prima di inviarlo e disabilitarlo in seguito $ (document) .on ('submit', "#myform", function (e) {// enable input return true; // quindi disabilitarlo di nuovo se si richiede} funziona lo ha testato – Geomorillo

+0

La lettura dei valori di input in html è consentita per l'invio su POST senza l'utilizzo nascosto? –

5

Per abilitare in sola lettura:

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

Per disabilitare in sola lettura

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

Perché no '$ (" # descrip "). removeAttr (" readonly ");'? –

+0

Da http : //api.jquery.com/attr/ "A partire da jQuery 1.6, il metodo .attr() restituisce undefined per gli attributi che non sono stati impostati. Per recuperare e modificare proprietà DOM come lo stato selezionato, selezionato o disabilitato di elementi form, utilizzare il metodo .prop(). " –

+0

L'attributo non deve essere impostato su una stringa di" true ". Ciò potrebbe funzionare, ma non è tecnicamente corretto. (Vedere i miei commenti precedenti sopra) – Luke

11

È possibile disattivare la sola lettura utilizzando la .removeAttr;

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

Uso $.prop()

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

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

Dopo aver letto il jQuery API per .prop, questa dovrebbe essere la risposta accettata sempre fatto .attr ('readonly', 'readonly') e .removeAttr ('readonly') in passato, ma questo sembra essere più corretto e rende anche il codice più pulito. –

+4

Tutti dovrebbero usare questa risposta, come indicato qui: http://jquery.com/upgrade-guide/1.9/#attr-versus-prop- – frshca

+3

Una parola di cautela con l'uso di '$ .prop()': Prop imposterà l'attributo readonly alla stringa vuoto/vuoto, quindi se hai un qualsiasi CSS che usa il selettore dell'attributo per '[readonly =" readonly "]', allora dovrai cambiarlo in '[readonly]' (o includere entrambi). – Luke

22

Readonly è un attributo come definito in html, quindi trattarlo come uno.

È necessario avere qualcosa come readonly = "readonly" nell'oggetto su cui si sta lavorando se si desidera che non sia modificabile. E se vuoi che sia di nuovo modificabile non avrai qualcosa come readonly = '' (questo non è standard se ho capito bene). Hai davvero bisogno di rimuovere l'attributo nel suo complesso.

Come tale, mentre si utilizza jquery aggiungendolo e rimuovendolo è ciò che ha senso.

Set qualcosa in sola lettura:

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

Rimuovere sola lettura:

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

Questa è stata l'unica alternativa che realmente ha funzionato per me. Spero che aiuti!

2

Utilizzare la proprietà setAttribute. Si noti ad esempio che se si seleziona 1 si applica l'attributo readonly sulla casella di testo, altrimenti si rimuove l'attributo readonly.

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

Per jQuery versione 1.9 <:

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

Per la versione jQuery> = 1.9:

$('#inputId').prop('disabled', true); 
Problemi correlati