如何使用 jQuery 创建“请稍候,正在加载...”动画?

IT技术 jquery animation
2021-02-27 09:15:36

我想在我的网站上放置一个“请稍候,正在加载”旋转圆圈动画。我应该如何使用 jQuery 完成此操作?

6个回答

你可以用各种不同的方式来做到这一点。它可能是微妙的,比如页面上的一个小状态说“正在加载...”,或者像在加载新数据时整个元素使页面变灰一样响亮。我在下面采用的方法将向您展示如何完成这两种方法。

设置

让我们首先从http://ajaxload.info获取一个不错的“加载”动画 我将使用在此处输入图片说明

让我们创建一个可以在任何时候发出 ajax 请求时显示/隐藏的元素:

<div class="modal"><!-- Place at bottom of page --></div>

CSS

接下来让我们给它一些天赋:

/* Start by setting display:none to make this hidden.
   Then we position it in relation to the viewport window
   with position:fixed. Width, height, top and left speak
   for themselves. Background we set to 80% white with
   our animation centered, and no-repeating */
.modal {
    display:    none;
    position:   fixed;
    z-index:    1000;
    top:        0;
    left:       0;
    height:     100%;
    width:      100%;
    background: rgba( 255, 255, 255, .8 ) 
                url('http://i.stack.imgur.com/FhHRx.gif') 
                50% 50% 
                no-repeat;
}

/* When the body has the loading class, we turn
   the scrollbar off with overflow:hidden */
body.loading .modal {
    overflow: hidden;   
}

/* Anytime the body has the loading class, our
   modal element will be visible */
body.loading .modal {
    display: block;
}

最后,jQuery

好的,继续使用 jQuery。下一部分实际上非常简单:

$body = $("body");

$(document).on({
    ajaxStart: function() { $body.addClass("loading");    },
     ajaxStop: function() { $body.removeClass("loading"); }    
});

而已!我们在触发ajaxStartajaxStop事件时将一些事件附加到 body 元素当 ajax 事件开始时,我们将“加载”类添加到主体中。当事件完成时,我们从主体中删除“加载”类。

看到它在行动:http : //jsfiddle.net/VpDUG/4952/

我建议使用插件插件以确保它们都已插入。
2021-04-28 09:15:36
这将是一个很好的补充,cballou。我只是想尽量减少信息 - 但正如你所指出的,它当然可以改进。
2021-04-29 09:15:36
这是最深入的解决方案,尽管我建议您使用居中插件,该插件将预加载器围绕页面元素(即 body、# element或 .element居中
2021-05-12 09:15:36
我不得不使用 .bind() 而不是 .on() 因为我们使用的是 jQuery 1.5.1!
2021-05-16 09:15:36
注意: 从 jQuery 1.8 开始,.ajaxStop()and.ajaxStart()方法应该只附加到文档中。 文档
2021-05-17 09:15:36

至于实际加载图像,请查看此站点以获取大量选项。

至于在请求开始时显示带有此图像的 DIV,您有几个选择:

A) 手动显示和隐藏图像:

$('#form').submit(function() {
    $('#wait').show();
    $.post('/whatever.php', function() {
        $('#wait').hide();
    });
    return false;
});

B) 使用ajaxStartajaxComplete

$('#wait').ajaxStart(function() {
    $(this).show();
}).ajaxComplete(function() {
    $(this).hide();
});

使用此元素将显示/隐藏任何请求。可好可坏,视需要而定。

C) 对特定请求使用单独的回调:

$('#form').submit(function() {
    $.ajax({
        url: '/whatever.php',
        beforeSend: function() { $('#wait').show(); },
        complete: function() { $('#wait').hide(); }
    });
    return false;
});
非常感谢@Paolo。就个人而言,我喜欢您的回答而不是大多数用户接受的回答。因此,我这边给你+1。
2021-04-23 09:15:36
仅供参考:从stackoverflow.com/questions/750358 /...合并
2021-04-25 09:15:36
这个网站有更大的,在我看来更好的装载机选择和更多的定制选项preloaders.net
2021-05-08 09:15:36
不错的解决方案,但是当我在 hide() 之后调用show() 时,它不起作用我找到了一个解决方案,将 show() 和 hide() 切换为 toggle()。希望它可以帮助与我有相同问题的人。另外,我尝试了解决方案 C) 并创建 beforeSend 不能异步工作。所以,我建议在 $.ajax 上方调用 show() 才能正常工作。
2021-05-15 09:15:36
需要注意的一点:如果你不能修改 HTML 来添加加载 img 元素,你可以使用 CSS 例如 input.loading-gif{background:url('images/loading.gif') ;} 然后使用 jQuery 应用类,例如 $('#mybutton').addClass('loading-gif'); 唯一的问题是这只会在单击提交按钮时请求 gif,这通常为时已晚,因此您需要预先缓存它,这对于 jQuery 来说很容易,例如 (new Image()).src = "images /loading.gif";
2021-05-21 09:15:36

