0

0

解决jQuery AJAX同步请求阻塞UI导致加载动画不显示

DDD

DDD

发布时间:2025-10-25 09:25:14

|

224人浏览过

|

来源于php中文网

原创

解决jquery ajax同步请求阻塞ui导致加载动画不显示

本教程探讨了jQuery AJAX中加载动画不显示的问题,核心原因在于使用`async: false`导致同步请求阻塞了浏览器UI渲染。通过将`async`参数设置为`true`(或移除,因其为默认值),可以确保AJAX请求以异步方式执行,从而允许加载动画正常显示,提升用户体验和界面响应性。

在Web应用开发中,通过AJAX(Asynchronous JavaScript and XML)异步加载数据是提升用户体验的关键。当数据加载需要一定时间时,通常会显示一个加载动画(如GIF图片或CSS动画)来告知用户操作正在进行中,避免界面假死。然而,有时即使代码逻辑看似正确地在请求前显示加载器,在请求结束后隐藏加载器,加载动画依然不显示,并且控制台也没有报错。这通常指向一个关于AJAX请求模式的深层问题。

问题现象与初步分析

开发者在按钮点击事件中触发一个函数,该函数内部包含一个jQuery AJAX请求来获取数据。在AJAX请求开始前尝试显示一个加载动画($('#imgLoader').show()),在请求成功或失败后隐藏它($('#imgLoader').hide())。然而,实际运行中,加载动画并未如预期般显示,用户界面在数据加载期间显得无响应。

原始代码片段如下:

function fnLoadVendorData() {
    var vendorSel = $("#ddlVendorName option:selected").text();
    var strCircle = $("#lblRole").text();
    if (vendorSel != "--Select Vendor--" && typeof (vendorSel) != 'undefined') {
        $.ajax({
            type: "POST",
            url: "Ipfee.aspx/GetVendorData",
            data: JSON.stringify({ "vendorName": vendorSel, "strCircle": strCircle }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: false, // 关键所在
            success: function (response) {                
                if (response.d != "NoDataFound") {
                    $('#imgLoader').show(); // 这里显示加载器可能已经太晚
                    var getDatalist = JSON.parse(response.d);                    
                    Create_vendorDataTable(getDatalist);
                    $('#imgLoader').hide();
                } else {
                    jAlert("Data not available !!", "Information");
                }
                $('#imgLoader').hide();
            },
            error: function (response, textStatus, errorThrown) {
                jAlert(textStatus, "Information");
            }
        });
    }
}

核心原因:同步AJAX请求

问题的根源在于jQuery AJAX配置中的async: false参数。这个参数指示浏览器以同步方式执行AJAX请求。

当async设置为false时,JavaScript代码会暂停执行,直到AJAX请求完成并从服务器接收到响应。这意味着:

AdsGo AI
AdsGo AI

全自动 AI 广告专家,助您在数分钟内完成广告搭建、优化及扩量

下载
  1. 浏览器的主线程被阻塞。
  2. 在请求完成之前,浏览器无法执行任何其他任务,包括更新UI、处理用户输入或渲染DOM变化。

即使在AJAX请求之前调用了$('#imgLoader').show(),由于主线程被阻塞,浏览器也没有机会在请求返回之前重新渲染页面,从而使加载动画无法显示。用户看到的是一个冻结的界面,直到数据加载完毕,加载动画才可能瞬间出现并立即消失,或者根本不出现。

解决方案

解决此问题的关键是将async参数设置为true,或者直接移除该参数,因为async: true是jQuery AJAX的默认行为。

将AJAX请求改为异步执行后,浏览器的主线程将不会被阻塞。当请求发出后,JavaScript代码会继续执行,允许浏览器更新UI并显示加载动画。当服务器响应返回时,success或error回调函数才会被触发。

修改后的代码示例如下:

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

    if (vendorSel !== "--Select Vendor--" && typeof (vendorSel) !== 'undefined') {
        // 在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, // 将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, "Information");
            },
            complete: function() {
                // 无论成功或失败,都在请求完成后隐藏加载器
                $('#imgLoader').hide(); 
            }
        });
    }
}

重要提示: 在上述修改中,我们将$('#imgLoader').show();移到了$.ajax调用之前,确保在请求发送时加载器立即显示。同时,为了确保加载器在请求完成后无论成功与否都能被隐藏,我们引入了complete回调函数。complete回调会在success和error回调之后执行。

最佳实践与注意事项

  1. 优先使用异步请求: 在绝大多数Web开发场景中,都应优先使用异步AJAX请求(async: true)。同步请求会严重影响用户体验,导致页面卡顿、无响应。
  2. 避免在UI线程中执行耗时操作: 除了AJAX,任何长时间运行的JavaScript代码都可能阻塞UI。应尽量将耗时计算分解或使用Web Workers在后台线程中执行。
  3. 加载器显示时机: 确保加载动画在请求发送前立即显示,并在请求完成(无论成功或失败)后隐藏。使用beforeSend和complete回调是管理加载器状态的良好实践:
    $.ajax({
        // ... 其他配置
        beforeSend: function() {
            $('#imgLoader').show(); // 请求发送前显示
        },
        success: function(response) {
            // ... 处理成功响应
        },
        error: function(jqXHR, textStatus, errorThrown) {
            // ... 处理错误
        },
        complete: function() {
            $('#imgLoader').hide(); // 请求完成后隐藏
        }
    });
  4. 用户体验: 提供清晰的加载指示,让用户了解应用正在处理请求,从而减少等待时的焦虑感。
  5. 服务端响应时间: 优化后端API的响应时间也是提升整体用户体验的关键。即使前端处理得再好,过长的服务器响应时间依然会影响用户感知。

总结

当jQuery AJAX加载动画不显示且没有报错时,首先应检查async参数的设置。async: false是导致UI阻塞和加载动画无法渲染的常见原因。通过将AJAX请求改为异步模式,不仅能解决加载动画显示问题,更能显著提升Web应用的响应性和用户体验。在现代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()的相关内容,可以阅读本专题下面的文章。

516

2023.12.04

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

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

312

2023.12.06

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

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

129

2024.02.23

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

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

184

2024.02.23

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

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

51

2026.01.13

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

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

精品课程

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

共14课时 | 1.0万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.7万人学习

CSS教程
CSS教程

共754课时 | 43.9万人学习

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

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