Se "# page-refresh" è in realtà un pulsante (un button
o input type="button"
elemento), è possibile utilizzare la sua proprietà disabled
e quindi impostare un timeout per ripristinarlo:
$('#page-refresh').click(function() {
var refreshButton = this;
$.ajax({
url: "/page1.php",
cache: false,
dataType: "html",
success: function(data) {
$('#pagelist').html(data);
refreshButton.disabled = true;
setTimeout(function() {
refreshButton.disabled = false;
}, 5000);
}
});
return false;
});
Se non è davvero un pulsante, è possibile simulare la proprietà disabled
. Lo farò con una classe qui in modo da poter mostrare lo stato disattivato per l'utente tramite CSS:
$('#page-refresh').click(function() {
var $refreshButton = $(this);
if (!$refreshButton.hasClass('disabled')) {
$.ajax({
url: "/page1.php",
cache: false,
dataType: "html",
success: function(data) {
$('#pagelist').html(data);
$refreshButton.addClass('disabled');
setTimeout(function() {
$refreshButton.removeClass('disabled');
}, 5000);
}
});
return false;
});
Si noti che nel primo caso, sto mantenendo un riferimento all'elemento DOM (var refreshButton = this;
), ma nel secondo caso sto mantenendo un riferimento ad un wrapper jQuery attorno ad esso (var $refreshButton = $(this);
). Questo perché jQuery rende facile testare/aggiungere/rimuovere nomi di classi. In entrambi i casi, tale riferimento viene rilasciato dopo il rilascio delle chiusure nel gestore di eventi (in alto, ovvero cinque secondi dopo il completamento della chiamata ajax).
Lei ha detto espressamente che volevi disabilitarlo dopo la chiamata ajax è completo, ma come sottolinea Marco di seguito, probabilmente desidera disattivarlo quando partire la chiamata AJAX. Basta muovere il bit di disattivazione di un po ', e aggiungere un error
gestore per il caso in cui success
non ottenere chiamato (error
gestori sono di solito una buona idea, in ogni caso):
pulsante reale:
$('#page-refresh').click(function() {
var refreshButton = this;
refreshButton.disabled = true; // <== Moved
$.ajax({
url: "/page1.php",
cache: false,
dataType: "html",
success: function(data) {
$('#pagelist').html(data);
setTimeout(function() {
refreshButton.disabled = false;
}, 5000);
},
error: function() { // <== Added
refreshButton.disabled = false;
}
});
return false;
});
simulato via 'disabilitato' classe:
$('#page-refresh').click(function() {
var $refreshButton = $(this);
if (!$refreshButton.hasClass('disabled')) {
$refreshButton.addClass('disabled'); // <== Moved
$.ajax({
url: "/page1.php",
cache: false,
dataType: "html",
success: function(data) {
$('#pagelist').html(data);
setTimeout(function() {
$refreshButton.removeClass('disabled');
}, 5000);
},
error: function() { // <== Added
$refreshButton.removeClass('disabled');
}
});
return false;
});
Forse una buona idea sarebbe quella di disabilitare il pulsante prima che la chiamata AJAX si spegne (per evitare spamming la chiamata AJAX) e poi se la chiamata successo arriva back usa 'clearTimeout' per eliminare un timeout esistente di 5 secondi e crearne uno nuovo da quel punto per riattivare il pulsante. --- Inoltre mi sarebbe probabilmente hanno anche un 'errore: function() {}' che ha liquidato il timeout e riattivato il pulsante se è stato utilizzato questo approccio, al fine di evitare il pulsante restante disabile per sempre in caso di chiamata AJAX fallita. –
@Marcus: concordato. La domanda era specifica su quando volevano farlo, ma aggiungerò una nota. –
@TJ Sì, aggiungendo solo i miei due penny. –