Thay đổi con trỏ thành chờ trong javascript / jquery


118

nhập mô tả hình ảnh ở đây

Làm cách nào để con trỏ của tôi thay đổi thành biểu tượng tải này khi một hàm được gọi và làm thế nào để tôi thay đổi nó trở lại thành một con trỏ bình thường trong javascript / jquery


7
nếu bạn muốn chính xác con trỏ này, bạn cần chỉ định một url, nếu không (với giải pháp Roberts) mọi người dùng sẽ thấy con trỏ tải tùy thuộc vào hệ điều hành của mình.
Christoph

1
Christoph, những gì sẽ 'chờ' hiển thị cho các hệ điều hành khác mà tôi hiện đang có trên windows 7, bởi vì tại thời điểm này nó có vẻ ổn
ahmet

2
tốt, trong vista, nó sẽ hiển thị con trỏ giống như trong windows 7, nhưng với hoạt hình bị hỏng, trên hệ điều hành Windows cũ hơn, nó sẽ hiển thị đồng hồ cát tốt và trên Linux hoặc Mac OS, nó sẽ hiển thị con trỏ "chờ" tương ứng của chúng. Ngoài ra, tôi khuyên bạn không nên thao túng con trỏ người dùng, vì điều này thường được liên kết với OS-Operations, nhưng cung cấp một chút hoạt hình chờ như thế này trực tiếp trên trang web của bạn, giúp người dùng nhìn thấy ngay từ đầu, đó là thao tác chờ được gây ra bởi trang web của bạn chứ không phải hệ điều hành.
Christoph


1
Ý tưởng hay cho máy tính để bàn, ý tưởng BAD cho thiết bị di động ...
Please_Dont_Bully_Me_SO_Lords

Câu trả lời:


195

Trong jQuery của bạn sử dụng:

$("body").css("cursor", "progress");

và sau đó trở lại bình thường

$("body").css("cursor", "default");

8
Tôi đã sử dụng $("html,body")vì cơ thể trang của tôi chỉ vừa với một nửa cửa sổ nên con trỏ vẫn mặc định khi di chuột qua nửa dưới.
Keith

80

Một đồng nghiệp đã đề xuất một cách tiếp cận mà tôi thấy thích hợp hơn với giải pháp đã chọn ở đây. Đầu tiên, trong CSS, thêm quy tắc này:

body.waiting * {
    cursor: progress;
}

Sau đó, để bật con trỏ tiến trình, hãy nói:

$('body').addClass('waiting');

và để tắt con trỏ tiến trình, hãy nói:

$('body').removeClass('waiting');

Ưu điểm của phương pháp này là khi bạn tắt con trỏ tiến trình, mọi con trỏ khác có thể đã được xác định trong CSS của bạn sẽ được khôi phục. Nếu quy tắc CSS không đủ mạnh để ưu tiên ghi đè các quy tắc CSS khác, bạn có thể thêm id vào phần thân và quy tắc hoặc sử dụng !important.


Giải pháp tuyệt vời!
Kenton de Jong

31

Vui lòng không sử dụng jQuery cho việc này trong năm 2018! Không có lý do gì để bao gồm toàn bộ thư viện bên ngoài chỉ để thực hiện một hành động có thể đạt được bằng một dòng:

Thay đổi con trỏ thành spinner: document.body.style.cursor = 'wait';

Hoàn nguyên con trỏ về bình thường: document.body.style.cursor = 'default';


3
Rất có thể có một cái gì đó trên trang đó có thêm nhu cầu về một con trỏ xử lý tùy chỉnh, bạn có nghĩ vậy không? Tất nhiên không phải là một điểm xấu, nhưng sự thay đổi của jQuery đã được tải cho một thứ khác sẽ là ... ehm ... 100%?
patrick

Như @ahmet yêu cầu giải pháp javascript / jquery, tôi nghĩ bạn cũng nên là câu trả lời. +1
Javier

8

Sau đây là cách ưa thích của tôi và sẽ thay đổi con trỏ mỗi khi trang sắp thay đổi, tức là beforeunload

$(window).on('beforeunload', function(){
   $('*').css("cursor", "progress");
});

1
đây là cách thực hiện dễ dàng và đơn giản nhất mà bạn có thể làm. Cảm ơn rất nhiều.
JC203

7

Sử dụng jquery và css:

$("#element").click(function(){ 
    $(this).addClass("wait");
});​

HTML: <div id="element">Click and wait</div>​

CSS: .wait {cursor:wait}​

Demo tại đây


Điều này chứng tỏ rằng con trỏ chờ có thể được hiển thị trên một vùng chứa nhỏ hơn toàn bộ trang - có thể có ý nghĩa nếu các phần khác của trang vẫn có thể được tương tác. Ở đây, chỉ trong khi di chuột qua div. Trong thực tế, mục được chọn để hiển thị con trỏ chờ phải lớn hơn mục được nhấp vào. Thông thường, tốt nhất để hiển thị trên toàn bộ trang, như trong câu trả lời được chấp nhận.
ToolmakerSteve

6

Ghi đè tất cả các phần tử đơn

$("*").css("cursor", "progress");

