2010-09-06 15 views

risposta

9

Disabilitare il pulsante e quindi utilizzare setTimeout per eseguire una funzione che abilita il pulsante dopo alcuni secondi.

$('#some-button').attr("disabled", "disabled"); 
setTimeout('enableButton()', 5000); 

function enableButton(){ 
    $('#some-button').removeAttr('disabled'); 
} 
+0

Questo non funziona: http://jsfiddle.net/RPQmM/ Credo che il setTimeout è chiamata sbagliata. – Ender

+2

@Ender Non funziona perché la funzione 'enableButton' non è nell'ambito globale che è richiesta dal * modo * in cui viene chiamato 'setTimeout'. Vedi questo: http://jsfiddle.net/RPQmM/1/ –

9

Dal momento che questo è probabile che sia un compito come si potrebbe ripetere, penso che il modo migliore per farlo sarebbe quello di estendere jQuery in questo modo:

$.fn.timedDisable = function(time) { 
    if (time == null) { time = 5000; } 
    return $(this).each(function() { 
     $(this).attr('disabled', 'disabled'); 
     var disabledElem = $(this); 
     setTimeout(function() { 
      disabledElem.removeAttr('disabled'); 
     }, time); 
    }); 
}; 

Questo vi permetterà di chiamare una funzione su un insieme di elementi abbinati che li disabiliterà temporaneamente. Come è scritto, puoi semplicemente chiamare la funzione, e gli elementi selezionati saranno disabilitati per 5 secondi. Si dovrebbe fare in questo modo:

$('#some-button').timedDisable(); 

È possibile regolare l'impostazione tempo predefinito modificando il 5000 nella seguente riga:

if (time == null) { time = 5000; } 

si può opzionalmente passare in un valore di tempo in millisecondi per controllare come a lungo gli elementi saranno disabilitati per. Per esempio:

$('#some-button').timedDisable(1000); 

Ecco una demo di lavoro: http://jsfiddle.net/fG2ES/

1

potrebbe non essere la soluzione più elegante, ma ho pensato di giocare con le code di jQuery su questo ...

​$.fn.disableFor = function (time) { 
    var el = this, qname = 'disqueue'; 
    el.queue(qname, function() { 
     el.attr('disabled', 'disabled'); 
     setTimeout(function() { 
      el.dequeue(qname); 
     }, time || 3000); 
    }) 
    .queue(qname, function() { 
     el.removeAttr('disabled'); 
    }) 
    .dequeue(qname); 
}; 

$('#btn').click(function() { 
    ​$(this).disableFor(2000);​​​​ 
}); 

Questo è dove ho lavorato fuori ... http://jsfiddle.net/T9QJM/

E, per riferimento, How do I chain or queue custom functions using JQuery?

2

Prova questo.

(function(){ 
$('button').on('click',function(){ 
var $this=$(this); 
     $this 
      .attr('disabled','disabled'); 
      setTimeout(function() { 
      $this.removeAttr('disabled'); 
      }, 3000); 
     }); 
})(); 

è possibile trovare un esempio di lavoro qui http://jsfiddle.net/informativejavascript/AMqb5/

Problemi correlati