JS 非图片动态loading效果实现代码


Posted in Javascript onApril 09, 2010

代码如下:
首先实现该功能的js对象LoadingMsg:

var Class = { 
create: function() { 
return function() { this.init.apply(this,arguments); } 
} 
} 
var LoadingMsg = Class.create(); 
LoadingMsg.prototype = { 
init: function(spanId, spanMsg) { 
this.intervalID = -10000; 
this.spanId = spanId; 
this.spanMsg = spanMsg; 
this.timespan = 1000; 
this.pointNum = 3; 
this.initPointMsg = "..."; 
}, 
Loading: function() { 
var maxLength = this.spanMsg.length + this.pointNum; 
var currentSpanMsg = document.getElementById(this.spanId).innerHTML; 
if (currentSpanMsg.length < maxLength) { 
document.getElementById(this.spanId).innerHTML += "."; 
} 
else { 
document.getElementById(this.spanId).innerHTML = this.spanMsg; 
} 
}, 
Start: function() { 
document.getElementById(this.spanId).innerHTML = this.spanMsg + this.initPointMsg; 
var callObj = this; 
this.intervalID = setInterval(function() { callObj.Loading(); }, this.timespan); 
}, 
End: function() { 
document.getElementById(this.spanId).innerHTML = ""; 
clearInterval(this.intervalID); 
} 
}

关键点:
如果把
var callObj = this; 
this.intervalID = setInterval(function() { callObj.Loading(); }, this.timespan);

写成:
this.intervalID = setInterval(this.Loading, this.timespan);

在执行Loading方法时则会报找不到this.spanMsg的错误。
因为在setInterval里的第一个参数里的this是windows对象,而不是LoadingMsg对象。windows.setInterval嘛。
应用该方法:
<body> 
<input type="button" value="Start" onclick="javascript:StartLoading();" /> 
<span id="spanId" style="color:Red"></span> 
<br /> 
<input type="button" value="End" onclick="javascript:EndLoading();" /> 
<br /><br /> 
<script type="text/javascript"> 
var loadingMsgObj = new LoadingMsg("spanId","loading"); 
function StartLoading() { 
loadingMsgObj.Start(); 
} 
function EndLoading() { 
loadingMsgObj.End(); 
} 
</script> 
</body>

来源于prototype.js里经典创建Js对象的
var Class = { 
create: function() { 
return function() { this.init.apply(this,arguments); } 
} 
} 
var LoadingMsg = Class.create();

在Class.create()的时候做了2件事,1个是创建了LoadingMsg的对象,即var LoadingMsg = function() {};
另外一件事就是调用LoadingMsg的init方法,初始化LoadingMsg里的静态私有变量,相当于c#里的构造函数作用。
如果你觉得这很装逼的话,如果你更喜欢简单朴实的女孩子的话,也可以改写LoadingMsg对象:
var LoadingMsg = function() { }; 
LoadingMsg.prototype = { 
init: function(spanId, spanMsg) { 
this.intervalID = -10000; 
this.spanId = spanId; 
this.spanMsg = spanMsg; 
this.timespan = 1000; 
this.pointNum = 3; 
this.initPointMsg = "..."; 
}, 
Loading: function() { 
var maxLength = this.spanMsg.length + this.pointNum; 
var currentSpanMsg = document.getElementById(this.spanId).innerHTML; 
if (currentSpanMsg.length < maxLength) { 
document.getElementById(this.spanId).innerHTML += "."; 
} 
else { 
document.getElementById(this.spanId).innerHTML = this.spanMsg; 
} 
}, 
Start: function(spanId, spanMsg) { 
this.init(spanId, spanMsg); 
document.getElementById(this.spanId).innerHTML = this.spanMsg + this.initPointMsg; 
var callObj = this; 
this.intervalID = setInterval(function() { callObj.Loading(); }, this.timespan); 
}, 
End: function() { 
document.getElementById(this.spanId).innerHTML = ""; 
clearInterval(this.intervalID); 
} 
}

所不同的是把init的过程调到Start时执行,因此调用的时候也就变成了
var loadingMsgObj = new LoadingMsg(); 
function StartLoading() { 

loadingMsgObj.Start("spanId", "loading"); 
}

从面向对象的习惯上来说,我个人还是倾向第一种写法,在实例化对象的时候即传入参数,而不是执行对象方法的时候传入参数。
另外关于setInterval方法传参数时,如果参数是简单的string,可以
setInterval("DisplayXYZ('xyz')",1000);
如果参数是对象,
则可以setInterval(function(){DisplayXYZ(obj);},1000);
LoadingMsg还是主要用在Ajax中,应用于执行时间可能较长的场景,在发送请求后loadingMsgObj.Start(),在成功获取响应时loadingMsgObj.End()。
Javascript 相关文章推荐
JQuery实现的在新窗口打开链接的方法小结
Apr 22 Javascript
js常用排序实现代码
Dec 28 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
Mar 25 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
使用jquery插件qrcode生成二维码
Oct 22 Javascript
AngularJs  Using $location详解及示例代码
Sep 02 Javascript
JS库之ParticlesJS使用简介
Sep 12 Javascript
JS实现Cookie读、写、删除操作工具类示例
Aug 28 Javascript
vue中使用vue-cli接入融云实现即时通信
Apr 19 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 Javascript
extJs 下拉框联动实现代码
Apr 09 #Javascript
禁止js文件缓存的代码
Apr 09 #Javascript
javascript+mapbar实现地图定位
Apr 09 #Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
Apr 09 #Javascript
Javascript string 扩展库代码
Apr 09 #Javascript
JavaScript 设计模式之组合模式解析
Apr 09 #Javascript
跟着Jquery API学Jquery之一 选择器
Apr 07 #Javascript
You might like
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
PHP7 新增功能
2021/03/09 PHP
js同比例缩放图片的小例子
2013/10/30 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
Vue3.x源码调试的实现方法
2019/10/13 Javascript
用vue写一个日历
2020/11/02 Javascript
python连接oracle数据库实例
2014/10/17 Python
python正则表达式的使用
2017/06/12 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
python pip如何手动安装二进制包
2020/09/30 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
高中军训的心得体会
2014/09/01 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
vue elementUI表格控制对应列
2022/04/13 Vue.js
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers