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 相关文章推荐
简单的JS多重继承示例
Mar 13 Javascript
利用js制作html table分页示例(js实现分页)
Apr 25 Javascript
删除javascript中注释语句的正则表达式
Jun 11 Javascript
angular.foreach 循环方法使用指南
Jan 06 Javascript
javascript中局部变量和全局变量的区别详解
Feb 27 Javascript
javascript继承的六大模式小结
Apr 13 Javascript
在JavaScript中访问字符串的子串
Jul 07 Javascript
JavaScript重载函数实例剖析
May 13 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
May 16 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
Aug 03 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
vue+iview+less 实现换肤功能
Aug 17 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
2006/12/13 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
浅谈Python浅拷贝、深拷贝及引用机制
2016/12/15 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
用Python实现职工信息管理系统
2020/12/30 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
就业自荐信
2013/12/04 职场文书
读书演讲主持词
2014/03/18 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书