javascript面向对象编程(实践之无刷新分页插件)

经过前面六章javascript的面向对象编程学习,对于js的面向对象没有那么陌生,逐渐的开始了解了一些概念,但是光有理论是不行的,实践才是出真知的道路,所以这里就利用前面的知识,当然最主要的都是最后总结出来的一个“甘露模型”,当然这个甘露模型是我自己经过感悟李战大哥所讲的经过个人更改的,如果你有兴趣研究的话推荐去看李战大哥的《悟透javascript》。

开始准备写一个简单的贪吃蛇游戏的,但是最后还是由于所学知识有限,没能够很好的构思好,所以没有成功,其实之前我有写用js写过一个贪吃蛇游戏,但是代码比较乱,准备这次完善的,但是这么短的时间终究没有开动,恰好前天看到有人在用js做无刷新分页,于是就有了这个想法,也立马开始实践,经过断断续续一天的编码终于也算是实现了,下面先贴出效果图:


希望有能够理解的朋友给出点意见,我还同时会把代码放到开源中国上,期待大神给出建议!

由于采用的思想是分页仅仅做分页功能,并不去处理数据,所以我在代码吧直接把服务器产生的数据直接返回并未做处理。

代码包含四个文件,一个是Demo页面,用来做使用指导。一个是之前写的一个ajax类库,一个就是这篇文章的主题js,一个就是一个简单的服务器脚本。全部贴上!

Demo页:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS分页插件</title>
<style type="text/css">
#easyPageDiv{ width:435px; height:40px; line-height:40px; border:1px solid #CCC; text-align:center;}
#easyPageDiv .easypage_ul{ list-style:none; margin:0; padding:0; margin-left:13px;}
#easyPageDiv .easypage_ul li{ float:left; margin-left:10px;}
#easyPageDiv .easypage_span{ float:left;margin:0; padding:0; margin-left:15px;}
</style>
</head>
<body>

<div id="easyPageDiv"></div>
<script type="text/javascript" src="ajax.js"></script>
<script type="text/javascript" src="easypage.js"></script>
<script type="text/javascript">
window.onload = function() {
	var p = new easyPage({
		count : 22,
		num : 3,
		url : 'http://localhost/oasys/getnews.php',
		get : 'p',
		containr : document.getElementById('easyPageDiv')
	});
	p.showPage(function(data) {
		alert(data);	//这里接受服务器返回的数据,作为回调函数
	});
}
</script>
</body>
</html>

ajax类库:

/**
 * @todo	ajax库
 * @author	zhangqiang<501729495@qq.com>
 */
var Ajax = function() {
	var createXMLHttp= function() {
		var xmlhttp = null;
	    if ( window.XMLHttpRequest ) {		//IE7,Mozilla,safari,firefox,Opare......
	    	xmlhttp = new XMLHttpRequest();
	    }  else if ( window.ActiveXObject ) {	//Old version IE
	    	var XMLArray = new Array('MSxml2.XMLHTTP.5.0', 'MSxml2.XMLHTTP.4.0',
	                'MSxml2.XMLHTTP.3.0', 'MSxml2.XMLHTTP', 'Microsoft.XMLHTTP');
	        var success = false;
	        for( var i = 0;i < XMLArray.length && ! success; i++ ) {
	            try{
	                xmlhttp = new ActiveXObject( XMLArray[i] );	
	                success = true;
	                break;
	            } catch(e2) {}
	        }
	        if( ! success ) throw new Error('Fail To Create XMLHttpRequest Object');
	    }
        return xmlhttp;
	};
	var toQuery = function( o ) {
        if ( o == null || typeof(o) != 'object' ) return '';
        var _query = '', _str = '';
        for ( _key in o ) {
            if ( o.hasOwnProperty(_key) ) _str = _key + '=' + encodeURI(o[_key]);
            _query == '' ? _query += _str : _query += ('&'+_str);
        }
        return _query;
    };
	var statechange = function( xmlhttp, callback ) {
        xmlhttp.onreadystatechange = function() {
            if ( xmlhttp.readyState == 4 ) {
                if ( xmlhttp.status == 200 ) if ( callback != undefined ) callback(xmlhttp.responseText);
                else {
                    throw new Error('Request Error');
                }
            }
        };
    };
    return {
    	get : function( url, args, callback ) {
    		var xmlhttp = createXMLHttp();
            if ( xmlhttp == null ) return;
            var _query = toQuery(args);
            url = ( url.indexOf('?') != -1 ) ? url + '&' + _query : url + '?' + _query;

            //Register the onreadystatechange function
            statechange(xmlhttp, callback);
            xmlhttp.open('GET', url, true);
            xmlhttp.send();
    	},
    	post : function( url, args, callback ) {
    		//Create an ajax object
            var xmlhttp = createXMLHttp();
            if ( xmlhttp == null ) return;
            
            //Register the onreadystatechange function
            statechange(xmlhttp, callback);
            xmlhttp.open('POST', url, true);
            xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
            xmlhttp.send(toQuery(args));
    	}
    };
}();

js分页库:

/**
 * @todo	分页库
 * @author	zhangqiang<501729495@qq.com>
 */
