222 votes

Désactiver l'attribut de l'entrée en utilisant jQuery

Voici mon code :

$("#product1 :checkbox").click(function(){
    $(this)
        .closest('tr') // Find the parent row.
            .find(":input[type='text']") // Find text elements in that row.
                .attr('disabled',false).toggleClass('disabled') // Enable them.
                .end() // Go back to the row.
            .siblings() // Get its siblings
                .find(":input[type='text']") // Find text elements in those rows.
                .attr('disabled',true).removeClass('disabled'); // Disable them.
});

Comment basculer .attr('disabled',false); ?

Je n'arrive pas à le trouver sur Google.

0 votes

Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser la propriété "disabled" du champ ? $("input").get(0).disabled = isFalse; // jsfiddle.net/uAfhj

0 votes

J'ai trouvé le Dépend de plugin qui pourrait vous être utile

516voto

Arne Points 996
$('#el').prop('disabled', (i, v) => !v);

En .prop() accepte deux arguments :

  • Propriété nom (désactivé, coché, sélectionné) tout ce qui est vrai ou faux
  • Propriété valeur peut l'être :
  • ( vide ) - renvoie la valeur actuelle.
  • booléen (vrai/faux) - définit la valeur de la propriété.
  • fonction - Est exécuté pour chaque élément trouvé, la valeur renvoyée est utilisée pour définir la propriété. Deux arguments sont transmis ; le premier argument est la propriété index (0, 1, 2, augmente pour chaque élément trouvé). Le deuxième argument est le valeur de l'élément (vrai/faux).

Dans ce cas, j'ai utilisé une fonction qui m'a fourni l'index (i) et la valeur actuelle (v), puis j'ai renvoyé l'opposé de la valeur actuelle, de sorte que l'état de la propriété est inversé.

2 votes

Upvoted as (I believe) .prop() is the correct way to do this and was added precisely for the purpose of setting things like disabled="disabled" + its elegant

0 votes

C'est une excellente réponse !

0 votes

Solution parfaite, simple, courte et efficace ! merci mon pote !

104voto

ifaour Points 29213

I deviner pour obtenir une comparaison complète des navigateurs disabled doit être fixé par la valeur disabled ou se faire renvoyer !
Voici un petit plugin que je viens de réaliser :

(function($) {
    $.fn.toggleDisabled = function() {
        return this.each(function() {
            var $this = $(this);
            if ($this.attr('disabled')) $this.removeAttr('disabled');
            else $this.attr('disabled', 'disabled');
        });
    };
})(jQuery);

Exemple de lien .

EDIT : mise à jour du lien/code de l'exemple pour maintenir la chaînabilité !
EDIT 2 :
Basé sur le commentaire de @lonesomeday, voici une version améliorée :

(function($) {
    $.fn.toggleDisabled = function(){
        return this.each(function(){
            this.disabled = !this.disabled;
        });
    };
})(jQuery);

28 votes

Cela peut fonctionner, mais ce sera lent, car vous créez constamment de nouveaux objets jQuery. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });} est tout ce dont vous avez besoin.

0 votes

@lonesomeday : J'allais poster ceci mais j'ai tendre de penser que ce n'est pas la bonne façon de paramétrer/désynchroniser disabled attribut. Quoi qu'il en soit, si vous pouvez confirmer qu'il s'agit d'une solution inter-navigateurs, je mettrai à jour ma réponse.

2 votes

Pour les futurs googleurs, cette solution fonctionne également pour l'attribut "required".

22voto

    $('#checkbox').click(function(){
        $('#submit').attr('disabled', !$(this).attr('checked'));
    });

2 votes

Note : ne fonctionne qu'avec jQuery 1.6. Utilisez .prop() au lieu de attr() dans les deux cas pour récupérer les valeurs booléennes. Voir api.jquery.com/prop

0 votes

@ManuelArwedSchmidt Pas vrai. Je pense que vous ne comprenez pas la différence entre attr y prop encore.

11voto

unequalsine Points 104

Une autre option simple qui se met à jour en cliquant sur la case à cocher.

HTML :

<input type="checkbox" id="checkbox/>
<input disabled type="submit" id="item"/>

jQuery :

$('#checkbox').click(function() {
    if (this.checked) {
        $('#item').prop('disabled', false); // If checked enable item       
    } else {
        $('#item').prop('disabled', true); // If checked disable item                   
    }
});

En action : lien

3voto

eon Points 522

Un peu plus tard, et grâce à @arne, j'ai créé cette petite fonction similaire pour gérer les cas où l'entrée doit être désactivée ET cachée, ou activée ET affichée :

function toggleInputState(el, on) {
  // 'on' = true(visible) or false(hidden)
  // If a field is to be shown, enable it; if hidden, disable it.
  // Disabling will prevent the field's value from being submitted
  $(el).prop('disabled', !on).toggle(on);
}

Un objet jQuery (tel que $('input[name="something"])) est alors simplement commuté à l'aide d'un objet jQuery :

toggleInputState(myElement, myBoolean)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X