Comment désactiver un type d'entrée = texte?

123

Je souhaite désactiver l'écriture dans un champ de saisie de type à l' textaide de JavaScript, si possible. Le champ d'entrée est rempli à partir d'une base de données; c'est pourquoi je ne veux pas que l'utilisateur modifie sa valeur.

Kawtousse
la source

Réponses:

172

Si vous savez cela lorsque la page est rendue, ce qui semble être le cas car la base de données a une valeur, il est préférable de la désactiver lors du rendu au lieu de JavaScript. Pour ce faire, ajoutez simplement l' readonlyattribut (ou disabled, si vous souhaitez également le supprimer de la soumission du formulaire) <input>, comme ceci:

<input type="text" disabled="disabled" />
//or...
<input type="text" readonly="readonly" />
Nick Craver
la source
81
Je ne sais pas pourquoi cela obtient des votes, cela ne répond pas à la question. Nous nous attendions à des réponses javascript.
Sophie
3
@Sophie est le moyen le plus correct pour le demandeur de le faire en fonction de sa situation, peut-être qu'un changement de titre est en ordre.
Nick Craver
6
Le mode désactivé empêche les événements de clic sur la zone de saisie, mais pas en lecture seule. fyi.
knutole
Pour que le champ de saisie "lecture seule" ressemble au champ "désactivé", définissez 'style = "color: gray; background-color: # F0F0F0;"'. (C'était un commentaire à cette réponse )
Jake Toronto
2
Gardez à l'esprit que les navigateurs sont libres d'ignorer l'attribut "désactivé" ou "lecture seule" et que cette méthode ne doit pas être invoquée pour empêcher de manière fiable la mise à jour des données ... si le code côté serveur traitant le formulaire accepte toujours une valeur de ce champ et le mettre à jour, toute personne ayant suffisamment de connaissances pour créer son propre formulaire peut contourner cette "désactivation" ... ceci est pour la commodité de l'interface utilisateur uniquement dans un environnement de confiance. Le vrai moyen de l'empêcher est d'utiliser la logique côté serveur.
Aaron Wallentine
206
document.getElementById('foo').disabled = true;

ou

document.getElementById('foo').readOnly = true;

Notez que readOnlydevrait être dans camelCase pour fonctionner correctement dans Firefox (magie).

Démo: https://jsfiddle.net/L96svw3c/ - explique quelque peu la différence entre disabledet readOnly.

hudolejev
la source
3
Cela a fonctionné pour moi. La version de Jquery est $ ('input'). Prop ('disabled', true)
Daniel Sun Yang
J'ai sept ans de retard sur ce point - mais y a-t-il une différence sémantique entre ces deux en 2017?
Jules
2
Vous n'êtes pas du tout en retard, la magie est toujours là (: je ne me souviens pas sur quelles plates-formes j'ai testé à l'époque, mais aujourd'hui readonly(en minuscules) ne fonctionne toujours pas dans Firefox 52 sur Ubuntu - devrait être le cas du camel.
hudolejev
Pourquoi ça ne marche pas pour moi? J'ai créé un inputélément avec id="gate"et j'essaye votre code, qui ne semble pas fonctionner pour moi ...
Voldemort's Wrath
21

Si les données sont remplies à partir de la base de données, vous pouvez envisager de ne pas utiliser de <input>balise pour les afficher. Néanmoins, vous pouvez le désactiver directement dans le tag:

<input type='text' value='${magic.database.value}' disabled>

Si vous devez le désactiver ultérieurement avec Javascript, vous pouvez définir l'attribut "désactivé":

document.getElementById('theInput').disabled = true;

La raison pour laquelle je suggère de ne pas afficher la valeur en tant que <input>est que, d'après mon expérience, cela provoque des problèmes de mise en page. Si le texte est long, <input>l'utilisateur devra essayer de faire défiler le texte, ce qui n'est pas quelque chose que les gens normaux devineraient faire. Si vous le déposez simplement dans un <span>ou quelque chose, vous avez plus de flexibilité de style.

Pointu
la source
3
Gardez à l'esprit que la désactivation peut rendre le texte presque illisible sur certains navigateurs. Vous pourriez être mieux avec l'attribut readonly, par exemple <input type = "text" value = "foo" readonly>
Olly Hodgson
7

Vous pouvez également par jquery:

$('#foo')[0].disabled = true;

Exemple de travail:

$('#foo')[0].disabled = true;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="foo" placeholder="placeholder" value="value" />

Chani Poz
la source
1
@Chani Poz Vous appelez le setter js natif sur l'objet jquery, cela entraînera une erreur. $ ('# foo') [0] .disabled = true ou $ ('# foo'). get (0) .disabled = true fera le travail
Arek Kostrzeba
6

Obtenez une référence à votre zone de saisie comme vous le souhaitez (par exemple document.getElementById('mytextbox')) et définissez sa readonlypropriété sur true:

myInputBox.readonly = true;

Vous pouvez également simplement ajouter cette propriété en ligne (aucun JavaScript n'est nécessaire):

<input type="text" value="from db" readonly="readonly" />
Roatin Marth
la source
Si vous écrivez du HTML (par opposition au XHTML) qui serait <input type = "text" value = "from db" readonly>
Olly Hodgson