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 相关文章推荐
[Web]防止用户复制页面内容和另存页面的方法
Feb 06 Javascript
JS不间断向上滚动效果代码
Dec 25 Javascript
关于jQuery判断元素是否存在的问题示例探讨
Jul 21 Javascript
jquery中JSON的解析方式
Mar 16 Javascript
简单谈谈javascript Date类型
Sep 06 Javascript
AngularJs基本特性解析(一)
Jul 21 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
浅析Javascript的自动分号插入(ASI)机制
Sep 29 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
May 14 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
Jun 19 Javascript
VUE 解决mode为history页面为空白的问题
Nov 01 Javascript
使用Karma做vue组件单元测试的实现
Jan 16 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笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
关于python多重赋值的小问题
2019/04/17 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
抽象类和接口的区别
2012/09/19 面试题
住宅质量保证书
2014/04/29 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
关于观后感的作文
2015/06/18 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
如何在C++中调用Python
2021/05/21 Python
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python