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中Math之random,round,ceil,floor的用法总结
Dec 26 Javascript
一个Action如何调用两个不同的方法
May 22 Javascript
深入探究使JavaScript动画流畅的一些方法
Jun 30 Javascript
JavaScript的String字符串对象常用操作总结
May 26 Javascript
jQuery实现手机自定义弹出输入框
Jun 13 Javascript
js 实现数值的千分位及保存小数方法(推荐)
Aug 01 Javascript
jquery实现限制textarea输入字数的方法
Sep 06 jQuery
JS实现利用两个队列表示一个栈的方法
Dec 13 Javascript
js实现购物车功能
Jun 12 Javascript
解决layui中的form表单与button的点击事件冲突问题
Aug 15 Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 Javascript
vue之封装多个组件调用同一接口的案例
Aug 11 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
php数字游戏 计算24算法
2012/06/10 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
深入apache host的配置详解
2013/06/09 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
使用Python实现windows下的抓包与解析
2018/01/15 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
python dlib人脸识别代码实例
2019/04/04 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
儿科主治医生个人求职信
2013/09/23 职场文书
小学生自我评价范例
2013/09/24 职场文书
2014年科普工作总结
2014/12/06 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android
python playwright之元素定位示例详解
2022/07/23 Python