0

0

为什么你的jQuery加载动画不显示?深入理解AJAX异步调用

心靈之曲

心靈之曲

发布时间:2025-10-26 09:47:14

|

691人浏览过

|

来源于php中文网

原创

为什么你的jQuery加载动画不显示?深入理解AJAX异步调用

当使用jquery ajax进行数据加载时,加载动画(如gif图片)可能无法正常显示,即使控制台没有错误。这通常是由于ajax请求被设置为同步(`async: false`)导致的。本文将解释同步与异步请求的区别,并指导如何通过将`async`参数设置为`true`来确保加载动画的正确显示,从而提升用户体验。

在现代Web应用开发中,通过AJAX(Asynchronous JavaScript and XML)技术实现页面无刷新数据交互已成为标准实践。为了提升用户体验,我们通常会在数据加载过程中显示一个加载动画(如GIF图片或CSS动画),以告知用户操作正在进行。然而,有时开发者会遇到一个令人困惑的问题:加载动画的显示逻辑看似正确,但在AJAX请求期间却无法正常显示,控制台也没有任何错误报告。本文将深入探讨这一现象背后的原因,并提供一个简洁有效的解决方案。

理解AJAX请求的同步与异步模式

jQuery的$.ajax()方法提供了一个async参数,用于控制请求的执行模式。理解这两种模式对于解决加载动画不显示的问题至关重要。

  1. 异步模式 (async: true,默认值)

    • 当async设置为true时,JavaScript代码会立即继续执行,而不会等待AJAX请求完成。请求在后台进行,当服务器响应时,success或error回调函数才会被触发。
    • 这是推荐的模式,因为它不会阻塞浏览器的主线程,用户界面(UI)保持响应,动画可以正常渲染。
    • 加载动画在这种模式下能够正常显示,因为它在AJAX请求发出后,但在数据返回前,有机会被浏览器渲染出来。
  2. 同步模式 (async: false)

    • 当async设置为false时,JavaScript代码会暂停执行,直到AJAX请求完成并收到服务器响应。这意味着浏览器的主线程被完全阻塞。
    • 在这种模式下,用户界面会冻结,无法响应任何用户操作,也无法渲染任何DOM更新或动画。
    • 如果加载动画的显示逻辑在AJAX请求之前被触发,由于浏览器主线程被阻塞,加载动画的渲染更新请求会被排队,直到同步AJAX请求完成。一旦请求完成,加载动画可能立即被隐藏,或者由于UI阻塞而从未被用户看到。

问题根源:同步AJAX请求阻塞UI渲染

加载动画不显示的核心原因在于将AJAX请求设置为了同步模式 (async: false)。当JavaScript执行到同步AJAX请求时,它会暂停所有后续代码的执行,包括浏览器对DOM更新和动画渲染的调度。即使你在AJAX请求之前调用了$('#imgLoader').show()来显示加载动画,这个显示操作也无法立即被浏览器渲染出来,因为它被同步请求阻塞了。当请求完成后,加载动画可能已经被$('#imgLoader').hide()隐藏,或者由于阻塞时间过短而根本未被用户感知。

解决方案:启用异步AJAX请求

解决此问题的最直接方法是将AJAX请求的async参数设置为true。由于true是$.ajax()的默认值,通常情况下只需移除async: false这一行即可。如果需要明确指定,则将其设置为true。

AssemblyAI
AssemblyAI

转录和理解语音的AI模型

下载

以下是修改后的代码示例:

function fnLoadVendorData() {
    var vendorSel = $("#ddlVendorName option:selected").text();
    var strCircle = $("#lblRole").text();

    if (vendorSel !== "--Select Vendor--" && typeof (vendorSel) !== 'undefined') {
        // 1. 在AJAX请求发送前显示加载动画
        $('#imgLoader').show(); 

        $.ajax({
            type: "POST",
            url: "Ipfee.aspx/GetVendorData",
            data: JSON.stringify({ "vendorName": vendorSel, "strCircle": strCircle }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            // 关键改动:将async设置为true,或直接移除此行(因为true是默认值)
            async: true, 
            success: function (response) {                
                if (response.d !== "NoDataFound") {
                    var getDatalist = JSON.parse(response.d);                    
                    Create_vendorDataTable(getDatalist);
                } else {
                    jAlert("Data not available !!", "Information");
                }
            },
            error: function (response, textStatus, errorThrown) {
                jAlert("数据加载失败: " + textStatus, "错误信息");
            },
            // 2. 无论请求成功或失败,都在complete回调中隐藏加载动画
            complete: function() {
                $('#imgLoader').hide();
            }
        });
    }
}

配套的HTML结构(加载动画部分):

<img src="Images/ipload.gif" id="imgLoader" 
     style="display: none; width: 80px; height: 80px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 9999;" 
     alt="加载中..." />

<!-- 其他页面内容,如选择框和按钮 -->
<div class="row">
    <div class="col-md-4">
        <div class="form-group">
            <select name="ddlVendorName" id="ddlVendorName" class="form-control">
                <option value="--Select Vendor--">--Select Vendor--</option>
                <option value="1032">IPFEE_INDUS</option>
                <option value="1028">IPFEE_TVIPL</option>
                <!-- ... 其他选项 ... -->
            </select>
            <label>Vendor Name</label>
        </div>
    </div>
    <div class="col-md-3 filterButton">
        <div class="form-group">
            <button type="button" class="btn btn-danger button" id="btnFilterClick">
                <i class="fa fa-filter" aria-hidden="true"></i>Filter
            </button>
        </div>
    </div>
</div>

注意事项:

  1. 加载动画的显示与隐藏时机: 务必在AJAX请求发送之前显示加载动画 ($('#imgLoader').show();),并在请求完成后(无论成功或失败)隐藏它。complete回调函数是处理隐藏逻辑的最佳位置,因为它总是在success或error回调之后执行。
  2. 避免使用同步AJAX: 在Web开发中,几乎所有情况下都应避免使用同步AJAX请求。它会导致糟糕的用户体验,并可能在现代浏览器中触发警告甚至被弃用。
  3. 错误处理: 确保在error回调中也进行适当的用户提示和UI清理,以防网络问题或服务器错误。
  4. UI阻塞的替代方案: 如果确实需要等待一个操作完成才能进行下一步,可以考虑使用Promise或async/await语法来管理异步流程,同时保持UI的响应性。

总结

当jQuery加载动画在AJAX请求期间不显示时,首先应检查你的$.ajax()配置中是否意外地将async参数设置为false。同步AJAX请求会阻塞浏览器的主线程,阻止UI更新和动画渲染。通过将async参数设置为true(或直接省略它,因为true是默认值),你可以确保AJAX请求以异步方式执行,从而允许加载动画正常显示,显著提升用户体验。始终优先使用异步AJAX,以构建响应迅速、用户友好的Web应用程序。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

156

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

406

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

515

2023.12.04

jquery实现分页方法
jquery实现分页方法

在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

312

2023.12.06

jquery中隐藏元素是什么
jquery中隐藏元素是什么

jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

128

2024.02.23

jquery中什么是高亮显示
jquery中什么是高亮显示

jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2024.02.23

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

51

2026.01.13

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 43.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号