पूरे HTML पृष्ठ पर कर्सर प्रतीक्षा करें


89

क्या सरल तरीके से पूरे html पृष्ठ पर कर्सर को 'प्रतीक्षा' में सेट करना संभव है? उपयोगकर्ता को यह दिखाने के लिए विचार है कि कुछ हो रहा है जबकि एक अजाक्स कॉल पूरा हो रहा है। नीचे दिए गए कोड ने मेरे द्वारा किए गए प्रयासों का सरलीकृत संस्करण दिखाया है और उन समस्याओं को भी प्रदर्शित करता है जो मैं चलाता हूं:

  1. यदि किसी तत्व (# id1) में कर्सर शैली सेट है, तो यह शरीर पर एक सेट को अनदेखा करेगा (स्पष्ट रूप से)
  2. कुछ तत्वों में एक डिफ़ॉल्ट कर्सर शैली (ए) है और होवर पर प्रतीक्षा कर्सर नहीं दिखाया जाएगा
  3. सामग्री के आधार पर बॉडी एलिमेंट की एक निश्चित ऊंचाई होती है और यदि पृष्ठ छोटा होता है, तो कर्सर पाद के नीचे नहीं दिखाई देगा

कसौटी:

<html>
    <head>
        <style type="text/css">
            #id1 {
                background-color: #06f;
                cursor: pointer;
            }

            #id2 {
                background-color: #f60;
            }
        </style>
    </head>
    <body>
        <div id="id1">cursor: pointer</div>
        <div id="id2">no cursor</div>
        <a href="#" onclick="document.body.style.cursor = 'wait'; return false">Do something</a>
    </body>
</html>

बाद में संपादित करें ...
इसके साथ फ़ायरफ़ॉक्स और IE में काम किया:

div#mask { display: none; cursor: wait; z-index: 9999; 
position: absolute; top: 0; left: 0; height: 100%; 
width: 100%; background-color: #fff; opacity: 0; filter: alpha(opacity = 0);}

<a href="#" onclick="document.getElementById('mask').style.display = 'block'; return false">
Do something</a>

इस समाधान के साथ (या सुविधा) समस्या यह है कि यह अतिव्यापी div के कारण क्लिक को रोक देगा (धन्यवाद किबी)

बाद में बाद में संपादित करें ...
डोरवर्ड से एक सरल समाधान:

.wait, .wait * { cursor: wait !important; }

और फिर

<a href="#" onclick="document.body.className = 'wait'; return false">Do something</a>

यह समाधान केवल प्रतीक्षा कर्सर दिखाता है, लेकिन क्लिक की अनुमति देता है।


जैसा कि लगता है कि मैं चुनिंदा तत्वों के लिए कर्सर को बदलने में सक्षम नहीं हूं। क्या चयन तत्व के लिए कर्सर को बदलने का कोई तरीका है?
बिश्वनाथ

जवाबों:


33

मैं समझता हूं कि आपका इस पर नियंत्रण नहीं हो सकता है, लेकिन आप इसके बजाय एक "मास्किंग" डिव के लिए जा सकते हैं जो पूरे शरीर को एक जेड-इंडेक्स से अधिक 1 से कवर करता है। यदि आप चाहें तो डिव के केंद्र भाग में लोडिंग संदेश हो सकता है।

फिर, आप div पर प्रतीक्षा करने के लिए कर्सर सेट कर सकते हैं और लिंक के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि वे आपके मास्किंग डिव के "अंडर" हैं। यहाँ कुछ उदाहरण CSS "मास्किंग डिव" के लिए दिया गया है:

शरीर {ऊंचाई: 100%; }
div # मास्क {कर्सर: प्रतीक्षा करें; z- इंडेक्स: 999; ऊंचाई: 100%; चौड़ाई: 100%; }

3
इससे अक्सर समस्या हो सकती है। फ़ायरफ़ॉक्स में, पूरे पृष्ठ पर एक निश्चित div डालने से पूरा पृष्ठ अस्पष्ट हो जाता है। यानी, आप लिंक पर क्लिक नहीं कर सकते, क्योंकि आप उस लिंक पर क्लिक नहीं कर रहे हैं, जो आप लिंक के सामने बने डिव पर क्लिक कर रहे हैं।
किबी

