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 获取dom固定元素 添加样式的简单实例
Feb 04 Javascript
Javascript与jQuery方法的隐藏与显示
Jan 19 Javascript
jquery插件ajaxupload实现文件上传操作
Dec 09 Javascript
js实现日历的简单算法
Jan 24 Javascript
Bootstrap3 模态框使用实例
Feb 22 Javascript
Vue原理剖析 实现双向绑定MVVM
May 03 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
Jul 10 Javascript
详解react-router4 异步加载路由两种方法
Sep 12 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
Jan 02 Javascript
vue2.0 axios跨域并渲染的问题解决方法
Mar 08 Javascript
layui多iframe页面控制定时器运行的方法
Sep 05 Javascript
详解JavaScript匿名函数和闭包
Jul 10 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
Zerg剧情介绍
2020/03/14 星际争霸
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
简单实现php上传文件功能
2017/09/21 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
python 测试实现方法
2008/12/24 Python
python最长回文串算法
2018/06/04 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
年级组长自我鉴定
2014/02/22 职场文书
环保倡议书100字
2014/05/15 职场文书
家长给学校的建议书
2014/05/15 职场文书
会计岗位说明书
2014/07/29 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
求职自我评价怎么写
2015/03/09 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang