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 相关文章推荐
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
Apr 12 Javascript
prototype Element学习笔记(篇二)
Oct 26 Javascript
Javascript 作用域使用说明
Aug 13 Javascript
js 设置选中行的样式的实现代码
May 24 Javascript
jquery插件orbit.js实现图片折叠轮换特效
Apr 14 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
Jun 07 Javascript
Bootstrap插件全集
Jul 18 Javascript
JS对象是否拥有某属性如何判断
Feb 03 Javascript
微信小程序之判断页面滚动方向的示例代码
Aug 30 Javascript
微信小程序引入Vant组件库过程解析
Aug 06 Javascript
基于Vue的侧边目录组件的实现
Feb 05 Javascript
JS co 函数库的含义和用法实例总结
Apr 08 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设计模式  Command(命令模式)
2011/06/17 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
各个系统下的Python解释器相关安装方法
2015/10/12 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Python函数返回不定数量的值方法
2019/01/22 Python
python实现贪吃蛇游戏
2020/03/21 Python
详解Python的三种可变参数
2019/05/08 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
英文自我鉴定
2013/12/10 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
大学毕业生个人自荐信范文
2014/01/08 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
代收款委托书范本
2014/10/01 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python
php双向队列实例讲解
2021/11/17 PHP