function Class(aBase, aDefine) {  
    function prototype_() {};  
    prototype_.prototype = aDefine;     //准备子类的方法  
    var aPrototype = new prototype_();  
    //准备父类的方法和属性  
    for ( k in aBase ) {  
        if ( k != '__construct' ) {  
            aPrototype[k] = aBase[k];  
        }  
    }  
    if ( aBase.__construct ) {  
        aPrototype.super = aBase.__construct;       //记录父类构造函数,做直接调用父类构造方法使用  
    }  
    aPrototype.parent = aBase;  //记录父类,做向上调用使用  
    aDefine.__construct.prototype = aPrototype;     //挂载原型  
    return aDefine.__construct;  
}  
var easyPage = Class(Object, {
	count : null,	//总条目数	
	num : null,		//每页显示的条目数
	total : null,	//总页数
	currentpage : null,	//当前页码
	url : null,		//点击地址
	containr : null,	//UI放置容器DIV
	get : null,			//地址栏获取的标记名,默认为esayp
	selfUI : null,		//自定义UI渲染函数
	idxLeft : 2,		//左边空出的页码个数
	
	__construct : function(args) {
		this.idxLeft = parseInt(args.idxLeft)&&parseInt(args.idxLeft) > 0 ? parseInt(args.idxLeft) : this.idxLeft;
		this.currentpage = 1;
		this.count = args.count;	
		this.num = args.num;		
		this.total = parseInt( this.count % this.num > 0 ? (this.count / this.num)+1 : this.count / this.num  );	
		this.url = args.url;	
		this.containr = args.containr;
		this.get = args.get || 'esayp';
	},
	showPage : function(fncall, fn) {
		this.selfUI = fn ? fn : null;
		this.startUI(fncall);
	},
	//绑定a标签的点击事件
	bindEvent : function(_oa, fncall, pnum) {
		_self = this;
		Ajax.post(_oa.href, {}, function(data) {
			fncall(data);
			_self.currentpage = pnum;
			_self.startUI(fncall);
		});	
		return false;
	},
	//启动渲染UI
	startUI : function(fncall) {
		//检测是否有自定义UI渲染函数
		//方便重写UI
		this.containr.innerHTML = '';
		if ( ! this.selfUI ) {
			this.renderUI(fncall, this);	
		} else {
			this.selfUI(fncall, this);
		}
	},
	//渲染分页UI
	renderUI : function(fncall, _self) {
		var _UI = {first : '首页', prev : '上一页', next : '下一页', last : '尾页'};
		var _oUl = document.createElement('ul');
		_oUl.className = 'easypage_ul';
		for ( k in _UI ) {
			if ( k == 'next' ) {
				var iStart = _self.currentpage-_self.idxLeft <= 0 ? 1 : _self.currentpage-_self.idxLeft;
				var iEnd = iStart + _self.idxLeft*2;
				iEnd = iEnd >= _self.total ? _self.total : iEnd;
				for ( var i = iStart; i <= iEnd; i++ ) {
					(function(i) {
						var _oLi = document.createElement('li');
						var _oA = document.createElement('a');
						_oA.href = _self.url+'?'+_self.get+'='+i;
						_oA.onclick = function() {
							_self.bindEvent(this, fncall, i);
							return false;
						}
						_oA.innerHTML = i;
						_oLi.appendChild(_oA);
						_oUl.appendChild(_oLi);	
					})(i);
				}
			}
			(function(k) {
				var _oLi = document.createElement('li');
				var _oA = document.createElement('a');
				switch ( k ) {
					case 'first' :
						_oA.href = _self.url+'?'+_self.get+'=1';
						_oA.onclick = function() {
							_self.bindEvent(this, fncall, 1);
							return false;
						}
						break;
					case 'prev' :
						_oA.href = _self.url+'?'+_self.get+'='+(_self.currentpage-1 <= 0 ? 1 : _self.currentpage-1);
						_oA.onclick = function() {
							_self.bindEvent(this, fncall, _self.currentpage-1 <= 0 ? 1 : _self.currentpage-1);
							return false;
						}
						break;
					case 'next' :
						_oA.href = _self.url+'?'+_self.get+'='+(_self.currentpage+1 > _self.total ? _self.total : _self.currentpage+1);
						_oA.onclick = function() {
							_self.bindEvent(this, fncall, _self.currentpage+1 > _self.total ? _self.total : _self.currentpage+1);
							return false;
						}
						break;
					case 'last' :
						_oA.href = _self.url+'?'+_self.get+'='+_self.total;
						_oA.onclick = function() {
							_self.bindEvent(this, fncall, _self.total);
							return false;
						}
						break;
				}
				_oA.innerHTML = _UI[k];
				_oLi.appendChild(_oA);
				_oUl.appendChild(_oLi);	
			})(k);
		}
		var _oSpan = document.createElement('span');
		_oSpan.className = 'easypage_span';
		_oSpan.innerHTML = _self.currentpage+'/'+_self.total+'  共 '+_self.total+' 页';
		_self.containr.appendChild(_oUl);
		_self.containr.appendChild(_oSpan);
	}
});

服务器脚本文件:

<?php
var_dump($_GET['p']);

?>

这里是压缩包文件的下载地址: http://www.oschina.net/code/snippet_1156660_32845


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值