jQuery 翻页组件yunm.pager.js实现div局部刷新的思路


Posted in Javascript onAugust 11, 2016

 前端的翻页插件有很多,bootstrap的翻页界面看起来就不错,做起来也易于上手,但应用于项目中的翻页实现还有有几个难点,分别是:

如何封装一个翻页插件,如题中的yunm.pager.js。

涉及到的div局部刷新该如何做。

在没给大家介绍正文之前,先给大家展示下效果图,如果感觉还不错,请继续往下阅读:

jQuery 翻页组件yunm.pager.js实现div局部刷新的思路

翻页的总体流程涉及到的知识点很多,这篇文章我们也主要来关注以上两点,其余的内容,请自悟。

一、如何定义局部刷新的div

翻页时,我们一般只会刷新页面中涉及到翻页的父级div,那么该如何定义呢?

<form rel="support_deal_page" target="turnPageForm" action="${ctx}/initI" method="post">
<input type="hidden" name="page" value="1" />
<input type="hidden" name="rows" value="2" />
</form>
<div id="support_deal_page" class="row"></div>

为div定义id,建议为当前页面唯一,如果页面有多个翻页组件。

为div创建一个同级的form表单。

rel属性指向div,表明该form表单属于support_deal_page的div。

target属性为turnPageForm,表明该form为翻页组件的form。

action 参数自然不可或缺。

定义page 的input标签,表明为第一页。

定义rows的input标签,表明每页有显示两个。

div定义完后,页面加载load的时候,我们就可以请求后台(后台怎么处理数据,这里就不罗嗦了),获取第一页的分页数据。

// 根据form的target属性,获取需要分页的div,发起ajax请求。
$("form[target=turnPageForm]", $p).each(function() {
var $this = $(this);
YUNM.debug('form[target=turnPageForm]' + $this.selector);
var rel = $this.attr("rel");
var $box = $this.parent().find("#" + rel);
if (rel) {
$box.ajaxUrl({
type : "POST",
// 记录div的id
url : $this.attr("action") + "?rel=" + rel,
data : $this.serializeArray(),
callback : function() {
}
});
}
});
ajaxUrl : function(op) {
var $this = $(this);
$.ajax({
type : op.type || 'GET',
url : op.url,
data : op.data,
cache : false,
success : function(response) {
var json = YUNM.jsonEval(response);
if (json[YUNM.keys.statusCode] == YUNM.statusCode.error) {
if (json[YUNM.keys.message])
$.showErr(json[YUNM.keys.message]);
} else {
// ajax请求获取成功后,将局部刷新的内容放到div中
$this.html(response).initUI();
if ($.isFunction(op.callback))
op.callback(response);
}
},
error : YUNM.ajaxError,
statusCode : {
503 : function(xhr, ajaxOptions, thrownError) {
$.showErr("服务器当前负载过大或者正在维护!" || thrownError);
}
}
});
},

页面首次加载的时候,我们将第一页的数据放到div中,这一步也很简单。

二、封装翻页组件 yunm.pager.js

完成第一步后,如何将翻页组件封装,就成为接下来的关键步骤了。

