การเปลี่ยนเคอร์เซอร์เป็นการรอใน javascript / jquery


120

ใส่คำอธิบายภาพที่นี่

ฉันจะเปลี่ยนเคอร์เซอร์เป็นไอคอนโหลดนี้ได้อย่างไรเมื่อมีการเรียกใช้ฟังก์ชันและฉันจะเปลี่ยนกลับเป็นเคอร์เซอร์ปกติใน javascript / jquery ได้อย่างไร


7
หากคุณต้องการเคอร์เซอร์นี้คุณต้องระบุ url มิฉะนั้น (ด้วยโซลูชัน Roberts) ผู้ใช้ทุกคนจะเห็นเคอร์เซอร์กำลังโหลดขึ้นอยู่กับระบบปฏิบัติการของเขา
Christoph

1
คริสตอฟสิ่งที่จะ 'รอ' แสดงสำหรับระบบปฏิบัติการอื่นตอนนี้ฉันใช้ windows 7 เพราะในขณะนี้มันดูดี
ahmet

2
ใน vista มันจะแสดงเคอร์เซอร์แบบเดียวกับใน windows 7 แต่ด้วยภาพเคลื่อนไหวที่ใช้งานไม่ได้บนระบบปฏิบัติการ Windows รุ่นเก่าจะแสดงนาฬิกาทรายที่ดีและบน Linux หรือ Mac OS จะแสดงเคอร์เซอร์ "รอ" ตามลำดับ นอกจากนี้ฉันขอแนะนำว่าอย่าปรับแต่งเคอร์เซอร์ของผู้ใช้เนื่องจากโดยทั่วไปจะเกี่ยวข้องกับ OS-Operations แต่ให้แสดงภาพเคลื่อนไหวรอเล็กน้อยเช่นนี้โดยตรงบนหน้าเว็บของคุณซึ่งจะช่วยให้ผู้ใช้เห็นได้อย่างรวดเร็วก่อนว่าการดำเนินการรอ เกิดจากไซต์ของคุณไม่ใช่ระบบปฏิบัติการ
Christoph


1
ความคิดที่ดีสำหรับเดสก์ท็อปความคิดที่ไม่ดีสำหรับมือถือ ...
Please_Dont_Bully_Me_SO_Lords

คำตอบ:


196

ในการใช้ jQuery ของคุณ:

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

แล้วกลับมาเป็นปกติอีกครั้ง

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

8
ฉันใช้ $("html,body")เนื่องจากตัวหน้าของฉันพอดีเพียงครึ่งหนึ่งของหน้าต่างดังนั้นเคอร์เซอร์จึงยังคงเป็นค่าเริ่มต้นเมื่อวางเมาส์เหนือครึ่งล่าง
Keith

องค์ประกอบอื่น ๆ บนหน้า (เช่นปุ่ม Bootstrap) ซึ่งแทนที่เคอร์เซอร์ไปยังการแสดงผลที่ไม่ใช่ค่าเริ่มต้นจะบล็อกแนวทางนี้ในขณะที่เคอร์เซอร์ยังอยู่เหนือองค์ประกอบ ในกรณีเหล่านี้ฉันพบว่าควรใช้!importantกับโซลูชันของ @ hrabinowitz ด้านล่าง
Addison Klinke

83

เพื่อนร่วมงานแนะนำแนวทางที่ฉันคิดว่าดีกว่าสำหรับโซลูชันที่เลือกไว้ที่นี่ ขั้นแรกใน CSS ให้เพิ่มกฎนี้:

body.waiting * {
    cursor: progress;
}

จากนั้นหากต้องการเปิดเคอร์เซอร์ความคืบหน้าให้พูดว่า:

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

และหากต้องการปิดเคอร์เซอร์ความคืบหน้าให้พูดว่า:

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

ข้อดีของวิธีนี้คือเมื่อคุณปิดเคอร์เซอร์ความคืบหน้าเคอร์เซอร์อื่น ๆ ที่อาจกำหนดไว้ใน CSS ของคุณจะถูกเรียกคืน ถ้ากฎ CSS ไม่เพียงพอมีประสิทธิภาพในการลำดับความสำคัญจะลบล้างกฎ CSS อื่น ๆ !importantที่คุณสามารถเพิ่มรหัสให้กับร่างกายและการปกครองหรือการใช้งาน


