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 相关文章推荐
Javascript 日期对象Date扩展方法
May 30 Javascript
JavaScript 继承详解 第一篇
Aug 30 Javascript
node.js中的fs.readFile方法使用说明
Dec 15 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
Dec 30 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
Jan 01 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
Apr 01 Javascript
bootstrap常用组件之头部导航实现代码
Apr 20 Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 Javascript
jquery单击文字或图片内容放大并居中显示
Jun 23 jQuery
实例教学如何写vue插件
Nov 30 Javascript
vue项目实现github在线预览功能
Jun 20 Javascript
javascript中this的用法实践分析
Jul 29 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 MSSQL 存储过程的方法
2008/12/24 PHP
让PHP开发者事半功倍的十大技巧小结
2010/04/20 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
CI框架常用方法小结
2016/05/17 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
jquery里的each使用方法详解
2010/12/22 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
js转html实体的方法
2016/09/27 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
javascript实现图片轮播代码
2019/07/09 Javascript
在Python中调用ggplot的三种方法
2015/04/08 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
Django用户认证系统 User对象解析
2019/08/02 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
应届生护士求职信
2013/11/01 职场文书
安全目标管理责任书
2014/07/25 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
聊聊Python String型列表求最值的问题
2022/01/18 Python