执行XMLHttpRequest时显示加载动画

众所周知,XMLHttpRequest 是一个应用很广泛用于Javascript 请求API的一个模组,我们是否可以在XMLHttpRequest请求时显示加载动画以获得更好的网页使用体验呢?

答案是:可以的!

接下来,让我们一起开始动手吧!

首先,你需要嵌入 Bootstrap 的 JS + CSS 进入你的 HTML,这里建议使用 JsDelivr 的 CDN ,因为本地 ISP 已经污染了 MaxCDN 的域名,导致如果使用 MaxCDN 加载Bootstrap,使用本地ISP的DNS时会被指向 175.139.142.25 (MCMC block IP)

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>

这里的逻辑是:用户输入数据后,XMLHttpRequest 把数据发送到服务端,并且显示加载动画和移除Form,等待服务端返回结果后移除动画和显示结果

Form ID = test

content = 返回结果显示的div id

废话不多说直接上代码


window.addEventListener( "load", function () {

function sendData() // 当检测到 sendData 被触发

{

const FD = new FormData( form ); // 定义 FD 为 Form 里面用户提交的数据

var xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function () {

if (xhttp.readyState == 4) // 如果服务端成功返回结果

{

document.getElementById("content").innerHTML = ''; // 将 content 清空

document.getElementById("content").innerHTML = xhttp.responseText; // 显示返回结果至 content

}

}

const myobj = document.getElementById("test");

myobj.remove(); // 移除 Form

document.getElementById("content").innerHTML = '<div class="spinner-border" role="status"><span class="sr-only"></span></div>'; // 显示加载动画至 content

xhttp.addEventListener( "error", function( event ) // 如果XMLHttpRequest 无法请求或者CORS或Referer问题

{

const myobj = document.getElementById("test");

myobj.remove(); // 移除 Form

alert( 'Oops! Something went wrong. Please check your internet connection' );

document.getElementById("content").innerHTML = 'Something went wrong. Please check your internet connection and address.' // 提示错误

} );


xhttp.open("POST", "./api.php"); // 请求方法和URL

xhttp.send(FD); // 发送 Form Data

}

const form = document.getElementById( "test" ); // 定义 Form 为 "test" 里面的form

form.addEventListener( "submit", function ( event ) {

event.preventDefault();


sendData(); // 当检测到用户提交Form时劫持并且触发 sendData

} );

});

至此,我们就大功告成了!
Demo 页面:
Digi Fibre Coverage Checker (samsam123.name.my)