jQuery数据显示插件整合实现代码


Posted in Javascript onOctober 24, 2011
显示表格数据会涉及到一些东西,如字段显示隐藏,数据状态,分页之类。

由于我们公司的产品涉及到很多的表格数据显示,而且每张表的字段数都很多,在工作过程中(几任同仁的努力),整合出一套自认为较为轻巧的方案。如图:jQuery数据显示插件整合实现代码

其中涉及到的插件主要有:
jQuery.columnmanager.expand.js(扩展columnmanager)
jQuery.dropbox.js(自已写的)
jQuery.pager.expand.js(扩展pager) 
jQuery.cookie.js
 其中pager.expand.js,dropbox.js以及各插件间的整合在common.js里,代码如下:

//定义全局命名空间 
var GLOBAL = {}; 
GLOBAL.Namespace = function(str) { 
var arr = str.split("."), o = GLOBAL; 
for (var i = (arr[0] == 'GLOBAL') ? 1 : 0; i < arr.length; i++) { 
o[arr[i]] = o[arr[i]] || {}; 
o = o[arr[i]]; 
} 
} 
GLOBAL.Namespace("zyh"); 
/* 
****************************************************************** 
jQuery.pager 
****************************************************************** 
*/ 
(function($) { 
$.fn.pager = function(options) { 
var opts = $.extend({}, $.fn.pager.defaults, options); 
return this.each(function() { 
// empty out the destination element and then render out the pager with the supplied options 
$(this).empty().append(renderpager(parseInt(options.pagenumber), parseInt(options.pagecount), options.buttonClickCallback, options.rowcount)); 
// specify correct cursor activity 
//$('.pages li').mouseover(function() { document.body.style.cursor = "pointer"; }).mouseout(function() { document.body.style.cursor = "auto"; }); 
}); 
}; 
// render and return the pager with the supplied options 
function renderpager(pagenumber, pagecount, buttonClickCallback, rowcount) { 
// setup $pager to hold render 
var $pager = $('<ul class="pages"></ul>'); 
// add in the previous and next buttons 
$pager.append(renderButton('|<', pagenumber, pagecount, buttonClickCallback)).append(renderButton('<<', pagenumber, pagecount, buttonClickCallback)); 
// pager currently only handles 10 viewable pages ( could be easily parameterized, maybe in next version ) so handle edge cases 
var startPoint = 1; 
var endPoint = 6; 
if (pagenumber > 3) { 
startPoint = pagenumber - 3; 
endPoint = pagenumber + 3; 
} 
if (endPoint > pagecount) { 
startPoint = pagecount - 5; 
endPoint = pagecount; 
} 
if (startPoint < 1) { 
startPoint = 1; 
} 
// loop thru visible pages and render buttons 
for (var page = startPoint; page <= endPoint; page++) { 
var currentButton = $('<li class="page-number">' + (page) + '</li>'); 
page == pagenumber ? currentButton.addClass('pgCurrent') : currentButton.click(function() { buttonClickCallback(this.firstChild.data); }); 
currentButton.appendTo($pager); 
} 
// render in the next and last buttons before returning the whole rendered control back. 
$pager.append(renderButton('>>', pagenumber, pagecount, buttonClickCallback)).append(renderButton('>|', pagenumber, pagecount, buttonClickCallback)); 
$pager.append('<li class="pgNone">共' + pagecount + "页</li>"); 
// if (rowcount != undefined) { 
// $pager.append('<li class="pgNone">共' + rowcount + "条记录,最多显示600条</li>"); 
// } 
if (rowcount != undefined) { 
$pager.append('<li class="pgText"> ' + rowcount + '条记录 </li>'); 
} 
return $pager; 
} 
// renders and returns a 'specialized' button, ie 'next', 'previous' etc. rather than a page number button 
function renderButton(buttonLabel, pagenumber, pagecount, buttonClickCallback) { 
var $Button = $('<li class="pgNext">' + buttonLabel + '</li>'); 
var destPage = 1; 
// work out destination page for required button type 
switch (buttonLabel) { 
case "|<": 
destPage = 1; 
break; 
case "<<": 
destPage = pagenumber - 1; 
break; 
case ">>": 
destPage = pagenumber + 1; 
break; 
case ">|": 
destPage = pagecount; 
break; 
} 
// disable and 'grey' out buttons if not needed. 
if (buttonLabel == "|<" || buttonLabel == "<<") { 
pagenumber <= 1 ? $Button.addClass('pgEmpty') : $Button.click(function() { buttonClickCallback(destPage); }); 
} 
else { 
pagenumber >= pagecount ? $Button.addClass('pgEmpty') : $Button.click(function() { buttonClickCallback(destPage); }); 
} 
return $Button; 
} 
// pager defaults. hardly worth bothering with in this case but used as placeholder for expansion in the next version 
$.fn.pager.defaults = { 
pagenumber: 1, 
pagecount: 1 
}; 
})(jQuery); 
/* 
================================================================ 
//组件功能:鼠标移上指定目标弹出下拉框 -- by flowerszhong 
//参数说明: 
//target:事件对象Id 
//box:下拉框Id 
//left:以事件对象最上的坐标左偏移量,默认为0; 
//top:以事件对象最上的坐标上偏移量,默认为事件对象的高度 
//overClass:当前状态表格行保持高亮样式 
//on:弹出框是否有箭头 
//arrow:自动调节的指向箭头 
================================================================ 
*/ 
var dropbox = function(target, box, left, top, overClass, on, hasArrow) { 
var obj, b, p; 
if (typeof target == "object") 
obj = $(target); 
else 
obj = $("#" + target); 
if (typeof box == "object") 
b = $(box); 
else 
b = $("#" + box); 
p = obj.parent(); 
if (top == "undefined") top = obj.height(); 
var defaults = { 
l: left || 0, 
t: top || 0, 
overClass: overClass || "", 
on: on || "", 
hasArrow: hasArrow || "" 
}, 
offset = obj.offset(), 
w = $(window).height(), 
selectSet = function(flag) { 
//在IE6中,防止select控件遮罩下拉框 
if ($.browser.msie && $.browser.version == "6.0") { 
if (flag) { 
$("select").css("visibility", "visible"); 
} else { 
$("select").css("visibility", "hidden"); 
} 
} 
}; 
$(window).resize(function() { 
w = $(window).height(); 
offset = obj.offset(); 
}); 
$("#arrow").click(function() { 
offset = obj.offset(); 
}); 
//绑定mouseover事件 
obj.bind("mouseover", function() { 
var diff, arrow, scrollTop; 
scrollTop = $(window).scrollTop(); 
diff = w - (offset.top - scrollTop); 
if (on && diff < 145) { 
var subTop = 145 - diff; 
b.css({ "display": "block", "left": offset.left + defaults.l + "px", "top": offset.top + defaults.t - subTop + "px" }); 
if (hasArrow) { 
arrow = b.children("div")[0]; 
var arrTop = 35 + subTop; 
$(arrow).css("top", arrTop); 
} 
} else { 
b.css({ "display": "block", "left": offset.left + defaults.l + "px", "top": offset.top + defaults.t + "px" }); 
if (hasArrow) { 
arrow = b.children("div")[0]; 
$(arrow).css("top", "35px"); 
} 
} 
b.bind("mouseover", function(event) { 
$(this).show(); 
selectSet(false); 
if (overClass) { p.addClass(overClass); } 
event.stopPropagation(); //阻止事件冒泡 
}); 
b.bind("mouseout", function(event) { 
$(this).hide(); 
selectSet(true); 
if (overClass) { p.removeClass(overClass); } 
event.stopPropagation(); //阻止事件冒泡 
}); 
if (overClass) { p.addClass(overClass); } 
selectSet(false); 
}); 
//绑定mouseout事件 
obj.bind("mouseout", function() { 
b.css("display", "none"); 
selectSet(true); 
if (overClass) { p.removeClass(overClass); } 
}); 
//debugger; 
}; 
GLOBAL.zyh.dropbox = dropbox; 
/* 
================================================================ 
//功能:Toggle Column 表格自定义列通用方法,基于jquery.columnmanager组件,GLOBAL.zyh.dropbox组件 
//参数说明: 
//targetTable:表格Id 
//columnManagerArgument:jquery.columnmanager需要参数 
//btnSetColumn: 
//targetfive: 
//left: 0 
//top: 0 
================================================================ 
*/ 
GLOBAL.zyh.toggleTableColumn = function(options) { 
var defaults = { 
targetTable: '', 
columnManagerArgument: {}, 
btnSetColumn: '', 
targetfive: '', 
left: 0, 
top: 0 
} 
var settings = $.extend({}, defaults, options); 
$('#' + settings.targetTable).columnManager(settings.columnManagerArgument); 
GLOBAL.zyh.dropbox(settings.btnSetColumn, settings.targetfive, settings.left, settings.top); 
}
Javascript 相关文章推荐
基于jquery扩展漂亮的CheckBox(自己编写)
Nov 19 Javascript
JavaScript跨平台的开源框架NativeScript
Mar 24 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
Mar 26 Javascript
浅谈javascript中onbeforeunload与onunload事件
Dec 10 Javascript
jquery根据一个值来选中select下的option实例代码
Aug 29 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
Nov 12 Javascript
webpack搭建vue 项目的步骤
Dec 27 Javascript
vue脚手架及vue-router基本使用
Apr 09 Javascript
在vue项目中引用Iview的方法
Sep 14 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
Jul 04 jQuery
浅谈js中的attributes和Attribute的用法与区别
Jul 16 Javascript
Vue项目打包编译优化方案
Sep 16 Javascript
基于jquery跨浏览器显示的file上传控件
Oct 24 #Javascript
firefox下input type=&quot;file&quot;的size是多大
Oct 24 #Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
Oct 24 #Javascript
editable.js 基于jquery的表格的编辑插件
Oct 24 #Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
Oct 24 #Javascript
css值转换成数值请抛弃parseInt
Oct 24 #Javascript
更优雅的事件触发兼容
Oct 24 #Javascript
You might like
php的字符串用法小结
2010/06/08 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
奇妙的js
2007/09/24 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
python3 求约数的实例
2019/12/05 Python
PyTorch的SoftMax交叉熵损失和梯度用法
2020/01/15 Python
python 如何快速复制序列
2020/09/07 Python
Python常用断言函数实例汇总
2020/11/30 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
解释i节点在文件系统中的作用
2013/11/26 面试题
大学生学年自我鉴定
2014/02/10 职场文书
遗产继承公证书
2014/04/09 职场文书
转学证明范本
2015/06/19 职场文书
网络舆情信息简报
2015/07/21 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
中学音乐课教学反思
2016/02/18 职场文书
解除租赁合同协议书
2016/03/21 职场文书