전체 html 페이지 위에 커서 대기


89

간단한 방법으로 전체 html 페이지에서 커서를 '대기'로 설정할 수 있습니까? 아이디어는 ajax 호출이 완료되는 동안 어떤 일이 진행되고 있음을 사용자에게 보여주는 것입니다. 아래 코드는 내가 시도한 것의 단순화 된 버전을 보여주고 내가 직면 한 문제를 보여줍니다.

  1. 요소 (# id1)에 커서 스타일이 설정되어 있으면 본문에 설정된 하나를 무시합니다 (분명히)
  2. 일부 요소에는 기본 커서 스타일 (a)이 있으며 호버시 대기 커서가 표시되지 않습니다.
  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가 겹치기 때문에 클릭을 방지한다는 것입니다 (Kibbee에게 감사드립니다)

나중에 편집 ...
Dorward의 더 간단한 솔루션 :

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

그리고

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

이 솔루션은 대기 커서 만 표시하지만 클릭은 허용합니다.


선택 요소에 대한 커서를 변경할 수없는 것 같습니다. 선택 요소의 커서를 변경하는 방법도 있습니까?
Biswanath

답변:


34

나는 당신이 이것을 통제 할 수 없다는 것을 이해한다. 그러나 당신은 1보다 높은 z-index로 몸 전체를 덮는 "마스킹"div로 갈 수있다. 원한다면 div의 중앙 부분은 로딩 메시지를 포함 할 수있다.

그런 다음 커서를 div에서 기다리도록 설정하고 마스킹 div "아래"에있는 링크에 대해 걱정할 필요가 없습니다. 다음은 "masking div"에 대한 CSS 예제입니다.

body {높이 : 100 %; }
div # mask {커서 : 대기; Z- 색인 : 999; 높이 : 100 %; 너비 : 100 %; }

3
이것은 종종 문제를 일으킬 수 있습니다. Firefox에서 전체 페이지에 고정 div를 배치하면 전체 페이지를 클릭 할 수 없게됩니다. 즉, 링크 앞의 div를 클릭하는 링크를 클릭하지 않기 때문에 링크를 클릭 할 수 없습니다.
Kibbee

1
firefox에서 정상적으로 작동합니다. IE에서는 운이 없습니다. IE에서는 div가없는 것처럼 정확하게 동작합니다. 원하는 동작을 갖는 유일한 방법은 div 배경에 색상을 설정하는 것입니다.
Aleris

2
좋아, 조금 더 연주 한 후에 마침내 다음과 같이 작동했습니다. div # mask {display : none; 커서 : 기다려; Z- 색인 : 9999; 위치 : 절대; 상단 : 0; 왼쪽 : 0; 높이 : 100 %; 너비 : 100 %; 배경색 : #fff; 불투명도 : 0; filter : alpha (opacity = 0);}
Aleris

동의합니다, Kibbee, 그것은 정말로 원하는 행동에 달려 있습니다. Aleris는 AJAX가 콜백 할 때까지 사용자가 아무것도하지 않기를 바라는 것처럼 들립니다 (따라서 대기 커서).
Eric Wendelin

3
나는 position : fixed를 사용하여 항상 화면에 있고 position : absolute는 페이지 하단에있을 때 표시되지 않습니다.
Jj.

111

Dorward에서 게시 한 CSS의 약간 수정 된 버전을 사용하는 경우

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

그런 다음 모든 ajax 호출에 대해 작동하도록 정말 간단한 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 2013

1
@ gloomy.penguin이 질문은 제 답변이 나오기 3 년 이상 전에 활성화되었지만, 저는 해결책을 찾기 위해이 문제를 발견했고 결국 사용하게 된 해결책을 공유하기로 결정했습니다. Dorward의 답변 인 jQuery, 그리고 카일의 좋은 감각. OP가 찾고 있던 것과는 조금 다르지만, 그것이 당신에게 효과가 있다면 그것을 사용하십시오! :)
Dani

나는 동의한다. 훌륭하게 작동하고 IMHO가 받아 들여지는 대답이어야합니다.
savehansson 2014 년

1
이것이 작동하지 않으면 여기를 확인하십시오. JQuery.com "JQuery 1.9부터 전역 Ajax 이벤트는 문서 요소에서만 트리거됩니다." 예 :$(document).ajaxStart(function () { $("html").addClass("wait"); });
Debbie A

1
대기 클래스를 제거하기 전에 $.active여러 요청이 이루어졌고 아직 완료되지 않은 경우 를 대비하여 0 인지 확인하고 싶을 것입니다 .
셰인 Reustle

12

이것은 firefox에서 작동하는 것 같습니다.

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

* 부분은 링크 위로 마우스를 가져갈 때 커서가 변경되지 않도록합니다. 링크는 여전히 클릭 가능합니다.