1
फ़ायरफ़ॉक्स में ठीक काम करता है। IE में कोई भाग्य नहीं है :(। IE में यह बिल्कुल वैसा ही व्यवहार करता है जैसे कि डिव नहीं है। वांछित व्यवहार करने का एकमात्र तरीका डिव बैकग्राउंड पर एक रंग सेट करना है।
Aleris

2
ठीक है थोड़ा और खेलने के बाद अंत में इसके साथ काम किया: div # mask {प्रदर्शन: कोई नहीं; कर्सर: प्रतीक्षा करें; z-index: 9999; स्थिति: निरपेक्ष; शीर्ष: 0; बायां: 0; ऊंचाई: 100%; चौड़ाई: 100%; पृष्ठभूमि-रंग: # एफ; अपारदर्शिता: 0; फ़िल्टर: अल्फा (अपारदर्शिता = 0);}
एलरिस

सहमत, किबी, यह वास्तव में आपके वांछित व्यवहार पर निर्भर करता है। ऐसा लगता है जैसे अलैरिस नहीं चाहता कि उपयोगकर्ता कुछ भी करे (इसलिए प्रतीक्षा कर्सर) जब तक AJAX वापस नहीं बुलाता।
एरिक वेंडेलिन

3
मैंने स्थिति का उपयोग किया: इसलिए यह हमेशा स्क्रीन पर होता है, स्थिति के साथ: निरपेक्ष यह तब नहीं होता जब मैं पृष्ठ के निचले भाग पर होता।
जज।

111

यदि आप डोरवर्ड से पोस्ट किए गए सीएसएस के इस थोड़ा संशोधित संस्करण का उपयोग करते हैं,

html.wait, html.wait * { cursor: wait !important; }

फिर आप सभी अजाक्स कॉल के लिए काम करने के लिए कुछ सरल jQuery जोड़ सकते हैं:

$(document).ready(function () {
    $(document).ajaxStart(function () { $("html").addClass("wait"); });
    $(document).ajaxStop(function () { $("html").removeClass("wait"); });
});

या, पुराने jQuery संस्करणों के लिए (1.9 से पहले):

$(document).ready(function () {
    $("html").ajaxStart(function () { $(this).addClass("wait"); });
    $("html").ajaxStop(function () { $(this).removeClass("wait"); });
});

4
मैं वास्तव में इस उत्तर का उपयोग करना चाहता हूं ... यह स्वीकार क्यों नहीं है?
gloomy.penguin

1
@ gloomy.penguin यह प्रश्न मेरे उत्तर से 3 साल पहले सक्रिय था, लेकिन मैं इस पर एक समाधान के लिए अपनी खोज में हुआ, और उस समाधान को साझा करने का फैसला किया जिसका मैंने उपयोग किया: डोरवर्ड के उत्तर का मिश्रण, jQuery, और काइल की अच्छी समझ। यह ओपी के लिए क्या देख रहा था से थोड़ा अलग है, लेकिन अगर यह आपके लिए काम करता है, तो इसका उपयोग करें! :)
दानी

मैं सहमत हूँ। महान और IMHO काम करता है यह स्वीकृत उत्तर होना चाहिए।
सेवहंसन

1
यदि यह आपके लिए काम नहीं कर रहा है, तो यहां देखें: JQuery.com "JQuery 1.9 के रूप में, वैश्विक अजाक्स घटनाओं को केवल दस्तावेज़ तत्व पर ट्रिगर किया गया है।" Ex:$(document).ajaxStart(function () { $("html").addClass("wait"); });
डेबी ए

1
प्रतीक्षा वर्ग को हटाने से पहले, आप शायद यह देखना चाहते हैं कि $.activeक्या 0 है, कई अनुरोध किए गए थे और वे सभी अभी तक समाप्त नहीं हुए हैं।
शेन रीस्टल

12

यह फ़ायरफ़ॉक्स में काम करने लगता है

<style>
*{ cursor: inherit;}
body{ cursor: wait;}
</style>

* हिस्सा यह सुनिश्चित करता है कि जब आप किसी लिंक पर होवर करते हैं तो कर्सर नहीं बदलता। हालांकि लिंक अभी भी क्लिक करने योग्य होंगे।


({कर्सर: प्रतीक्षा महत्वपूर्ण; } IE में काम करने के लिए सरल और अधिक होने की संभावना होगी (जो कि अंतर्निहित कीवर्ड के साथ बहुत सारे कीड़े हैं)
क्वेंटिन

1
क्या जावास्क्रिप्ट से लागू किया जा सकता है? - संपूर्ण DOM में सभी तत्वों को पुनरावृत्त करने के अलावा :)
Aleris

हो सकता है कि आप एक शैली तत्व जोड़ सकें और भीतर का HTML सेट कर सकें। बहुत सुरुचिपूर्ण नहीं होगा, लेकिन यह काम कर सकता है।
किब्बी

3
.wait, .wait * {cusor: wait! important; } और फिर दस्तावेज़ सेट करें ।body.className = 'प्रतीक्षा'; जावास्क्रिप्ट के साथ
क्वेंटिन

1
नोट यदि आप इसे कॉपी / पेस्ट करते हैं, तो उपरोक्त टिप्पणी में "कर्सर" का एक टाइपो है।
devios1

7

