Nếu "# trang-làm mới" thực sự là một nút (một button
hoặc input type="button"
phần tử), bạn có thể sử dụng tài sản disabled
của nó và sau đó thiết lập một thời gian chờ để khôi phục lại nó:
$('#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;
});
Nếu nó không phải thực sự một nút, bạn có thể mô phỏng thuộc tính disabled
. Tôi sẽ làm điều đó với một lớp học ở đây để bạn có thể hiển thị trạng thái khuyết tật cho người sử dụng thông qua 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;
});
Lưu ý rằng trong trường hợp đầu tiên, tôi đang giữ một tham chiếu đến phần tử DOM (var refreshButton = this;
), nhưng trong trường hợp thứ hai, tôi giữ một tham chiếu đến một wrapper jQuery xung quanh nó (var $refreshButton = $(this);
). Đó là chỉ vì jQuery giúp dễ dàng kiểm tra/thêm/xóa tên lớp. Trong cả hai trường hợp, tham chiếu đó được phát hành khi các đóng trong trình xử lý sự kiện của bạn được giải phóng (ở trên, đó là năm giây sau khi cuộc gọi ajax hoàn tất).
Bạn nói cụ thể bạn muốn vô hiệu hóa nó sau cuộc gọi ajax hoàn tất, nhưng như Marcus chỉ ra dưới đây, có thể bạn muốn vô hiệu hóa nó khi bắt đầu cuộc gọi ajax. Chỉ cần di chuyển chút vô hiệu hóa lên một chút, và thêm một handler error
cho trường hợp success
không được gọi là (error
xử lý thường là một ý tưởng tốt trong mọi trường hợp):
Bất nút:
$('#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;
});
Simulated qua 'disabled' lớp:
$('#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;
});
lẽ là một ý tưởng tốt sẽ được vô hiệu hóa các nút trước khi cuộc gọi AJAX đi ra ngoài (để tránh spam cuộc gọi AJAX) và sau đó nếu cuộc gọi thành công đến sử dụng lại 'clearTimeout' để loại bỏ thời gian chờ 5 giây hiện tại và tạo một cái mới từ thời điểm đó để kích hoạt lại nút. --- Ngoài ra, tôi cũng có thể có một 'error: function() {}' đã xóa hết thời gian chờ và kích hoạt lại nút nếu cách tiếp cận đó được sử dụng để tránh nút bị vô hiệu hóa trong trường hợp cuộc gọi AJAX bị lỗi. –
@Marcus: Đồng ý. Câu hỏi đặt ra là cụ thể về thời điểm họ muốn làm điều đó, nhưng tôi sẽ thêm một ghi chú. –
@TJ Yup, chỉ cần thêm hai giá trị pennys của tôi. –