* {커서 : 기다려! 중요한; } 더 간단하고 IE에서 작동 할 가능성이 더 높을 것입니다 (herit 키워드로 많은 버그가 있음)
Quentin

1
* {cursor : wait}를 자바 스크립트에서 적용 할 수 있습니까? -전체 DOM의 모든 요소를 ​​반복하는 경우를 제외하고 :)
Aleris

스타일 요소를 추가하고 innerHTML을 설정할 수 있습니다. 매우 우아하지는 않지만 작동 할 수 있습니다.
Kibbee

3
.wait, .wait * {cusor : wait! important; } 그런 다음 document.body.className = 'wait'; JavaScript
Quentin

1
복사 / 붙여 넣기 할 경우 위 주석에 "cursor"오타가 있습니다.
devios1 2013 년

7

나는 오늘 몇 시간 동안이 문제로 고심하고 있습니다. 기본적으로 모든 것이 FireFox에서는 잘 작동했지만 (물론) 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) {...}

내 코드는 JavaScript 클래스에서 실행되므로 this 및 MyClass (MyClass는 싱글 톤입니다).

이 페이지에 설명 된대로 div를 표시하려고 할 때 동일한 문제가 발생했습니다. IE에서는 함수가 실행 된 후에 표시되었습니다. 그래서 나는이 트릭이 그 문제도 해결할 것이라고 생각합니다.

게시물 작성자에게 감사합니다. 당신은 정말 내 하루를 만들었습니다!


4

CSS : .waiting * { cursor: 'wait' }

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


2

멋진 로딩 그래픽 (예 : http://ajaxload.info/ ) 중 하나를 사용하지 않는 이유는 무엇 입니까? 대기 커서는 브라우저 자체를위한 것이므로 표시 될 때마다 페이지가 아닌 브라우저와 관련이 있습니다.


부분적으로 동의합니다. 브라우저 자체가 페이지를로드하는 경우 창 커서에 적어도 나타난다는 것을 cursor: progress하지 cursor: wait. 이 커서를 사용하면 브라우저의 사용자 경험과 훨씬 더 일관성이 있습니다. 그러나 저는 브라우저가 페이지를로드 할 때 작동하는 것처럼 작동 함을 나타 내기 위해 커서를 변경하는 아이디어를 정말 좋아합니다.
독감

2

내가 아는 가장 쉬운 방법은 다음과 같이 JQuery를 사용하는 것입니다.

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

특히 느린 컴퓨터에서 많은 요소가있는 경우 "영원히"걸릴 수 있습니다
redbmk

1

CSS 시도 :

html.waiting {
cursor: wait;
}

속성 body이 적용되어 사용되는 html경우 전체 페이지에 대기 커서가 표시되지 않는 것 같습니다 . 또한 CSS 클래스를 사용하면 실제로 표시되는시기를 쉽게 제어 할 수 있습니다.


그 대기 수업은 무엇입니까? 관습인가요?
Sebas

1

다음은 외부 CSS가 필요없는보다 정교한 솔루션입니다.

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

나는 Eric Wendelin 의 각색을 사용했습니다. 의 솔루션을 적용했습니다. 전체 본문에 투명하고 애니메이션 오버레이 wait-div가 표시되고 표시되는 동안 wait-div에 의해 클릭이 차단됩니다.

CSS :

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

html :

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

1

내 두 펜스 :

1 단계 : 배열을 선언합니다. 할당 된 원래 커서를 저장하는 데 사용됩니다.

var vArrOriginalCursors = new Array(2);

2 단계 : cursorModifyEntirePage 함수 구현

 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 단계에서 선언 된 배열에 할당 된 원래 커서를 저장합니다. CursorType 매개 변수가 전달한대로 커서를 원하는 커서로 수정합니다.

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

전체 창에 대해 JavaScript에서 커서를 설정하려면 다음을 사용하십시오.

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

CSS에서 :

html { cursor: wait; }

필요에 따라 추가 논리를 추가합니다.


이 자바 스크립트 솔루션은 HTML 수하물을 건드리지 않고 작업을 수행하는 것이 가장 좋습니다. 이것은 DOM에 많은 노드가있는 경우 매우 느린 요소에 대한 클래스를 토글하는 것보다 훨씬 낫습니다.
Rajshekar Reddy


0

이 순수한 JavaScript는 꽤 잘 작동하는 것 같습니다 ... FireFox, Chrome 및 Edge 브라우저에서 테스트되었습니다.

페이지에 요소가 너무 많고 컴퓨터 속도가 느린 경우 성능이 확실하지 않습니다. 시도해보십시오.

대기 할 모든 요소에 대한 커서 설정 :

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

대기 커서와 기본 커서를 각각 설정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.