在很多項目中都會涉及到數據加載。數據加載有時可能會是2-3秒,為了給一個友好的提示,一般都會給一個【數據加載中。。。】的提示。今天就做了一個這樣的提示框。
先去jQuery官網看看怎么寫jQuery插件,然后就開始寫了。寫下來這么一個插件,稍作優化,就在項目中使用了。下面貼的是我寫這個插件時的測試圖:

這張圖模擬數據加載前提示框的展示,這個表格是一個寫在頁面上的。藍色的底紋就是遮罩層。
(function($){
$.fn.extend({
/**
* 打開遮罩,並顯示一段文字。
* @param {String} msg [顯示的文字]
* @param {String} imgsrc [圖片的位置]
* @return {void}
*/
openMask:function(msg, imgsrc){
// var loadDiv=$("body").find("._mask_loadDiv");
var loadDiv=this.find("._mask_loadDiv");
if(!loadDiv || !loadDiv[0]){ // add Mask
var loadDiv=$("<div class='_mask_loadDiv' style='position:absolute; z-index:99999; height:40px; background:#FFF; border:1px solid #ACE'></div>");
if(!imgsrc){ // 指定默認的圖片
var scripts=document.getElementsByTagName("script");
for(var i=0; i<scripts.length; i++){
if(scripts[i].src.indexOf("mask")!=-1){
var scriptSrc=scripts[i].src;
var uri=scriptSrc.substring(0,scriptSrc.lastIndexOf("/"));
imgsrc=uri+"/images/mask_loading.gif";
}
}
}
var contentDiv=$("<div class='_mask_content' style='position:relative;text-align:center;' >");
var fontsize=12;
//loadDiv的寬度= msg的寬度+img的寬度
var loadDiv_width=msg.length*fontsize+16+3;
contentDiv.css("width",loadDiv_width);
loadDiv.css("width",loadDiv_width);
if(imgsrc){
contentDiv.append("<img src='"+imgsrc+"' alt='"+msg+"' style='width:16px; height:16px'>")
.append("<span style='font-size:"+fontsize+"px; margin-left:2px; vertical-align:text-top'>"+msg+"</span>");
}
this.append(loadDiv.append(contentDiv));
// $("body").append(loadDiv.append(contentDiv));
/*
loadDiv[0].style.top=this[0].offsetTop+(this[0].offsetHeight-loadDiv[0].offsetHeight)/2;
loadDiv[0].style.left=this[0].offsetLeft+(this[0].offsetWidth-loadDiv[0].offsetWidth)/2;
loadDiv[0].style.paddingTop=(loadDiv[0].offsetHeight-contentDiv[0].offsetHeight)/2;
*/
loadDiv.css("top",this[0].offsetTop+(this[0].offsetHeight-loadDiv[0].offsetHeight)/2);
loadDiv.css("left",this[0].offsetLeft+(this[0].offsetWidth-loadDiv[0].offsetWidth)/2);
loadDiv.css("padding-top",(loadDiv[0].offsetHeight-contentDiv[0].offsetHeight)/2);
}
loadDiv.css("z-index",99999).css("display","block");
return this;
},
closeMask:function(){
// var loadDiv=$("body").find("._mask_loadDiv");
var loadDiv=this.find("._mask_loadDiv");
if(loadDiv)
loadDiv.css("display","none").css("z-index",-99999);
return this;
}
});
})(jQuery);
/*
// 這個是遮罩層里信息展示框,這個會添加到 <body> 或者 target 元素中
<div class="_mask_loadDiv">
<div class="_mask_content">
<img src='imgsrc' alt='msg' >
<span>msg</span>
</div>
</div>
//這個是目標,要在它上顯示遮罩層
<div id="target">
</div>
// 只需要下面的代碼:
$("#target").openMask("數據加載中。。。");
// 隱藏對話框,只需要:
$("#target").closeMask();
*/
因為涉及到的CSS並不多,就沒有遵循HTML、JS、CSS分離的原則,而是將CSS都在這個JS 中寫了。
測試頁面代碼:
<html>
<head>
<script type="text/javascript" src="./jquery-mask/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="./jquery-mask/jquery.mask.js"></script>
<script type="text/javascript">
var helloDiv;
$(function(){
var tbl=$("#tableContent");
for(var i=0; i< 16;i++){
tbl.append('<tr><td width="25%">hello</td><td width="25%">world</td><td width="25%">jquery</td><td width="22%">mask</td></tr>');
}
helloDiv=$("#hello");
helloDiv.openMask('數據加載中。。。');
});
function openMask(){
helloDiv.openMask("數據加載中。。。。");
}
function closeMask(){
helloDiv.closeMask("數據加載中。。。。");
}
</script>
<body>
<div id="hello" style="width:300px; height:400px; ">
<table border="1" width="100%" id="tableContent">
</table>
</div>
<input value="open" type="button" onclick="openMask();"><br>
<input type="button" value="close" onclick="closeMask();">
</body>
</head>
</html>
寫這個插件的重點是:計算提示框的位置問題(top, left)、提示框層次問題(z-index)。
要理解這些屬性可以看看:CSS位置和布局的相關博客。