मैं आज इस समस्या से जूझ रहा हूं। मूल रूप से सब कुछ फायरफॉक्स में ठीक काम कर रहा था लेकिन (निश्चित रूप से) IE में नहीं। IE में प्रतीक्षा कर्सर दिखा रहा था कि समय लेने वाले फ़ंक्शन को निष्पादित किया गया था।

मुझे अंततः इस साइट पर ट्रिक मिली: http://www.codingforums.com/archive/index.php/t-37185.html

कोड:

//...
document.body.style.cursor = 'wait';
setTimeout(this.SomeLongFunction, 1);

//setTimeout syntax when calling a function with parameters
//setTimeout(function() {MyClass.SomeLongFunction(someParam);}, 1);

//no () after function name this is a function ref not a function call
setTimeout(this.SetDefaultCursor, 1);
...

function SetDefaultCursor() {document.body.style.cursor = 'default';}

function SomeLongFunction(someParam) {...}

मेरा कोड जावास्क्रिप्ट क्लास में चलता है इसलिए यह और MyClass (MyClass एक सिंगलटन है)।

इस पृष्ठ पर वर्णित के रूप में एक डिव को प्रदर्शित करने की कोशिश करते समय मुझे वही समस्याएं थीं। IE में यह कार्य निष्पादित होने के बाद दिखा रहा था। तो मुझे लगता है कि यह ट्रिक उस समस्या को भी हल कर देगी।

पोस्ट के लेखक को ग्लेनगव करने के लिए एक zillion समय का धन्यवाद। आपने सच में मेरा दिन बना दिया !!!


4

सीएसएस: .waiting * { cursor: 'wait' }

jQuery: $('body').toggleClass('waiting');


2

आप उन फैंसी लोडिंग ग्राफिक्स में से एक का उपयोग क्यों नहीं करते हैं (जैसे: http://ajaxload.info/ )? वेटिंग कर्सर ब्राउज़र के लिए ही होता है - इसलिए जब भी ऐसा प्रतीत होता है कि यह ब्राउज़र के साथ कुछ करना है और पेज के साथ नहीं है।


मैं आंशिक रूप से सहमत हूं। कम से कम खिड़कियों पर जो कर्सर दिखाई देता है, अगर ब्राउज़र खुद एक पेज लोड कर रहा है, तो cursor: progressनहीं cursor: wait। उस कर्सर का उपयोग करना ब्राउज़र के उपयोगकर्ता अनुभव के साथ अधिक सुसंगत होगा। लेकिन मुझे वास्तव में कर्सर को बदलने का विचार पसंद है कि यह इंगित करने के लिए कि ब्राउज़र काम कर रहा है जैसे कि यह एक पेज लोड होने पर काम कर रहा है।
फ्लू

2

सबसे आसान तरीका मुझे पता है कि इस तरह से JQuery का उपयोग कर रहा है:

$('*').css('cursor','wait');

अगर आपके पास बहुत सारे तत्व हैं, तो "हमेशा के लिए" ले सकते हैं, खासकर एक धीमे कंप्यूटर पर
redbmk

1

सीएसएस आज़माएं:

html.waiting {
cursor: wait;
}

ऐसा लगता है कि यदि संपत्ति bodyका उपयोग किया जाता है, तो htmlयह पूरे पृष्ठ पर प्रतीक्षा कर्सर नहीं दिखाता है। इसके अलावा अगर आप एक सीएसएस क्लास का उपयोग करते हैं तो आप आसानी से नियंत्रित कर सकते हैं जब यह वास्तव में इसे दिखाता है।


वह वेटिंग क्लास क्या है? यह कुछ कस्टम है?
सेबास

1

यहां एक अधिक विस्तृत समाधान है जिसे बाहरी सीएसएस की आवश्यकता नहीं है:

function changeCursor(elem, cursor, decendents) {
    if (!elem) elem=$('body');

    // remove all classes starting with changeCursor-
    elem.removeClass (function (index, css) {
        return (css.match (/(^|\s)changeCursor-\S+/g) || []).join(' ');
    });

    if (!cursor) return;

    if (typeof decendents==='undefined' || decendents===null) decendents=true;

    let cname;

    if (decendents) {
        cname='changeCursor-Dec-'+cursor;
        if ($('style:contains("'+cname+'")').length < 1) $('<style>').text('.'+cname+' , .'+cname+' * { cursor: '+cursor+' !important; }').appendTo('head');
    } else {
        cname='changeCursor-'+cursor;
        if ($('style:contains("'+cname+'")').length < 1) $('<style>').text('.'+cname+' { cursor: '+cursor+' !important; }').appendTo('head');
    }

    elem.addClass(cname);
}

इसके साथ आप यह कर सकते हैं:

changeCursor(, 'wait'); // wait cursor on all decendents of body
changeCursor($('#id'), 'wait', false); // wait cursor on elem with id only
changeCursor(); // remove changed cursor from body

1

मैंने एरिक वेंडेलिन के समाधान के एक अनुकूलन का उपयोग किया । यह पूरे शरीर पर एक पारदर्शी, एनिमेटेड ओवरले वेट-डिव दिखाएगा, क्लिक करते समय वेट-डिव द्वारा ब्लॉक किया जाएगा:

सीएसएस:

div#waitMask {
    z-index: 999;
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: 100%;
    cursor: wait;
    background-color: #000;
    opacity: 0;
    transition-duration: 0.5s;
    -webkit-transition-duration: 0.5s;
}

