Qual è il modo più semplice per disabilitare / abilitare pulsanti e collegamenti (jQuery + Bootstrap)


360

A volte uso ancore in stile pulsanti e altre volte uso solo pulsanti. Voglio disabilitare specifiche cose clicky in modo che:

  • Sembrano disabilitati
  • Smettono di essere cliccati

Come posso fare questo?


vedere il mio post in fondo, ma qui è il pulsante $ meno descrittivo ("yourSelector"). ("abilita"); // attiva il pulsante o $ ("yourSelector"). button ("disabilita"); // disabilita il pulsante se viene utilizzato il widget pulsante di jqueryUI.
El Bayames,

La documentazione BS3 dice di utilizzare role="button"per i collegamenti, ma ciò non sembra influenzare questo problema. getbootstrap.com/css/#buttons
Jess

2
Avere a.btn[disabled]visualizzato disabilitato ma rimanere cliccabile è un bug in Bootstrap IMO. L'attributo [disabled]dovrebbe apparire disabilitato solo per buttone input.
Jess,

Risposte:


575

pulsanti

I pulsanti sono semplici da disabilitare come lo disabledè una proprietà button gestita dal browser:

<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>

Per disabilitarli con una funzione jQuery personalizzata, faresti semplicemente uso di 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);

J Pulsante Disinstalla disabilitato e input demo .

Altrimenti faresti uso del prop()metodo di jQuery :

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

Tag di ancoraggio

Vale la pena notare che disablednon è una proprietà valida per i tag di ancoraggio. Per questo motivo, Bootstrap utilizza il seguente stile sui suoi .btnelementi:

.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;
}

Nota come la [disabled]proprietà è targetizzata e una .disabledclasse. La .disabledclasse è ciò che è necessario per far apparire disabilitato un tag di ancoraggio.

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

Naturalmente, ciò non impedirà il funzionamento dei collegamenti quando si fa clic. Il link sopra ci porterà a http://example.com . Per evitare ciò, possiamo aggiungere un semplice pezzo di codice jQuery per indirizzare i tag anchor con la disabledclasse da chiamare event.preventDefault():

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

Possiamo attivare o disattivare la disabledclasse utilizzando 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 demo di collegamento disabilitato .


Combinato

Possiamo quindi estendere la precedente funzione di disabilitazione fatta sopra per verificare il tipo di elemento che stiamo tentando di disabilitare utilizzando is(). In questo modo possiamo toggleClass()se non è un inputo buttonelemento, o attivare la disabledproprietà se è:

// 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);

Demo JSFiddle combinata completa .

Vale la pena notare inoltre che la funzione sopra funzionerà anche su tutti i tipi di input.


Grazie per la risposta esaustiva. Si prega di consultare il mio Modifica 1 per una versione di script di caffè. Sto ancora lottando per ottenere i collegamenti per impedire il clic. Volevi dire per me mantenere i return false if $(@).prop('disabled')gestori dei clic personalizzati? Senza quella linea, questi gestori vengono eseguiti indipendentemente.
biofrattale,

1
@biofractal, come ho già detto, disablednon è una proprietà di tag di ancoraggio valida, quindi non dovrebbe essere utilizzata. L'evento click ho dato si basa sulla .disabledclasse, ma quello che si può utilizzare è hasClass('disabled')- se questo è vero, preventDefault.
James Donnelly,

Ah ok. Grazie. Quindi perché non dovrei creare e usare la disabledproprietà sull'ancora. È un oggetto dinamico, quindi posso semplicemente impostarlo e usarlo, come se stessi estendendo il set di funzionalità dell'ancora? Ho aggiornato la mia risposta di seguito per mostrarlo. Cosa ne pensi? È male? Inoltre, devi .off()l' preventDefaultevento click quando si riattiva un link?
biofrattale,

Va contro le specifiche e non supererebbe i test di validazione. Se si desidera una disabledproprietà personalizzata , è possibile utilizzare gli data-*attributi . Poiché Bootstrap applica già a te gli stessi disabledstili di proprietà, class="disabled"puoi anche fare affidamento sulla classe.
James Donnelly,

Capito: ho adattato la mia risposta per riflettere i tuoi commenti. Sono ancora preoccupato che se collego preventDefaulta tutti gli eventi di ancoraggio clic, dovrò staccarli quando il collegamento viene riabilitato. O sto fraintendendo qualcosa?
biofrattale

48

Non riesco a pensare a un modo più semplice / più semplice! ;-)


Utilizzo dei tag di ancoraggio (collegamenti):

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

Per abilitare il tag Anchor:

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

inserisci qui la descrizione dell'immagine


Per disabilitare il tag Anchor:

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

inserisci qui la descrizione dell'immagine


27

Supponiamo di avere un campo di testo e il pulsante di invio,

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

Disattivazione:

Per disabilitare qualsiasi pulsante, ad esempio, invia il pulsante devi solo aggiungere l' attributo disabilitato come,

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

Dopo aver eseguito la riga sopra, il tag html del pulsante di invio sarà simile al seguente:

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

Si noti che l'attributo "disabilitato" è stato aggiunto .

Abilitare:

Per abilitare il pulsante, ad esempio quando hai del testo nel campo di testo. Dovrai rimuovere l' attributo disabilita per abilitare il pulsante come,

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

Ora il codice sopra rimuoverà l'attributo 'disabilitato'.


22

So di essere in ritardo alla festa, ma per rispondere in modo specifico alle due domande:

"Voglio solo disabilitare specifici elementi clicky in modo che:

  • Smettono di fare clic
  • Sembrano disabilitati

Quanto può essere difficile?"

Smettono di fare clic

1. Per i pulsanti piace <button>o <input type="button">si aggiunge l'attributo: disabled.

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

2. Per i collegamenti, QUALSIASI collegamento ... in realtà, qualsiasi elemento HTML, è possibile utilizzare eventi puntatore CSS3 .

.selector { pointer-events:none; }

Il supporto del browser per gli eventi dei puntatori è eccezionale per lo stato dell'arte di oggi (5/12/14). Ma di solito dobbiamo supportare i browser legacy nel regno IE, quindi IE10 e versioni successive NON supportano eventi puntatore: http://caniuse.com/pointer-events . Quindi utilizzare una delle soluzioni JavaScript menzionate da altri qui potrebbe essere la strada da percorrere per i browser legacy.

Ulteriori informazioni sugli eventi puntatore:

Sembrano disabilitati

Ovviamente questa è una risposta CSS, quindi:

1. Per pulsanti come <button>o <input type="button">utilizzare il [attribute]selettore:

button[disabled] { ... }

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

-

Ecco una demo di base con le cose che ho citato qui: http://jsfiddle.net/bXm5B/4/

Spero che sia di aiuto.


17

Se, come me, vuoi solo disabilitare un pulsante, non perdere la semplice risposta sottilmente nascosta in questo lungo thread:

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

il vero eroe, questo è tutto ciò di cui avevo bisogno.
ricks

7

@James Donnelly ha fornito una risposta completa che si basa sull'estensione di jQuery con una nuova funzione. Questa è un'ottima idea, quindi adatterò il suo codice in modo che funzioni nel modo in cui ne ho bisogno.

Estensione di 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)

uso

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

Il codice elaborerà un singolo elemento o un elenco di elementi.

I pulsanti e gli input supportano la disabledproprietà e, se impostati su true, appariranno disabilitati (grazie a bootstrap) e non si attiveranno quando si fa clic.

Le ancore non supportano la proprietà disabilitata, quindi faremo affidamento sulla .disabledclasse per renderle disabilitate (grazie di nuovo al bootstrap) e agganciare un evento click predefinito che impedisce il clic restituendo false (non è necessario preventDefaultvedere qui ) .

Nota : non è necessario sganciare questo evento quando si riattivano le ancore. Rimuovere semplicemente la .disabledclasse fa il trucco.

Ovviamente, questo non aiuta se hai collegato un gestore di clic personalizzato al link, cosa molto comune quando usi bootstrap e jQuery. Quindi per far fronte a questo stiamo per usare l' isDisabled()estensione per testare la .disabledclasse, in questo modo:

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

Spero che questo aiuti a semplificare un po 'le cose.


7

Nota che c'è un problema strano se stai usando i pulsanti JS di Bootstrap e lo stato 'caricamento'. Non so perché questo accada, ma ecco come risolverlo.

Supponi di avere un pulsante e di impostarlo sullo stato di caricamento:

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

Ora vuoi toglierlo dallo stato di caricamento, ma anche disabilitarlo (ad esempio il pulsante era un pulsante Salva, lo stato di caricamento indicava una convalida in corso e la convalida non è riuscita). Questo sembra ragionevole Bootstrap JS:

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

Sfortunatamente, questo ripristinerà il pulsante, ma non lo disabiliterà. Apparentemente, button()esegue alcune attività ritardate. Quindi dovrai anche posticipare la disabilitazione:

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

Un po 'fastidioso, ma è uno schema che sto usando molto.


6

Ottima risposta e contributi da parte di tutti! Ho dovuto estendere leggermente questa funzione per includere la disabilitazione di elementi selezionati:

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);
    });
}});

Sembra funzionare per me. Ringrazia tutti!


5

Per quel tipo di comportamento uso sempre il buttonwidget jQueryUI , lo uso per collegamenti e pulsanti.

Definisci il tag in HTML:

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

Utilizzare jQuery per inizializzare i pulsanti:

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

Utilizzare i buttonmetodi del widget per disabilitarli / abilitarli:

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

Ciò si occuperà del comportamento del pulsante e del cursore, ma se è necessario approfondire e modificare lo stile del pulsante quando disabilitato, sovrascrivere le seguenti classi CSS all'interno del file di stile CSS della pagina.

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

Ma ricorda: quelle classi CSS (se modificate) cambieranno lo stile anche per altri widget.


1
Abbastanza sicuro che questa risposta sia per i pulsanti dell'interfaccia utente jQuery e non per i pulsanti Bootstrap utilizzati con jQuery semplice alla vaniglia, quest'ultimo è ciò che utilizza l'OP. A proposito, inserire una risposta in un commento sulla domanda non è il metodo di diffusione preferito. ; ^)
Ruffin,

3

Quanto segue ha funzionato molto bene per me:

$("#button").attr('disabled', 'disabled');

2

Questa è una risposta piuttosto tardiva, tuttavia mi sono imbattuto in questa domanda durante la ricerca di un modo per disabilitare i pulsanti boostrap dopo aver fatto clic su di essi e forse aggiungere un bell'effetto (fe a spinner). Ho trovato una grande biblioteca che fa esattamente questo:

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

Devi solo includere i CSS e i js richiesti, aggiungere alcune proprietà ai tuoi pulsanti e abilitare lada con javascript ... Presto! I tuoi pulsanti hanno una nuova vita (controlla la demo per vedere quanto è bello)!


2

Questo sopra non funziona perché a volte

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

regola il tuo codice con

if(!$(this).attr('checked') || $(this).attr('checked') == false){

2

So che la mia risposta è in ritardo, ma IMO è il modo più semplice per attivare / disattivare un pulsante "Abilita" e un pulsante "Disabilita"

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;
  }
}

1

Supponiamo di avere questi pulsanti sulla pagina come:

<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()"/>

Il codice js:

function change(){
   var toenable = document.querySelectorAll(".byBtn");        
    for (var k in toenable){
         toenable[k].removeAttribute("disabled");
    }
}

1

Supponiamo che tu abbia questo aspetto attualmente abilitato.

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

Aggiungi questo:

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

e otterrai questo che disabiliterà il pulsante

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

2
La domanda è stata posta su pulsanti e ancore. La disabledproprietà non è una proprietà valida per i tag di ancoraggio.
biofrattale

0

Se si desidera disabilitare il clic, è anche possibile aggiungere questo inline in HTML

style="cursor: not-allowed;"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.