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判断输入是否为数字的具体实例
Aug 03 Javascript
javascript学习笔记(四)function函数部分
Sep 30 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
Apr 12 Javascript
js文字横向滚动特效
Nov 11 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
Oct 13 Javascript
微信小程序 二维码canvas绘制实例详解
Jan 06 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
Mar 24 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
JavaScript阻止表单提交方法(附代码)
Aug 15 Javascript
js统计页面上每个标签的数量实例代码
May 29 Javascript
微信小程序实现打卡日历功能
Sep 21 Javascript
js实现烟花特效
Mar 02 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
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
许愿墙中用到的函数
2006/10/07 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
2015/03/31 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
Python可跨平台实现获取按键的方法
2015/03/05 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
什么是岗位职责
2013/11/12 职场文书
行政总经理岗位职责
2013/12/05 职场文书
公司人力资源的自我评价
2014/01/02 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
爱护花草树木的标语
2014/06/11 职场文书
长江三峡导游词
2015/01/31 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
Redis+AOP+自定义注解实现限流
2022/06/28 Redis