js:

// to show it
$("#waitMask").show();
$("#waitMask").css("opacity"); // must read it first
$("#waitMask").css("opacity", "0.8");

...

// to hide it
$("#waitMask").css("opacity", "0");
setTimeout(function() {
    $("#waitMask").hide();
}, 500) // wait for animation to end

एचटीएमएल:

<body>
    <div id="waitMask" style="display:none;">&nbsp;</div>
    ... rest of html ...

1

मेरी दो पेंस:

चरण 1: एक सरणी घोषित करें। इसका उपयोग उन मूल श्रापियों को संग्रहीत करने के लिए किया जाएगा जिन्हें सौंपा गया था:

var vArrOriginalCursors = new Array(2);

चरण 2: फ़ंक्शन कर्सर लागू करेंमोडाईफायटायरपेज

 function CursorModifyEntirePage(CursorType){
    var elements = document.body.getElementsByTagName('*');
    alert("These are the elements found:" + elements.length);
    let lclCntr = 0;
    vArrOriginalCursors.length = elements.length; 
    for(lclCntr = 0; lclCntr < elements.length; lclCntr++){
        vArrOriginalCursors[lclCntr] = elements[lclCntr].style.cursor;
        elements[lclCntr].style.cursor = CursorType;
    }
}

यह क्या करता है: पेज पर सभी तत्व हो जाते हैं। चरण 1 में घोषित सरणी में उन्हें दिए गए मूल श्रापों को संग्रहीत करता है। पैरामीटर Corororype द्वारा पारित किए गए वांछित कर्सर के लिए कर्सर को संशोधित करता है

चरण 3: पृष्ठ पर कर्सर को पुनर्स्थापित करें

 function CursorRestoreEntirePage(){
    let lclCntr = 0;
    var elements = document.body.getElementsByTagName('*');
    for(lclCntr = 0; lclCntr < elements.length; lclCntr++){
        elements[lclCntr].style.cursor = vArrOriginalCursors[lclCntr];
    }
}

मैंने इसे एक एप्लिकेशन में चलाया है और यह ठीक काम करता है। केवल चेतावनी यह है कि मैंने इसका परीक्षण नहीं किया है जब आप तत्वों को गतिशील रूप से जोड़ रहे हैं।


1

संपूर्ण विंडो के लिए जावास्क्रिप्ट से कर्सर सेट करने के लिए, उपयोग करें:

document.documentElement.style.cursor = 'wait';

सीएसएस से:

html { cursor: wait; }

आवश्यकतानुसार और तर्क जोड़ें।


यह जावास्क्रिप्ट समाधान सबसे अच्छा है, HTML सामान को छूने के बिना काम करता है। यह तत्वों पर टॉगल करने वाली कक्षाओं की तुलना में कहीं बेहतर है जो बहुत धीमी है यदि आपके डोम में बहुत सारे नोड हैं।
राजशेखर रेड्डी


0

यह शुद्ध जावास्क्रिप्ट बहुत अच्छी तरह से काम करने लगता है ... फ़ायर्फ़ॉक्स, क्रोम, और एज ब्राउज़रों पर परीक्षण किया गया।

अगर आप अपने पेज पर तत्वों की अधिकता और धीमी गति से कंप्यूटर ... यह कोशिश करते हैं और देखते हैं तो मुझे इसके प्रदर्शन के बारे में निश्चित नहीं है।

प्रतीक्षा करने के लिए सभी तत्वों के लिए कर्सर सेट करें:

Object.values(document.querySelectorAll('*')).forEach(element => element.style.cursor = "wait");

डिफ़ॉल्ट रूप से सभी तत्वों के लिए कर्सर सेट करें:

Object.values(document.querySelectorAll('*')).forEach(element => element.style.cursor = "default");

एक वैकल्पिक (और शायद थोड़ा अधिक पठनीय) संस्करण निम्नानुसार एक setCursor फ़ंक्शन बनाने के लिए होगा:

function setCursor(cursor)
{
    var x = document.querySelectorAll("*");

    for (var i = 0; i < x.length; i++)
    {
        x[i].style.cursor = cursor;
    }
}

और फिर कॉल करें

setCursor("wait");

तथा

setCursor("default");

क्रमशः प्रतीक्षा कर्सर और डिफ़ॉल्ट कर्सर सेट करने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.