ทางออกที่ยอดเยี่ยม!
Kenton de Jong

31

โปรดอย่าใช้ jQuery ในปี 2018 นี้! ไม่มีเหตุผลที่จะรวมไลบรารีภายนอกทั้งหมดเพียงเพื่อดำเนินการสิ่งนี้ซึ่งสามารถทำได้ด้วยบรรทัดเดียว:

เปลี่ยนเคอร์เซอร์เป็นสปินเนอร์: document.body.style.cursor = 'wait';

เปลี่ยนเคอร์เซอร์กลับเป็นปกติ: document.body.style.cursor = 'default';


3
เป็นไปได้มากว่ามีบางอย่างในหน้านั้นที่เพิ่มความต้องการเคอร์เซอร์การประมวลผลแบบกำหนดเองคุณไม่คิดเหรอ? ไม่ใช่จุดที่ไม่ดีแน่นอน แต่การเปลี่ยนแปลงของ jQuery ที่โหลดไปแล้วสำหรับอย่างอื่นจะเป็น ... เอ๊ะ ... 100%?
patrick

เนื่องจาก @ahmet ขอวิธีแก้ปัญหา javascript / jquery ฉันคิดว่าของคุณน่าจะเป็นคำตอบเช่นกัน +1
Javier

8

ต่อไปนี้เป็นวิธีที่ฉันชอบและจะเปลี่ยนเคอร์เซอร์ทุกครั้งที่เพจกำลังจะเปลี่ยนเช่น beforeunload

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

1
นี่เป็นการใช้งานที่ง่ายและง่ายที่สุดที่คุณสามารถทำได้ ขอบคุณมาก.
JC203

ไม่มีทางตั้งกลับ!
Ωmega

@ Ωmegaเนื่องจากเพจถูกโหลดหลังจากการเปลี่ยนแปลงเหล่านี้จึงไม่จำเป็นต้องตั้งค่ากลับ
Shaneparsons

แต่คำถามของ OP ถามอย่างอื่นฉันคิดว่า ...
Ωmega

7

ใช้ jquery และ css:

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

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

CSS: .wait {cursor:wait}​

สาธิตที่นี่


สิ่งนี้แสดงให้เห็นว่าเคอร์เซอร์รอสามารถแสดงบนคอนเทนเนอร์ที่มีขนาดน้อยกว่าทั้งหน้า - อาจสมเหตุสมผลหากส่วนอื่น ๆ ของหน้ายังสามารถโต้ตอบได้ ที่นี่เฉพาะในขณะที่วางเมาส์เหนือไฟล์div. ในทางปฏิบัติรายการที่เลือกเพื่อแสดงเคอร์เซอร์รอควรมีขนาดใหญ่กว่ารายการที่คลิก บ่อยครั้งที่ดีที่สุดที่จะแสดงทั้งหน้าเช่นเดียวกับในคำตอบที่ยอมรับ
ToolmakerSteve

6

แทนที่องค์ประกอบเดียวทั้งหมด

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

6
ปัญหาของวิธีนี้คือคุณจะสูญเสียสไตล์ CSS สำหรับตัวเลือกเช่น: active /: hover เมื่อการรอสิ้นสุดลง
Ahmad

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

สิ่งนี้จะสร้างเคอร์เซอร์การโหลดจนกว่าการโทร ajax ของคุณจะสำเร็จ


1
@ คริสตอฟทำไมคุณไม่ให้คำตอบกับเราด้วยรหัสที่ดีกว่าได้โปรด? ฉันต้องการรหัสที่ดีกว่าเสมอ
Bobort

@Bobort คำถามนี้มีคำตอบที่ดีมากมายอยู่แล้ว นอกจากนี้ยังมีอายุ 4 ปีและในขณะเดียวกันsuccessและcompleteจะถูกลบออกใน jQ3 ดังนั้นคุณต้องใช้$.ajax(...).always(...);เคอร์เซอร์ที่มีความสามารถในการตั้งค่าในbeforeSendฟังก์ชัน
Christoph

6

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

กลับมาอีกครั้ง
$("body").css("cursor", "default");

บริสุทธิ์:
document.body.style.cursor = 'progress';

กลับมาอีกครั้ง
document.body.style.cursor = 'default';


5

คุณไม่จำเป็นต้องใช้ JavaScript สำหรับสิ่งนี้ คุณสามารถเปลี่ยนเคอร์เซอร์เป็นอะไรก็ได้ที่คุณต้องการโดยใช้ CSS:

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

ดูที่นี่สำหรับการรองรับเบราว์เซอร์เนื่องจากมีความแตกต่างเล็กน้อยขึ้นอยู่กับเบราว์เซอร์


1
คุณไม่จำเป็นต้องใช้จาวาสคริปต์เพื่อทริกเกอร์การเปลี่ยนแปลงเคอร์เซอร์อื่นหรือไม่?
ToolmakerSteve

@ToolmakerSteve ไม่ - คุณสามารถใช้ CSS เท่านั้น - เพียงแค่เปลี่ยนตัวเลือกเพื่อกำหนดตำแหน่งที่คุณต้องการใช้เคอร์เซอร์
Manse

3

นี่คือสิ่งที่น่าสนใจอื่น ๆ ที่คุณสามารถทำได้ กำหนดฟังก์ชันในการโทรก่อนการโทรแต่ละครั้ง กำหนดฟังก์ชันการโทรหลังจากการโทรแต่ละครั้งเสร็จสมบูรณ์ ฟังก์ชันแรกจะตั้งค่าเคอร์เซอร์รอและฟังก์ชันที่สองจะล้างออก มีลักษณะดังต่อไปนี้:

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

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

1

หากประหยัดเร็วเกินไปให้ลองทำดังนี้

<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

การตั้งค่าเคอร์เซอร์สำหรับ "body" จะเปลี่ยนเคอร์เซอร์สำหรับพื้นหลังของหน้า แต่ไม่ใช่สำหรับการควบคุมบน ตัวอย่างเช่นปุ่มต่างๆจะยังคงมีเคอร์เซอร์ปกติเมื่อวางเมาส์เหนือปุ่มเหล่านั้น ต่อไปนี้คือสิ่งที่ฉันใช้:

ในการตั้งค่าเคอร์เซอร์ "รอ" ให้สร้างองค์ประกอบลักษณะและแทรกในส่วนหัว:

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

จากนั้นในการคืนค่าเคอร์เซอร์ให้ลบองค์ประกอบสไตล์:

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

0

ฉันพบว่าวิธีเดียวที่จะทำให้เคอร์เซอร์รีเซ็ตรูปแบบกลับไปเป็นแบบเดิมได้อย่างมีประสิทธิภาพก่อนที่จะเปลี่ยนเป็นสไตล์การรอคือการตั้งค่าสไตล์ดั้งเดิมในสไตล์ชีตหรือในแท็กสไตล์ที่จุดเริ่มต้นของหน้าตั้งค่า คลาสของออบเจ็กต์ที่เป็นปัญหากับชื่อของสไตล์ หลังจากช่วงเวลารอคุณตั้งค่ารูปแบบเคอร์เซอร์กลับเป็นสตริงว่างเปล่าไม่ใช่ "ค่าเริ่มต้น" และจะเปลี่ยนกลับเป็นค่าเดิมตามที่ตั้งค่าไว้ในแท็กสไตล์หรือสไตล์ชีตของคุณ การตั้งค่าเป็น "ค่าเริ่มต้น" หลังจากช่วงเวลารอจะเปลี่ยนรูปแบบเคอร์เซอร์ของทุกองค์ประกอบให้เป็นสไตล์ที่เรียกว่า "ค่าเริ่มต้น" ซึ่งเป็นตัวชี้ จะไม่เปลี่ยนกลับไปเป็นค่าเดิม

มีสองเงื่อนไขที่จะทำให้งานนี้ ก่อนอื่นคุณต้องตั้งค่าสไตล์ในสไตล์ชีตหรือในส่วนหัวของเพจด้วยแท็กสไตล์ไม่ใช่สไตล์อินไลน์และอย่างที่สองคือการรีเซ็ตสไตล์โดยตั้งค่าสไตล์การรอกลับเป็นสตริงว่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.