(function($) {
$.fn.extend({
pager : function(opts) {
// 可参照bootstrap的翻页,为了获得前一页和后一页的按钮组件
var setting = {
prev$ : "li.previous",
next$ : "li.next",
};
return this.each(function() {
var $this = $(this);
var pc = new Pager(opts);
// 参照bootstrap翻页
$this.html('<ul class="pager">' + '<li class="previous"><a href="#">← 前一页</a></li>' + '<li class="next"><a href="#">后一页 →</a></li>'
+ '</ul>');
var $prev = $this.find(setting.prev$);
var $next = $this.find(setting.next$);
if (pc.hasPrev()) {
// 如果有前一页,绑定前一页事件
_bindEvent($prev, pc.getCurrentPage() - 1, pc.rel());
} else {
// 否则置灰
$prev.addClass("disabled");
}
if (pc.hasNext()) {
_bindEvent($next, pc.getCurrentPage() + 1, pc.rel());
} else {
$next.addClass("disabled");
}
});
// 绑定点击事件,主要传递第几页
function _bindEvent($target, pageNum, rel) {
$target.bind("click", {
pageNum : pageNum
}, function(event) {
yunmPageBreak({
rel : rel,
data : {
pageNum : event.data.pageNum
}
});
event.preventDefault();
});
}
},
});
// 翻页的必要参数
var Pager = function(opts) {
this.opts = $.extend({
rel : "", // 用于局部刷新div id号
totalCount : 0,//总数
numPerPage : 10,// 默认显示10个
currentPage : 1,// 当前页
callback : function() {
return false;
}
}, opts);
};
$.extend(Pager.prototype, {
rel : function() {
return this.opts.rel;
},
// 每页显示多少个
numPages : function() {
return Math.ceil(this.opts.totalCount / this.opts.numPerPage);
},
// 当前页
getCurrentPage : function() {
var currentPage = parseInt(this.opts.currentPage);
if (isNaN(currentPage))
return 1;
return currentPage;
},
// 能否向前翻页
hasPrev : function() {
return this.getCurrentPage() > 1;
},
// 向后翻页
hasNext : function() {
return this.getCurrentPage() < this.numPages();
}
});
})(jQuery);
function yunmPageBreak(options) {
var op = $.extend({
rel : "",
data : {
pageNum : "",
},
callback : null
}, options);
if (op.rel) {
var $box = $("#" + op.rel);
// 获得局部刷新的div后,就可以获得同级的form表单
var form = $("form[target=turnPageForm]", $box.parent()).get(0);
if (form) {
// 第几页
if (op.data.pageNum)
form[YUNM.pageInfo.pageNum].value = op.data.pageNum;
$box.ajaxUrl({
type : "POST",
url : $(form).attr("action") + "?rel=" + op.rel,
data : $(form).serializeArray(),
callback : function() {
}
});
}
}
}

三、翻页应用

封装了翻页组件后,我们来看看怎么使用。

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ include file="/components/common/taglib.jsp"%>
<c:forEach items="${deal_page}" var="deal">
${deal.name}
</c:forEach>
<div class="turnPagePager" rel="${param.rel}" totalCount="${vo.totalCount}" numPerPage="${vo.numPerPage}"
currentPage="${vo.pageNum}">

指定div的class为turnPagePager,页面load的时候我们将其转换为pager组件。

将其关键属性rel、totalCount、numPerPage、currentPage进行赋值。

页面load的时候进行转换:

$("div.turnPagePager", $p).each(function() {
var $this = $(this);
$this.pager({
rel : $this.attr("rel"),
totalCount : $this.attr("totalCount"),
numPerPage : $this.attr("numPerPage"),
currentPage : $this.attr("currentPage")
});
});

以上所述是小编给大家介绍的jQuery 翻页组件yunm.pager.js实现div局部刷新的思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js中Image对象以及对其预加载处理示例
Nov 20 Javascript
FF IE浏览器修改标签透明度的方法
Jan 27 Javascript
jQuery数据缓存用法分析
Feb 20 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
Dec 04 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
Oct 10 Javascript
javascript 跨域问题以及解决办法
Jul 17 Javascript
JS实现按钮颜色切换效果
Sep 05 Javascript
swiper 自动图片无限轮播实现代码
May 21 Javascript
vue实现多条件和模糊搜索功能
May 28 Javascript
js如何实现元素曝光上报
Aug 07 Javascript
Vue.js使用axios动态获取response里的data数据操作
Sep 08 Javascript
jQuery多个版本和其他js库冲突的解决方法
Aug 11 #Javascript
JS获取字符串实际长度(包含汉字)的简单方法
Aug 11 #Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
Aug 11 #Javascript
JavaScript性能优化总结之加载与执行
Aug 11 #Javascript
js接收并转化Java中的数组对象的方法
Aug 11 #Javascript
Js调用Java方法并互相传参的简单实例
Aug 11 #Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
Aug 11 #Javascript
You might like
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
分享vim python缩进等一些配置
2018/07/02 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
python config文件的读写操作示例
2019/09/27 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
Java面试笔试题大全
2016/11/23 面试题
毕业设计计划书
2014/01/09 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
市场营销调查计划书
2014/05/02 职场文书
房屋买卖协议样本
2014/11/16 职场文书
党校学习个人总结
2015/02/15 职场文书
自我推荐信格式模板
2015/03/24 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
首都博物馆观后感
2015/06/05 职场文书
pycharm无法安装cv2模块问题
2022/05/20 Python