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 相关文章推荐
XML的代替者----JSON
Jul 21 Javascript
JS将秒换成时分秒实现代码
Sep 03 Javascript
node.js中的fs.rename方法使用说明
Dec 16 Javascript
js判断一个字符串是否包含一个子串的方法
Jan 26 Javascript
JQuery实现动态添加删除评论的方法
May 18 Javascript
详解jquery事件delegate()的使用方法
Jan 25 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
May 08 Javascript
JS简单生成随机数(随机密码)的方法
May 11 Javascript
慕课网题目之js实现抽奖系统功能
Sep 19 Javascript
vue内置组件transition简单原理图文详解(小结)
Jul 12 Javascript
js中Array对象的常用遍历方法详解
Jan 17 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 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随机数 C扩展随机数
2016/05/04 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
农历与西历对照
2006/09/06 Javascript
js单例模式的两种方案
2013/10/22 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
2017/10/25 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
jQuery实现tab栏切换效果
2020/12/22 jQuery
跟老齐学Python之一个免费的实验室
2014/09/14 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
优秀教导主任事迹材料
2014/05/09 职场文书
民用住房租房协议书
2014/10/29 职场文书
2014年团队工作总结
2014/11/24 职场文书
医学生自荐信范文
2015/03/05 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
复活读书笔记
2015/06/29 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
python脚本框架webpy模板控制结构
2021/11/20 Python
Go并发4种方法简明讲解
2022/04/06 Golang