Quelle est la façon la plus simple de désactiver/activer les boutons et les liens (jQuery + Bootstrap)

parfois j'utilise des ancres stylisées comme des boutons et parfois j'utilise juste des boutons. Je veux désactiver des choses spécifiques de manière à ce que:

  • Ils regardent désactivé
  • ils cessent d'être cliqués

Comment puis-je faire cela?

343
demandé sur biofractal 2013-05-27 20:13:34

15 réponses

Boutons

Les boutons

sont simples à désactiver car disabled est une propriété de bouton qui est gérée par le navigateur:

<input type="submit" class="btn" value="My Input Submit" disabled/>
<input type="button" class="btn" value="My Input Button" disabled/>
<button class="btn" disabled>My Button</button>

pour les désactiver avec une fonction jQuery personnalisée, vous utiliseriez simplement fn.extend() :

// Disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            this.disabled = state;
        });
    }
});

// Disabled with:
$('input[type="submit"], input[type="button"], button').disable(true);

// Enabled with:
$('input[type="submit"], input[type="button"], button').disable(false);

JSFiddle bouton désactivé et l'entrée de démonstration .

sinon vous auriez utiliser la méthode prop() de jQuery:

$('button').prop('disabled', true);
$('button').prop('disabled', false);

Ancre " Tags

Il est intéressant de noter que disabled n'est pas un propriété valide pour les balises d'ancrage. Pour cette raison, Bootstrap utilise le style suivant sur ses .btn éléments:

.btn.disabled, .btn[disabled] {
    cursor: default;
    background-image: none;
    opacity: 0.65;
    filter: alpha(opacity=65);
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
    color: #333;
    background-color: #E6E6E6;
}

notez comment la propriété [disabled] est ciblée ainsi que des .disabled classe. La classe .disabled est ce qui est nécessaire pour faire apparaître une balise d'ancrage désactivée.

<a href="http://example.com" class="btn">My Link</a>

bien sûr, cela n'empêchera pas les liens de fonctionner lorsque cliqué. Le lien ci-dessus nous mènera à http://example.com . Pour éviter cela, nous pouvons ajouter un simple morceau de code jQuery pour cibler les étiquettes d'ancrage avec la classe disabled à appeler event.preventDefault() :

$('body').on('click', 'a.disabled', function(event) {
    event.preventDefault();
});

nous pouvons basculer la classe disabled en utilisant toggleClass() :

jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            $this.toggleClass('disabled', state);
        });
    }
});

// Disabled with:
$('a').disable(true);

// Enabled with:
$('a').disable(false);

JSFiddle désactivé le lien de la démo .


combiné

nous pouvons alors étendre la fonction de désactivation précédente faite ci-dessus pour vérifier le type d'élément que nous essayons de désactiver en utilisant is() . De cette façon, nous pouvons toggleClass() si ce n'est pas un élément input ou button , ou basculer la propriété disabled si c'est:

// Extended disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            if($this.is('input, button, textarea, select'))
              this.disabled = state;
            else
              $this.toggleClass('disabled', state);
        });
    }
});

// Disabled on all:
$('input, button, a').disable(true);

// Enabled on all:
$('input, button, a').disable(false);

combinée Complète JSFiddle démo .

il est intéressant de noter que la fonction ci-dessus fonctionnera également sur tous les types d'entrée.

565
répondu James Donnelly 2016-03-19 17:28:21

Je ne peux pas penser à un moyen plus simple/plus facile! ;- )


utilisant des balises D'ancrage (liens):

<a href="#delete-modal" class="btn btn-danger" id="delete">Delete</a>

pour activer l'étiquette D'ancrage:

 $('#delete').removeClass('disabled');
 $('#delete').attr("data-toggle", "modal");

enter image description here


pour désactiver l'étiquette D'ancrage:

 $('#delete').addClass('disabled');
 $('#delete').removeAttr('data-toggle');

enter image description here

43
répondu oikonomopo 2017-10-10 12:51:48

supposons que vous ayez le champ de texte et le bouton Soumettre,

<input type="text" id="text-field" />
<input type="submit" class="btn" value="Submit"/>

handicapant:

pour désactiver n'importe quel bouton, par exemple, soumettre bouton, vous avez juste besoin d'ajouter désactivé attribut as,

$('input[type="submit"]').attr('disabled','disabled');

après avoir exécuté la ligne ci-dessus, votre balise html de bouton Soumettre ressemblerait à ceci:

<input type="submit" class="btn" value="Submit" disabled/>

notez que l'attribut" disabled "a ajouté .

Activation:

pour activer le bouton, comme quand vous avez du texte dans le champ de texte. Vous devrez supprimer l'attribut désactivé pour activer le bouton as,

 if ($('#text-field').val() != '') {
     $('input[type="submit"]').removeAttr('disabled');
 }

maintenant le code ci-dessus supprimera l'attribut "disabled".

26
répondu Sohail xIN3N 2015-04-04 10:02:08

je sais que je suis en retard à la fête, mais pour répondre spécifiquement aux deux questions:

"je veux juste désactiver certains clicky-les choses de la sorte:

  • ils arrêtent de cliquer sur
  • Ils regardent désactivé

comment cela peut-il être difficile?"

ils arrêtent de cliquer sur

1.  Pour les boutons comme <button> ou <input type="button"> vous ajoutez l'attribut: disabled .

<button type="submit" disabled>Register</button>
<input type="button" value="Register" disabled>

2.  Pour les liens, un lien... en fait, tout élément HTML, vous pouvez utiliser CSS3 pointer events .

.selector { pointer-events:none; }

la prise en charge du navigateur pour les événements pointeurs est impressionnante par l'état actuel de l'art (5/12/14). Mais nous devons généralement prendre en charge les anciens navigateurs dans le domaine de IE, donc IE10 et ci-dessous ne supportent pas les événements de pointeur: http://caniuse.com/pointer-events . Ainsi, l'utilisation de L'une des solutions JavaScript mentionnées par d'autres ici peut être la voie à suivre pour les navigateurs traditionnels.

plus d'informations sur les événements pointer:

ils ont l'air handicapés

évidemment c'est une réponse CSS, donc:

1.  Pour les boutons comme <button> ou <input type="button"> utilisez le sélecteur [attribute] :

button[disabled] { ... }

input[type=button][disabled] { ... }

--

voici une démo de base avec les trucs que j'ai mentionnés ici: http://jsfiddle.net/bXm5B/4/

Espérons que cette aide.

21
répondu Ricardo Zea 2015-09-12 03:46:38

si, comme moi, vous voulez juste désactiver un bouton, ne manquez pas la réponse simple subtilement cachée dans ce long fil:

 $("#button").prop('disabled', true);
16
répondu Graham Laight 2016-10-31 15:20:13

@James Donnelly a fourni une réponse complète qui repose sur l'extension de jQuery avec une nouvelle fonction. C'est une excellente idée, donc je vais adapter son code pour qu'il fonctionne comme j'en ai besoin.

Extension de jQuery

$.fn.disable=-> setState $(@), true
$.fn.enable =-> setState $(@), false
$.fn.isDisabled =-> $(@).hasClass 'disabled'

setState=($el, state) ->
    $el.each ->
        $(@).prop('disabled', state) if $(@).is 'button, input'
        if state then $(@).addClass('disabled') else $(@).removeClass('disabled')

    $('body').on('click', 'a.disabled', -> false)

Utilisation

$('.btn-stateful').disable()
$('#my-anchor').enable()

le code traitera un seul élément ou une liste d'éléments.

Les boutons et les entrées supportent la propriété disabled et, si elles sont définies à true , elles auront l'air désactivées (grâce à bootstrap) et ne se déclencheront pas lorsque cliqué.

ancres ne supportent pas la propriété désactivée donc à la place Nous allons compter sur la classe .disabled pour les faire paraître désactivé (grâce à bootstrap de nouveau) et accrocher un événement click par défaut qui empêche le click en retournant false (pas besoin de preventDefault voir ici ).

Note : vous n'avez pas besoin de décrocher cet événement lors de la réactivation des ancres. Il suffit de supprimer la classe .disabled .

bien sûr, cela n'aide pas si vous avez attaché un gestionnaire de clic personnalisé au lien, quelque chose qui est très commun lors de l'utilisation de bootstrap et jQuery. Donc, pour faire face à cela, nous allons utiliser l'extension isDisabled() pour tester la classe .disabled , comme ceci:

$('#my-anchor').click -> 
    return false if $(@).isDisabled()
    # do something useful

j'espère que ça simplifie un peu les choses.

7
répondu biofractal 2013-05-28 15:37:46

notez qu'il y a un problème bizarre si vous utilisez les boutons JS de Bootstrap et l'état de chargement. Je ne sais pas pourquoi ça arrive, Mais voici comment arranger ça.

dites que vous avez un bouton et que vous le mettez à l'état de chargement:

var myButton = $('#myBootstrapButton');
myButton.button('loading');

Maintenant vous voulez le sortir de l'état de chargement, mais aussi le désactiver (par exemple le bouton était un bouton de sauvegarde, l'état de chargement indiquait une validation en cours et la validation échouait). Cela ressemble à reasonable Bootstrap JS:

myButton.button('reset').prop('disabled', true); // DOES NOT WORK

malheureusement, cela va réinitialiser le bouton, mais pas le désactiver. Apparemment, button() effectue une tâche retardée. Vous devrez donc aussi reporter votre handicap:

myButton.button('reset');
setTimeout(function() { myButton.prop('disabled', true); }, 0);

Un peu ennuyeux, mais c'est un modèle que j'utilise beaucoup.

7
répondu Henrik Heimbuerger 2016-02-18 09:05:46

grande réponse et contributions de tous! J'ai dû étendre légèrement cette fonction pour inclure la désactivation de certains éléments:

jQuery.fn.extend({
disable: function (state) {
    return this.each(function () {
        var $this = jQuery(this);
        if ($this.is('input, button'))
            this.disabled = state;
        else if ($this.is('select') && state)
            $this.attr('disabled', 'disabled');
        else if ($this.is('select') && !state)
            $this.removeAttr('disabled');
        else
            $this.toggleClass('disabled', state);
    });
}});

Semble fonctionner pour moi. Merci à tous!

6
répondu Brandon Johnson 2014-11-11 01:07:29

pour ce genre de comportement, j'utilise toujours le widget jQueryUI button , Je l'utilise pour les liens et les boutons.

définit la balise dans HTML:

<button id="sampleButton">Sample Button</button>
<a id="linkButton" href="yourHttpReferenceHere">Link Button</a>

utiliser jQuery pour initialiser les boutons:

$("#sampleButton").button();
$("#linkButton").button();

utiliser les méthodes de widget button pour les désactiver/les activer:

$("#sampleButton").button("enable"); //enable the button
$("#linkButton").button("disable"); //disable the button

qui prendra soin du bouton et du comportement du curseur, mais si vous avez besoin d'aller plus loin et de changer le bouton style lorsqu'il est désactivé écrase alors les classes CSS suivantes dans votre fichier de style CSS de page.

.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
      background-color:aqua;
      color:black;
 }

mais rappelez-vous: ces classes CSS (si changées) changeront le style pour les autres widgets aussi.

5
répondu El Bayames 2015-11-05 00:03:53

ce qui suit a très bien fonctionné pour moi:

$("#button").attr('disabled', 'disabled');
3
répondu Raptor 2017-05-02 04:06:39

c'est une réponse plutôt tardive, mais je suis tombé sur cette question en cherchant un moyen de désactiver les boutons boostrap après les avoir cliqués et peut-être ajouter un effet agréable (F. e a spinner). J'ai trouvé une grande bibliothèque qui fait exactement cela:

http://msurguy.github.io/ladda-bootstrap /

vous n'incluez que les CSS et js nécessaires, ajoutez quelques propriétés à vos boutons et activez lada avec javascript... Presto ! Vos boutons ont une nouvelle vie (s'il vous plaît vérifier la démo pour voir comment il est beau) !

2
répondu Serafeim 2015-03-19 20:12:26

ce qui précède ne fonctionne pas parce que parfois

$(this).attr('checked') == undefined

ajustez votre code avec

if(!$(this).attr('checked') || $(this).attr('checked') == false){
2
répondu Kiko Seijo 2015-07-15 18:56:43

je sais que ma réponse est en retard, mais IMO c'est la façon la plus facile de basculer un bouton 'Activer' et bouton 'Désactiver'

function toggleButtonState(button){

  //If button is enabled, -> Disable
  if (button.disabled === false) {
    button.disabled = true;

  //If button is disabled, -> Enable
  } else if (button.disabled === true) {
    button.disabled = false;
  }
}
2
répondu jward01 2015-09-19 20:00:42

supposons que vous ayez ces boutons sur la page comme:

<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit"value="Enable All" onclick="change()"/>

le code js:

function change(){
   var toenable = document.querySelectorAll(".byBtn");        
    for (var k in toenable){
         toenable[k].removeAttribute("disabled");
    }
}
1
répondu Samit 2015-10-21 07:45:18

dites que vous avez ce qui ressemble à ceci qui est actuellement enable.

<button id="btnSave" class="btn btn-info">Save</button>

il suffit d'ajouter ceci:

$("#btnSave").prop('disabled', true);

et vous obtiendrez ce qui désactivera le bouton

<button id="btnSave" class="btn btn-primary" disabled>Save</button>
1
répondu Apollo 2017-05-03 19:24:28