纯JS实现前端动态加载CSS的等待控件
本文介绍一种轻量级的JavaScript前端等待控件实现方案。该控件无需预先引用CSS文件,而是通过JS动态拼凑并注入样式,利用命名空间避免冲突。文章详细解析了动态加载CSS的原理及调用方法,旨在为Bootstrap项目提供兼容且简单的数据加载提示方案。
背景与技术方案概述
网络上关于等待控件的解决方案众多,但往往结构复杂且未必符合特定需求。鉴于当前项目基于Bootstrap框架,为避免引入第三方控件可能带来的兼容性问题,我决定自行开发一个轻量级的等待控件。该方案的核心技术点涉及动态加载CSS以及JavaScript命名空间的使用,特此记录以便后续参考。
该等待控件的主要功能是:在执行特定操作前,界面会显示“数据加载中,请稍候。。。”的提示信息;当操作完成并触发回调函数后,该提示会自动消失。其核心原理在于整个等待控件(包括HTML结构和CSS样式)完全由JavaScript动态生成并插入页面,页面源码中无需预先定义任何相关元素。
关于CSS的动态加载方式,若将控件所需的class样式预先写入独立的CSS文件,则调用页面除了引用JS文件外,还必须额外引用CSS文件。即便尝试在JS中动态加载该CSS文件,对于一个如此简单的控件而言,引入两个文件显得过于繁琐,属于小题大做。
动态加载CSS的实现原理
因此,我选择在JavaScript代码中动态拼凑CSS字符串,并将其注入到页面中,从而实现样式与脚本的统一管理。
具体实现代码如下:
var FTabPages = function () {
var tabKeeper = null;
// e.g.
// tabKeeper = {
// container: ""
// , isErase: true
// , url: ""
// , params: {}
// , callback: null
// };
var wrap = $(document.body);
function initTab(tabJson) {
tabKeeper = tabJson;
}
function onTab(tabJson) {//切换页签
if (tabKeeper != null) {
var divPrev = $(tabKeeper.container);
if (tabKeeper.isErase) {
divPrev.empty();
}
divPrev.css("display", "none");
}
tabKeeper = tabJson;
var div = $(tabJson.container);
div.css("display", "");
if ($.trim(div.html()).length == ) {//首次加载或已清空
loadwaiting();
getViewRequest(tabJson.url, tabJson.params, function (data) {
div.empty().html(data);
docallback(tabJson.callback);
removeloading();
}, function (data) {
alert("数据获取超时或失败!");
removeloading();
});
} else {//非首次加载,隐藏但不清空
docallback(tabJson.callback);
}
}
function getViewRequest(url, params, onsuccess, onerror) {
$.ajax({
type: 'get',
url: url,
data: params,
contentType: "text/html; charset=utf-",
timeout:,
success: function (data) {
if (onsuccess != undefined && onsuccess != null) {
onsuccess(data);
}
},
error: function (data) {
if (onerror != undefined && onerror != null) {
onerror(data);
}
}
});
}
function docallback(callback) {
if (typeof callback != 'undefined' && callback instanceof Function) {
callback();
}
}
function resetTab() {//刷新当前页签
loadwaiting();
var div = $(tabKeeper.container);
getViewRequest(tabKeeper.url, tabKeeper.params, function (data) {
div.empty().html(data);
div.css("display", "");
docallback(tabKeeper.callback);
removeloading();
});
}
function loadwaiting() {//显示等待信息
$("<div class=\"datagrid-mask\"></div>").css({ display: "block", width: wrap.width(), height: wrap.height() }).appendTo(wrap);
$("<div class=\"datagrid-mask-msg\"></div>").html("数据加载中,请稍候...").appendTo(wrap).css({ display: "block", left: (wrap.width() - $("div.datagrid-mask-msg", wrap).outerWidth()) / , top: ($(window).height() - $("div.datagrid-mask-msg", wrap).outerHeight()) / });
}
function removeloading() {//隐藏等待信息
wrap.find("div.datagrid-mask-msg").remove();
wrap.find("div.datagrid-mask").remove();
}
function initloading() {//设置等待控件样式
var css = ".datagrid-mask { ";
css += " position: absolute; ";
css += " left: ; ";
css += " top: ; ";
css += " width: %; ";
css += " height: %; ";
css += " opacity: .; ";
css += " filter: alpha(opacity=); ";
css += " display: none; ";
css += "} ";
css += ".datagrid-mask-msg { ";
css += " position: absolute; ";
css += " top: %; ";
css += " margin-top: -px; ";
css += " padding: px px px px;";
css += " width: auto; ";
css += " height: px; ";
css += " border-width: px; ";
css += " border-style: solid; ";
css += " display: none; ";
css += "}";
//动态加载CSS
if (document.all) {
window.style = css;
document.createStyleSheet("javascript:style");
} else {
var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
document.getElementsByTagName('HEAD').item().appendChild(style);
}
}
initloading();
return {//这里是供外部调用的方法
onTab: function (tabJson) {
onTab(tabJson);
}
, resetTab: function () {
resetTab();
}
, init: function (tabJson) {
initTab(tabJson);
}
};
}();
控件调用示例
外部调用该控件的方式非常简单,示例如下:
FTabPages.init({
container: "#div_BasicInfo"
, isErase: true
, url: "http://blog.csdn.net/leftfist"
, params: {}
, callback: function () {
alert("Hello World!");
}
});
上述内容即为JavaScript前端等待控件的完整实现过程,希望本文所述内容能对大家有所帮助。
JS在setTimeout或Ajax回调中打开新标签页失败怎么处理
2026-11-05 15:50:12
JS直播协议选型:HLS、FLV与WebRTC的延迟与兼容性对比
2026-11-05 12:16:14
JS实现回到顶部:scrollTop赋值与浏览器兼容性处理
2026-11-04 23:43:35
JS使用classList动态添加、移除和切换CSS类名
2026-11-04 23:40:58
在 D3.js 中实现平滑过渡动画的技巧
2026-11-03 23:46:09
