等待光标在整个 html 页面上

IT技术 javascript html css dynamic-css
2021-03-03 18:15:18

是否可以通过简单的方式将光标设置为在整个 html 页面上“等待”?这个想法是向用户展示在 ajax 调用完成时正在发生的事情。下面的代码显示了我尝试过的简化版本,并演示了我遇到的问题:

  1. 如果一个元素 (#id1) 有一个光标样式集,它将忽略主体上的那个集(显然)
  2. 某些元素具有默认光标样式 (a),并且不会在悬停时显示等待光标
  3. body 元素根据内容有一定的高度,如果页面很短,光标将不会显示在页脚下方

考试:

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

后来编辑...
它在 Firefox 和 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>

此解决方案仅显示等待光标但允许单击。

6个回答

如果您使用从 Dorward 发布的这个稍微修改过的 CSS 版本,

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

然后你可以添加一些非常简单的jQuery来处理所有的 ajax 调用:

$(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"); });
});
@gloomy.penguin 这个问题在我回答之前 3 年多就很活跃了,但我在自己寻找解决方案时偶然发现了这个问题,并决定分享我最终使用的解决方案:混合了 Dorward 的答案、jQuery、和凯尔的理智。它与 OP 所寻找的略有不同,但如果它适合您,那就使用它!:)
2021-04-21 18:15:18
我同意。效果很好,恕我直言,它应该是公认的答案。
2021-04-27 18:15:18
我真的很想使用这个答案......为什么它不是公认的?
2021-04-29 18:15:18
如果这对您不起作用,请在此处查看:JQuery.com “从 JQuery 1.9 开始,全局 Ajax 事件仅在文档元素上触发。” 前任:$(document).ajaxStart(function () { $("html").addClass("wait"); });
2021-05-06 18:15:18
在删除等待类之前,您可能想要检查是否$.active为 0,以防发生多个请求并且它们都尚未完成。
2021-05-13 18:15:18

我知道您可能无法控制这一点,但您可能会选择一个“屏蔽”div,该 div 覆盖整个身体,z-index 高于 1。如果您愿意,div 的中心部分可以包含加载消息。

然后,您可以将光标设置为在 div 上等待,而不必担心链接,因为它们在您的屏蔽 div 下。这是“屏蔽 div”的一些示例 CSS:

身体{高度:100%;}
div#mask { 光标:等待;z-索引:999;高度:100%;宽度:100%;}
在 Firefox 中工作正常。在 IE 中没有运气:(。在 IE 中,它的行为就像 div 不存在一样。获得所需行为的唯一方法是在 div 背景上设置颜色。
2021-04-21 18:15:18
好的,经过多一点播放,它终于可以使用了: div#mask { display: none; 光标:等待;z-索引:9999;位置:绝对;顶部:0;左:0;高度:100%;宽度:100%;背景色:#fff; 不透明度:0;过滤器:阿尔法(不透明度= 0);}
2021-05-01 18:15:18
我使用了 position:fixed 所以它总是在屏幕上,而 position:absolute 当我在页面底部时它不会显示。
2021-05-11 18:15:18
这通常会导致问题。在 Firefox 中,在整个页面上放置一个固定的 div 会导致整个页面变得不可点击。即,您不能单击链接,因为您不是单击链接,而是单击链接前面的 div。
2021-05-15 18:15:18
同意,Kibbee,这真的取决于你想要的行为。听起来 Aleris 不希望用户在 AJAX 回调之前执行任何操作(因此是等待光标)。
2021-05-16 18:15:18

这似乎在 Firefox 中有效

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

* 部分确保当您将鼠标悬停在链接上时光标不会改变。虽然链接仍然可以点击。

可以从 javascript 应用 * { cursor: wait } 吗?- 除了迭代整个 DOM 中的所有元素:)
2021-04-28 18:15:18
请注意,上面的评论中有一个“光标”的拼写错误,以防您复制/粘贴它。
2021-05-01 18:15:18
*{ 光标:等待!重要;会更简单,更有可能在 IE 中工作(它有很多带有 inherit 关键字的错误)
2021-05-03 18:15:18
也许您可以添加一个样式元素并设置innerHTML。不会很优雅,但它可能会起作用。
2021-05-10 18:15:18
.wait, .wait * { cusor: wait !important; 然后设置 document.body.className = 'wait'; 使用 JavaScript
2021-05-16 18:15:18

今天我一直在为这个问题苦苦挣扎数小时。基本上一切都在 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 中,它在函数执行后显示。所以我想这个技巧也可以解决这个问题。

感谢无数时间给这篇文章的作者 glenngv。你真的让我开心!!!

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

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