除了 Jonathan 和 Samir 建议的内容(顺便说一句,这两个都是很好的答案!),jQuery 有一些内置事件,在发出 ajax 请求时会触发这些事件。

ajaxStart活动

每当 AJAX 请求开始时显示加载消息(并且没有一个已经处于活动状态)。

...这是兄弟,ajaxStop事件

附加要在所有 AJAX 请求结束时执行的函数。这是一个 Ajax 事件。

当页面上的任何位置发生任何 ajax 活动时,它们一起提供了一种显示进度消息的好方法。

HTML:

<div id="loading">
  <p><img src="loading.gif" /> Please Wait</p>
</div>

脚本:

$(document).ajaxStart(function(){
    $('#loading').show();
 }).ajaxStop(function(){
    $('#loading').hide();
 });
乔纳森的回答非常深入,但这对我来说是最好的,因为它很简单。
2021-04-23 09:15:36
这是过时的,从 1.8.0 开始,.ajaxStart只能附加到文档,即。$(document).ajaxStart(function(){}).
2021-05-09 09:15:36
@Jonno_FTW 已修复。塔。旧的问题和答案已被乔纳森桑普森对其问题的编辑所取代,但无论如何保持最新状态很好
2021-05-15 09:15:36

您可以从Ajaxload获取一个旋转圆圈的动画 GIF - 将其粘贴在您网站文件层次结构中的某个位置。然后您只需要添加一个带有正确代码的 HTML 元素,并在完成后将其删除。这相当简单:

function showLoadingImage() {
    $('#yourParentElement').append('<div id="loading-image"><img src="path/to/loading.gif" alt="Loading..." /></div>');
}

function hideLoadingImage() {
    $('#loading-image').remove();
}

然后,您只需要在 AJAX 调用中使用这些方法:

$.load(
     'http://example.com/myurl',
     { 'random': 'data': 1: 2, 'dwarfs': 7},
     function (responseText, textStatus, XMLHttpRequest) {
         hideLoadingImage();
     }
);

// this will be run immediately after the AJAX call has been made,
// not when it completes.
showLoadingImage();

这有一些警告:首先,如果您有两个或更多可以显示加载图像的位置,您将需要以某种方式跟踪同时运行的调用数量,并且仅在它们出现时隐藏全做完了。这可以使用一个简单的计数器来完成,它几乎适用于所有情况。

其次,这只会在成功的 AJAX 调用中隐藏加载图像。为了处理错误状态,你需要考虑$.ajax,这是比较复杂$.load$.get之类的,但很多更灵活了。

Samir Talwar:实际上是一个沉重的 JavaScript 应用程序。谢谢,我明白了。
2021-05-01 09:15:36
可以理解。在这种情况下,只需showLoadingImage在开始之前和hideLoadingImage结束后打电话应该相当简单。您可能需要进行某种setTimeout调用以确保浏览器实际呈现新<img>标签 - 我已经看到了几种情况,在 JavaScript 完成执行之前它不会打扰。
2021-05-13 09:15:36
你到底想跟踪什么?除非您在页面加载后请求信息(而且 AJAX 几乎是不使用插件的唯一方法),否则您为什么需要“加载”图像?
2021-05-17 09:15:36
谢谢回复。但是告诉我,为什么我需要使用 AJAX?我不能简单地在页面本身中追踪它吗?
2021-05-21 09:15:36

Jonathon 的优秀解决方案在 IE8 中中断(动画根本不显示)。要解决此问题,请将 CSS 更改为:

.modal {
display:    none;
position:   fixed;
z-index:    1000;
top:        0;
left:       0;
height:     100%;
width:      100%;
background: rgba( 255, 255, 255, .8 ) 
            url('http://i.stack.imgur.com/FhHRx.gif') 
            50% 50% 
            no-repeat;
opacity: 0.80;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity = 80);
filter: alpha(opacity = 80)};
编辑是因为多个“背景-”行不起作用,但单个背景声明工作正常。
2021-05-06 09:15:36