Ajouter un attribut désactivé à l'élément d'entrée à l'aide de Javascript

141

J'ai une zone de saisie et je veux qu'elle soit désactivée et en même temps la cacher pour éviter des problèmes lors du portage de mon formulaire.

Jusqu'à présent, j'ai le code suivant pour masquer mon entrée:

$(".shownextrow").click(function() { 
    $(this).closest("tr").next().show().find('.longboxsmall').hide();
});

C'est l'entrée qui est masquée en conséquence:

<input class="longboxsmall" type="text" />

Comment puis-je également ajouter l'attribut désactivé à l'entrée?

user342391
la source

Réponses:

306

$("input").attr("disabled", true); depuis ... je ne sais plus.

Nous sommes en décembre 2013 et je ne sais vraiment pas quoi vous dire.

D'abord c'était toujours .attr(), puis ça l'était toujours .prop(), alors je suis revenu ici pour mettre à jour la réponse et la rendre plus précise.

Puis un an plus tard, jQuery a de nouveau changé d'avis et je ne veux même pas en garder une trace.

Bref, pour le moment, c'est la meilleure réponse: "vous pouvez utiliser les deux ... mais cela dépend."

Vous devriez plutôt lire cette réponse: https://stackoverflow.com/a/5876747/257493

Et leurs notes de publication pour ce changement sont incluses ici:

Ni .attr () ni .prop () ne doivent être utilisés pour obtenir / définir une valeur. Utilisez la méthode .val () à la place (bien que l'utilisation de .attr ("value", "somevalue") continue de fonctionner, comme avant 1.6).

Résumé de l'utilisation préférée

La méthode .prop () doit être utilisée pour les attributs / propriétés booléens et pour les propriétés qui n'existent pas en html (comme window.location). Tous les autres attributs (ceux que vous pouvez voir dans le html) peuvent et doivent continuer à être manipulés avec la méthode .attr ().

Ou en d'autres termes:

".prop = trucs non documentaires"

".attr" = trucs de document

... ...

Puissions-nous tous apprendre ici une leçon sur la stabilité des API ...

Incognito
la source
3
+1 pour avoir rendu le texte de mise à jour suffisamment grand pour que je puisse y prêter attention
Vael Victus
@VaelVictus Pas si vite. Je suis désolé de dire qu'ils l'ont changé à nouveau un an après avoir publié ceci ... et j'ai oublié cette réponse. Lisez cette réponse: stackoverflow.com/a/5876747/257493
Incognito
1
Cette différenciation document / non-document entre .prop et .attr est infiniment utile et je n'ai jamais vu le contexte cadré de manière aussi succincte auparavant. Très appréciée!
uncivaledcreations
51

Code de travail de mes sources:

MONDE HTML

<select name="select_from" disabled>...</select>

MONDE JS

var from = jQuery('select[name=select_from]');

//add disabled
from.attr('disabled', 'disabled');



//remove it
from.removeAttr("disabled");
Mircea Stanciu
la source
2
Pour les personnes venant ici de Google, directement de jQuery :As of jQuery 1.6, the .attr() method returns undefined for attributes that have not been set. To retrieve and change DOM properties such as the checked, selected, or disabled state of form elements, use the .prop() method
Erenor Paz
16

Si vous utilisez jQuery, il existe plusieurs façons de définir l'attribut désactivé.

var $element = $(...);
    $element.prop('disabled', true);
    $element.attr('disabled', true); 

    // The following do not require jQuery
    $element.get(0).disabled = true;
    $element.get(0).setAttribute('disabled', true);
    $element[0].disabled = true;
    $element[0].setAttribute('disabled', true);
iConnor
la source
Et quoi $element.eq(0)[0].disabled = true;? :-P
qwertynl
1
Ouais, c'est trop avancé pour moi, je ne vais pas aussi loin pour améliorer les performances.
iConnor
+1. Bien que ce soit un peu redondant. Si vous avez affaire à une liste de nœuds / un tableau d'éléments, il est idiot de les sélectionner par l'index comme ça. L'itération ou la simple sélection de l'élément dont vous avez besoin est plus logique.
13
$(element).prop('disabled', true); //true|disabled will work on all
$(element).attr('disabled', true); 
element.disabled = true;
element.setAttribute('disabled', true);

Tous ces éléments sont des solutions parfaitement valables. Choisissez celui qui correspond le mieux à vos besoins.


la source
1
Merci de fournir une solution qui ne nécessite pas jQuery.
Elias Zamaria
12

Vous pouvez obtenir l'élément DOM et définir directement la propriété disabled.

$(".shownextrow").click(function() { 
  $(this).closest("tr").next().show()
          .find('.longboxsmall').hide()[0].disabled = 'disabled';
});

ou s'il y en a plus d'un, vous pouvez utiliser each()pour tous les définir:

$(".shownextrow").click(function() { 
  $(this).closest("tr").next().show()
          .find('.longboxsmall').each(function() {
               this.style.display = 'none';
               this.disabled = 'disabled';
          });
});
utilisateur113716
la source
5

Utilisez simplement la attr()méthode de jQuery

$(this).closest("tr").next().show().find('.longboxsmall').attr('disabled', 'disabled');
Gabe
la source
3
et supprimer l'état désactivé en utilisant.removeAttr('disabled');
ruhong
2

Puisque la question demandait comment faire cela avec JS, je propose une implémentation JS vanille.

var element = document.querySelector(".your-element-class-goes-here");
// it's a good idea to check whether the element exists
if (element != null && element != undefined) {
  element.disabled = "disabled";
}

Viktor
la source