Comment ajouter un attribut «en lecture seule» à un <input>?

301

Comment puis-je ajouter readonlyà un spécifique <input>? .attr('readonly')ne marche pas.

Qiao
la source
2
.attr ('readonly', true) fonctionne, d'autres non
Qiao
3
.attr ('readonly', 'readonly') fonctionne également
Qiao
3
Cela dépend du DOCTYPE que vous utilisez. Pour les DTD HTML 4.01, la réponse du CMS fonctionne et HTML 4.01 valide. Si vous utilisez une DTD XHTML, la réponse de ceejayoz fonctionne et XHTML valide.
bjoernwibben
2
Cela ne dépend pas de doctype, le DOM est le même s'il a été lu via HTML ou XML, et en tout cas XHTML est presque toujours toujours servi en HTML et non en XML, pour la compatibilité IE.
bobince

Réponses:

545

jQuery <1,9

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

jQuery 1.9+

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

En savoir plus sur la différence entre prop et attr

CMS
la source
1
Êtes-vous sûr? Je le pensais aussi, mais je ne trouve rien dans les spécifications. <input name = "foo" readonly = "readonly" value = "bar" /> valide parfaitement à validator.w3.org avec xhtml 1.0 strict.
Jonas Stensved
17
Ce message doit être modifié en .prop () plutôt qu'en .attr (), comme indiqué dans l'API jQuery: jquery.com/upgrade-guide/1.9/#attr-versus-prop-
frshca
L'attribut en lecture seule est un "attribut booléen" - whatwg.org/specs/web-apps/current-work/#boolean-attribute Malgré le nom quelque peu trompeur, les valeurs ne doivent pas être "true" ou "false". Bien que je pense que le code ci-dessus fonctionnera réellement (testé dans Chrome avec jQuery 1.8.1), il peut entraîner une confusion ultérieure pour les inexpérimentés. De plus, selon les documents jQuery, la valeur doit être un nombre ou une chaîne, pas un booléen. api.jquery.com/attr/#attr2
Luke
151

Utilisez $ .prop ()

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

$("#descrip").prop("readonly",false);
Greg
la source
8
Après avoir lu l'API jQuery pour .prop, cela devrait être la réponse acceptée. J'avais toujours fait .attr ('readonly', 'readonly') et .removeAttr ('readonly') dans le passé, mais cela semble être plus correct et rend le code plus propre également.
evan w
4
Tout le monde devrait utiliser cette réponse, comme indiqué ici: jquery.com/upgrade-guide/1.9/#attr-versus-prop-
frshca
4
Un mot de prudence avec l'utilisation $.prop(): Prop définira l'attribut readonly sur une chaîne vide / vide, donc si vous avez un CSS qui utilise le sélecteur d'attribut pour [readonly="readonly"], vous devrez le changer [readonly](ou inclure les deux).
Luke
28

Readonly est un attribut tel que défini en html, alors traitez-le comme tel.

Vous devez avoir quelque chose comme readonly = "readonly" dans l'objet avec lequel vous travaillez si vous voulez qu'il ne soit pas modifiable. Et si vous voulez qu'il soit à nouveau modifiable, vous n'aurez pas quelque chose comme readonly = '' (ce n'est pas standard si j'ai bien compris). Vous devez vraiment supprimer l'attribut dans son ensemble.

En tant que tel, tout en utilisant jquery, l'ajouter et le supprimer est ce qui a du sens.

Définissez quelque chose en lecture seule:

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

Supprimer en lecture seule:

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

C'était la seule alternative qui fonctionnait vraiment pour moi. J'espère que ça aide!


la source
20

.attr('readonly', 'readonly')devrait faire l'affaire. Votre .attr('readonly')ne renvoie que la valeur, il n'en définit pas une.

ceejayoz
la source
16
attr () de jQuery fonctionne sur les propriétés JavaScript, pas sur les attributs HTML, même si les noms impliquent le contraire. attr ('readonly') fonctionne en fait sur la propriété HTML DOM Level 1 readOnly, qui est un booléen, donc 'true' est plus approprié. Cependant, la chaîne 'readonly' est également une valeur véridique lorsqu'elle est automatiquement convertie en booléen, donc ce qui précède fonctionne toujours.
bobince
Je ne pense pas que vous souhaitiez définir l'attribut sur "true". La .attrvaleur ne doit être qu'une chaîne ou un nombre, pas un booléen, selon les documents jQuery: api.jquery.com/attr/#attr2 De plus, les "attributs booléens" HTML ne doivent être qu'une chaîne vide ou la valeur de l'attribut. Je pense que la solution est d'utiliser .prop()pour éviter toute confusion.
Luke
16

Je pense que "désactivé" exclut l'entrée de l'envoi sur le POST


la source
4
Oui. J'ai trouvé ce fil en recherchant une alternative à "désactivé" juste pour cette raison.
Jonas Stensved
mais vous pouvez l'activer juste avant de l'envoyer et le désactiver plus tard $ (document) .on ('submit', "#myform", function (e) {// enable inputs return true; // puis désactivez-le à nouveau si vous require} ça marche je l'ai testé
Geomorillo
Les valeurs d'entrée en lecture seule en html sont-elles autorisées à être envoyées sur POST sans utiliser cachées?
Ajay Takur
12

Vous pouvez désactiver la lecture seule en utilisant le .removeAttr;

$('#descrip').removeAttr('readonly');
Steve
la source
5

Pour activer la lecture seule:

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

Pour désactiver la lecture seule

$("#descrip").attr("readonly","");
Pradeep
la source
From api.jquery.com/attr "À partir de jQuery 1.6, la méthode .attr () renvoie undefined pour les attributs qui n'ont pas été définis. Pour récupérer et modifier les propriétés DOM telles que l'état vérifié, sélectionné ou désactivé des éléments de formulaire, utilisez la méthode .prop (). "
David Clarke
1
L'attribut ne doit pas être défini sur une chaîne "true". Cela peut fonctionner, mais n'est pas techniquement correct. (Voir mes commentaires précédents ci-dessus.)
Luke
N'utilisez pas cette suggestion, de bien meilleures disponibles ici. "true" n'est pas correct pour la définition et la suppression est également incorrecte.
MiFiHiBye
4

Utilisez la propriété setAttribute. Notez dans l'exemple que si sélectionnez 1, appliquez l'attribut en lecture seule sur la zone de texte, sinon supprimez l'attribut en lecture seule.

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>
Diogo Rodrigues
la source
-4

Pour la version jQuery <1.9:

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

Pour la version jQuery> = 1.9:

$('#inputId').prop('disabled', true);
Osman Adak
la source