如何使用 jQuery 显示“忙碌”指示器?

Posted

技术标签:

【中文标题】如何使用 jQuery 显示“忙碌”指示器?【英文标题】:How to display a "busy" indicator with jQuery? 【发布时间】:2011-05-20 07:24:35 【问题描述】:

如何在网页的特定位置显示旋转的“忙碌”指示器?

我想在 Ajax 请求开始/完成时启动/停止指示器。

真的只是显示/隐藏动画 gif 的问题,还是有更优雅的解决方案?

【问题讨论】:

【参考方案1】:

您可以只显示/隐藏一个 gif,但您也可以将其嵌入到 ajaxSetup 中,因此在每个 ajax 请求时都会调用它。

$.ajaxSetup(
    beforeSend:function()
        // show gif here, eg:
        $("#loading").show();
    ,
    complete:function()
        // hide gif here, eg:
        $("#loading").hide();
    
);

需要注意的是,如果您想在没有加载微调器的情况下执行特定的 ajax 请求,您可以这样做:

$.ajax(
   global: false,
   // stuff
);

这样我们之前的 $.ajaxSetup 不会影响global: false 的请求。

更多详情请访问:http://api.jquery.com/jQuery.ajaxSetup

【讨论】:

+1 表示ajaxSetup()。如果能给出关于global 属性的进一步解释,我会更愿意。 @RabidFire,这里实际上不需要全局,它只是用于$.ajax @gov,gif的定位取决于布局,你可以隐藏/显示放置的div,而不是修改dom。 这看起来很有希望,但它对我不起作用,最终尝试了另一种有效的解决方案。 ***.com/questions/7003707/… 如果您有 2 个 XHR,并且第一个在第二个启动后立即完成,则即使第二个 XHR 仍在运行,此代码也会隐藏加载指示器。【参考方案2】:

jQuery 文档建议执行以下操作:

$( document ).ajaxStart(function() 
  $( "#loading" ).show();
).ajaxStop(function() 
  $( "#loading" ).hide();
);

#loading 是其中包含忙碌指示符的元素。

参考资料:

http://api.jquery.com/ajaxStart/

http://api.jquery.com/ajaxStop/

此外,jQuery.ajaxSetup API 明确建议避免jQuery.ajaxSetup 用于这些:

注意:全局回调函数应该使用它们各自的全局 Ajax 事件处理方法来设置——.ajaxStart().ajaxStop().ajaxComplete().ajaxError().ajaxSuccess().ajaxSend()——而不是在 @987654334 @对象为$.ajaxSetup()

【讨论】:

这些似乎比 beforeSend 和 complete 更有用,因为 ajaxStart 将“......注册一个处理程序以在第一个 Ajax 请求开始时被调用”,而 ajaxStop 将“......注册一个处理程序被调用当所有 Ajax 请求都完成时” - 这些处理并发异步消息并且不会过早隐藏“请等待”指示符。【参考方案3】:

我倾向于像其他人所说的那样只显示/隐藏 IMG。我找到了一个生成“加载 gif”的好网站

Link 我只是把它放在div 中并默认隐藏display: none; (css) 然后当你调用该函数时显示图像,一旦它完成再次隐藏它。

【讨论】:

【参考方案4】:

是的,这实际上只是显示/隐藏动画 gif 的问题。

【讨论】:

同意。显示/隐藏图像很容易被所有浏览器理解。有几个用于图像的 jquery 旋转插件,但这些插件不适用于所有浏览器。 @mike 我的解决方案在所有浏览器中都适用于我的项目,你认为这是一个不错的方法【参考方案5】:

我在我的项目中做到了,

制作一个 div 的背景 url 为 gif ,这不过是动画 gif

<div class="busyindicatorClass"> </div>

.busyindicatorClass

background-url///give animation here

在您的 ajax 调用中,将此类添加到 div 并在 ajax 成功时删除该类。

它会做到这一点。

如果您还需要其他东西,请告诉我,我可以给您更多详细信息

在ajax成功删除类

success: function(data) 
    remove class using jquery
  

【讨论】:

【参考方案6】:

稍微扩展 Rodrigo 的解决方案 - 对于频繁执行的请求,您可能只想在请求花费的时间超过最小时间间隔时才显示加载图像,否则图像将不断弹出并迅速消失

var loading = false;

$.ajaxSetup(
    beforeSend: function () 
        // Display loading icon if AJAX call takes >1 second
        loading = true;
        setTimeout(function () 
            if (loading) 
                // show loading image
            
        , 1000);            
    ,
    complete: function () 
        loading = false;
        // hide loading image
    
);

【讨论】:

【参考方案7】:

我在我的项目中做到了:

全球事件 在 application.js 中:

$(document).bind("ajaxSend", function()
   $("#loading").show();
 ).bind("ajaxComplete", function()
   $("#loading").hide();
 );

“正在加载”是要显示和隐藏的元素!

参考资料: http://api.jquery.com/Ajax_Events/

【讨论】:

【参考方案8】:

我不得不使用

html:
   <img id="loading" src="~/Images/spinner.gif"  style="display: none;" />

In script file:
  // invoked when sending ajax request
  $(document).ajaxSend(function () 
      $("#loading").show();
  );

  // invoked when sending ajax completed
  $(document).ajaxComplete(function () 
      $("#loading").hide();
  );

【讨论】:

【参考方案9】:

旧线程,但我想更新,因为我今天正在处理这个问题, 我的项目中没有 jquery,所以我用普通的旧 javascript 方式来做,我还需要阻止屏幕上的内容,所以 在我的 xhtml 中

    <img id="loading" src="#request.contextPath/images/spinner.gif" style="display: none;"/>

在我的 javascript 中

    document.getElementsByClassName('myclass').style.opacity = '0.7'
    document.getElementById('loading').style.display = "block";

【讨论】:

“普通的旧 javascript 方式”是什么意思?你能进一步解释一下吗?你的意思是你用了XMLHttpRequest

以上是关于如何使用 jQuery 显示“忙碌”指示器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在闪亮的应用程序中显示忙碌指示器?

如何在 wpf 中使用忙碌指示器

使用 JQuery 在 DIV 中显示繁忙指示器

如何在计算过程中显示 Silverlight Toolkit Busy Indicator?

IBM Worklight - 如何设置忙碌指示器的样式

如何显示 f:viewAction 的等待指示器?