6
Vấn đề với cách tiếp cận này là bạn sẽ mất kiểu CSS cho các bộ chọn như: active /: hover, khi quá trình chờ đợi kết thúc
Ahmad

6
$('#some_id').click(function() {
  $("body").css("cursor", "progress");
  $.ajax({
    url: "test.html",
    context: document.body,
    success: function() {
      $("body").css("cursor", "default");
    }
  });
});

Điều này sẽ tạo ra một con trỏ tải cho đến khi cuộc gọi ajax của bạn thành công.


1
@Christoph, tại sao bạn không cung cấp cho chúng tôi câu trả lời với mã tốt hơn? Tôi chắc chắn sẽ thích mã tốt hơn luôn.
Bobort

@Bobort câu hỏi này đã có rất nhiều câu trả lời đàng hoàng rồi. Ngoài ra, nó đã 4 tuổi và trong khi đó successcompleteđược xóa trong jQ3, vì vậy bạn phải đi với $.ajax(...).always(...);Con trỏ progess có thể được đặt trong beforeSendhàm.
Christoph

6

jQuery:
$("body").css("cursor", "progress");

quay lại lần nữa
$("body").css("cursor", "default");

Nguyên chất:
document.body.style.cursor = 'progress';

quay lại lần nữa
document.body.style.cursor = 'default';


5

Bạn không cần JavaScript cho việc này. Bạn có thể thay đổi con trỏ thành bất cứ điều gì bạn muốn bằng CSS:

selector {
    cursor: url(myimage.jpg), auto;
}

Xem ở đây để được hỗ trợ trình duyệt vì có một số khác biệt tinh tế tùy thuộc vào trình duyệt


1
Bạn không cần javascript để kích hoạt thay đổi sang một con trỏ khác?
ToolmakerSteve

@ToolmakerSteve không - bạn chỉ có thể sử dụng CSS - chỉ cần thay đổi bộ chọn để xác định nơi bạn muốn sử dụng con trỏ
Manse

3

Đây là một điều thú vị khác bạn có thể làm. Xác định một hàm để gọi ngay trước mỗi cuộc gọi ajax. Đồng thời gán một chức năng để gọi sau khi mỗi cuộc gọi ajax hoàn tất. Hàm đầu tiên sẽ đặt con trỏ chờ và hàm thứ hai sẽ xóa nó. Chúng trông giống như sau:

$(document).ajaxComplete(function(event, request, settings) {
    $('*').css('cursor', 'default');
  });

function waitCursor() {
    $('*').css('cursor', 'progress');
  }

1

Nếu nó tiết kiệm quá nhanh, hãy thử điều này:

<style media="screen" type="text/css">
    .autosave {display: inline; padding: 0 10px; color:green; font-weight: 400; font-style: italic;}
</style>

<input type="button" value="Save" onclick="save();" />&nbsp;
<span class="autosave" style="display: none;">Saved Successfully</span>


$('span.autosave').fadeIn("80");
$('span.autosave').delay("400");
$('span.autosave').fadeOut("80");

1

Đặt con trỏ cho 'body' sẽ thay đổi con trỏ cho nền của trang nhưng không thay đổi cho các điều khiển trên đó. Ví dụ: các nút sẽ vẫn có con trỏ thông thường khi di chuột qua chúng. Sau đây là những gì tôi đang sử dụng:

Để đặt con trỏ 'chờ', hãy tạo thành phần kiểu và chèn vào đầu:

var css = "* { cursor: wait; !important}";
var style = document.createElement("style");
style.type = "text/css";
style.id = "mywaitcursorstyle";
style.appendChild(document.createTextNode(css));
document.head.appendChild(style);

Sau đó, để khôi phục con trỏ, xóa phần tử kiểu:

var style = document.getElementById("mywaitcursorstyle");
if (style) {
  style.parentNode.removeChild(style);
}

0

Tôi thấy rằng cách duy nhất để con trỏ thiết lập lại hiệu quả kiểu của nó trở lại kiểu trước khi thay đổi thành kiểu chờ là đặt kiểu gốc trong biểu định kiểu hoặc trong thẻ kiểu ở đầu trang, đặt lớp của đối tượng trong câu hỏi cho tên của phong cách. Sau khoảng thời gian chờ đợi của bạn, bạn đặt kiểu con trỏ trở lại một chuỗi trống, KHÔNG "mặc định" và nó trở lại giá trị ban đầu như được đặt trong thẻ kiểu hoặc biểu định kiểu của bạn. Đặt nó thành "mặc định" sau khoảng thời gian chờ chỉ thay đổi kiểu con trỏ cho mọi thành phần thành kiểu gọi là "mặc định" là con trỏ. Nó không thay đổi nó trở lại giá trị cũ của nó.

Có hai điều kiện để thực hiện công việc này. Trước tiên, bạn phải đặt kiểu trong một biểu định kiểu hoặc trong tiêu đề của trang bằng các thẻ kiểu, KHÔNG phải là kiểu nội tuyến và thứ hai là đặt lại kiểu của nó bằng cách đặt kiểu chờ trở lại thành một chuỗi trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.