大体没什么变化,主要是添加了一个方法,getSelectedItems(),返回当前选中的数据项。

(function ($) {
$.fn.GridView = function (setting) {
var _self = this
// 私有变量-展示列表的数量,已选中的数量
var listCount = 0
var selectedCount = 0 // data
_self.sourceData = [] // 随机值,用于标识dom的id
var rand = Math.floor(Math.random() * 1000) // 私有变量-doms
var wrapper = $('<tbody id="tbody' + rand + '"></tbody>')
var cbSelectAll // 配置项-是否显示分页,是否支持多选,table的样式,pager的样式
var isPager = !!setting.isPager
var isMulti = !!setting.isMulti
var listClass = setting.listClass ? setting.listClass : ''
var apiUrl = setting.apiUrl ? setting.apiUrl : ''
var columns = setting.columns ? setting.columns : ''
var value_column = setting.valueColumn || null // 配置项-几个回调函数1、ajax请求前的回调,2、dom渲染完成的回调,3、点击数据行时的回调
var onBeforeSend = (setting.onBeforeSend && $.isFunction(setting.onBeforeSend)) ? setting.onBeforeSend : null
var onError = (setting.onError && $.isFunction(setting.onError)) ? setting.onError : null
var onDataBindComplete = (setting.onDataBindComplete && $.isFunction(setting.onDataBindComplete)) ? setting.onDataBindComplete : null
var onRowClick = (setting.onRowClick && $.isFunction(setting.onRowClick)) ? setting.onRowClick : null
var pager = null // 配置项-1、ajax加载完成,对数据源进行加工的函数,2、ajax请求之前获取查询参数的函数
var sourceConverter = (setting.sourceConverter && $.isFunction(setting.sourceConverter)) ? setting.sourceConverter : null
var searchParamsGetter = (setting.searchParamsGetter && $.isFunction(setting.searchParamsGetter)) ? setting.searchParamsGetter : null // dom事件绑定
function addSingleRowClickEventListener() {
wrapper.on('click', 'tr', function () {
var that = $(this)
if (that.hasClass('selected')) {
that.removeClass('selected')
selectedCount = 0
if (onRowClick) {
var item = _self.sourceData[that.index()]
if (item) onRowClick(item, false)
}
} else {
that.addClass('selected').siblings().removeClass('selected')
selectedCount = 1
if (onRowClick) {
var item = _self.sourceData[that.index()]
if (item) onRowClick(item, true)
}
}
})
} function addMultiRowClickEventListener() {
wrapper.on('click', 'tr', function () {
var that = $(this)
if (that.hasClass('selected')) {
that.removeClass('selected').find(':checkbox').prop('checked', false)
selectedCount--
cbSelectAll.prop('checked', false)
if (onRowClick) {
var item = _self.sourceData[that.index()]
if (item) onRowClick(item, false)
}
} else {
that.addClass('selected').find(':checkbox').prop('checked', true)
selectedCount++
if (selectedCount === listCount) {
cbSelectAll.prop('checked', true)
}
if (onRowClick) {
var item = _self.sourceData[that.index()]
if (item) onRowClick(item, true)
}
}
})
cbSelectAll.on('click', function () {
var that = $(this)
if (that.prop('checked')) {
wrapper.find(':checkbox').prop('checked', true).parent().parent().addClass('selected')
selectedCount = listCount
} else {
wrapper.children('tr').removeClass('selected').find(':checkbox').prop('checked', false)
selectedCount = 0
}
})
} // 初始化控件-构造html等
function init() {
if (!columns) return console.log('未提供数据列')
if (!apiUrl) return console.log('未提供api路径') var table = $('<table' + (listClass ? ' class="' + listClass + '"' : '') + ' id="myGV_' + rand + '"></table>')
var thead = '<thead>'
if (columns) {
if (isMulti) {
thead += '<th class="chk"><input type="checkbox" id="cbAll' + rand + '" /></th>'
} else {
thead += '<th class="no"></th>'
} $.each(columns, function (idx, col) {
thead += '<th>' + col.title + '</th>'
})
thead += '<th></th>'
thead += '</thead>'
}
table.append($(thead))
table.append(wrapper)
_self.append(table)
cbSelectAll = $('#cbAll' + rand)
_self.fun = new Function('data', renderFunString())
if (isMulti) {
addMultiRowClickEventListener()
} else {
addSingleRowClickEventListener()
}
if (isPager) {
pager = new Pager(_self, setting.pageSize || 20)
pager.addEventListener(
function () {
_self.show()
})
}
} // 插入数据
function addRowsToTbody() {
if (_self.sourceData && _self.sourceData.length > 0) {
var html = _self.fun(_self.sourceData)
wrapper.html(html)
} else {
var colCount = columns.length + 2
wrapper.html("<tr class='empty'><td colspan='" + colCount + "'>请求的数据为空</td></tr>")
}
} function getAjaxData() {
var param
if ($.isFunction(searchParamsGetter)) {
param = searchParamsGetter()
}
if (isPager) {
if ($.isArray(param)) { // $("form").serializationArray()
param.push({ 'name': 'pageSize', 'value': pager.pageSize })
param.push({ 'name': 'pageIndex', 'value': pager.pageIndex })
} else if ($.isPlainObject(param)) { // 自定义查询对象
$.extend(true, param, { 'pageSize': pager.pageSize, 'pageIndex': pager.pageIndex })
} else { // $("form").serialization()
param = (param ? param + '&' : '') + 'pageSize=' + pager.pageSize + '&pageIndex=' + pager.pageIndex
}
}
return param || {}
} // 渲染函数
function renderFunString() {
var funString = 'var self = this; var html = ""; $.each(data, function(idx, item) { '
funString += 'html += "<tr>"; html += self.setFirstCol(idx + 1);'
$.each(columns, function (idx, item) {
if (item.func) {
funString += ' html += self.setCol( ' + item.func + '(item), ' + item.width + ', "' + item.cssClass + '", "");'
} else {
funString += ' html += self.setCol( item.' + item.column + ', ' + item.width + ', "' + item.cssClass + '", "");'
}
})
funString += ' html += self.setLastCol(); html += "</tr>" }); return html;'
return funString
} // 渲染第一列
_self.setFirstCol = function (val) {
if (isMulti) {
return '<td class="chk"><input type="checkbox"></td>'
} else {
return '<td class="no">' + val + '</td>'
}
} // 渲染最后一列
_self.setLastCol = function () {
return '<td></td>'
} // 渲染中间列
_self.setCol = function (content, width, cssClass, level) {
var html = '<td'
html += width ? ' style="width:' + width + 'px"' : ''
html += cssClass && cssClass !== 'undefined' ? ' class="' + cssClass + '"' : ''
html += '>' html += content && content !== 'undefined' ? content : ''
html += '</td>'
return html
} function Pager(wrapper, pagesize, cssClass) {
this.pageSize = pagesize || 20
this.pageCount = 0
this.recordCount = 0
this.pageIndex = 1 var pagerDom = $('<div class="pager"></div>')
wrapper.append(pagerDom)
var buttonWrapper = $('<div class="buttons"></div>')
var info = $('<div class="info"></div>')
pagerDom.append(buttonWrapper)
pagerDom.append(info)
var firstBtn = $('<a class="disabled"><i class="fa fa-fast-backward"></i></a>')
buttonWrapper.append(firstBtn)
var prevBtn = $('<a class="disabled"><i class="fa fa-backward"></i></a>')
buttonWrapper.append(prevBtn)
var nextBtn = $('<a class="disabled"><i class="fa fa-forward"></i></a>')
buttonWrapper.append('<b>第</b>')
var currentInput = $('<input value="1" type="text" maxlength="4" />')
buttonWrapper.append(currentInput)
buttonWrapper.append('<b>页</b>')
buttonWrapper.append(nextBtn)
var lastBtn = $('<a class="disabled"><i class="fa fa-fast-forward"></i></a>')
buttonWrapper.append(lastBtn) this.addEventListener = function (fn) {
var that = this
firstBtn.on('click', function () {
if ($(this).hasClass('disabled')) return
that.pageIndex = 1
currentInput.val(that.pageIndex)
fn(that)
})
prevBtn.on('click', function () {
if ($(this).hasClass('disabled')) return
if (that.pageIndex > 1) {
that.pageIndex--
} else {
that.pageIndex = 1
}
currentInput.val(that.pageIndex)
fn(that)
})
nextBtn.on('click', function () {
if ($(this).hasClass('disabled')) return
that.pageIndex++
if (that.pageIndex > that.pageCount) {
that.pageIndex = that.pageCount
}
currentInput.val(that.pageIndex)
fn(that)
})
lastBtn.on('click', function () {
if ($(this).hasClass('disabled')) return
that.pageIndex = that.pageCount
currentInput.val(that.pageIndex)
fn(that)
})
currentInput.on('change', function () {
var v = Number($(this).val())
if (!v || v < 0 || v > that.pageCount) return $(this).val(that.pageIndex)
that.pageIndex = v
currentInput.val(that.pageIndex)
fn(that)
})
} this.setPager = function (total, start) {
this.recordCount = total
this.pageCount = Math.ceil(this.recordCount / this.pageSize)
firstBtn.removeClass('disabled')
prevBtn.removeClass('disabled')
nextBtn.removeClass('disabled')
lastBtn.removeClass('disabled')
if (this.pageIndex === 1) {
firstBtn.addClass('disabled')
prevBtn.addClass('disabled')
}
if (this.pageIndex === this.pageCount) {
nextBtn.addClass('disabled')
lastBtn.addClass('disabled')
}
var msg = '共计' + this.recordCount + '条记录,每页显示' + this.pageSize + '条,共' + this.pageCount + '页,用时' + (new Date().getTime() - start) + '毫秒'
info.html(msg)
}
} // 开放接口-获取选中的数据,如果没有选中项,返回null;如果有选中项,多选,返回项目数组,单选,返回一个数据项
// 获取数据
_self.show = function (index, type) {
if (!apiUrl) {
return
}
_self.sourceData = []
var start = new Date().getTime();
if (!type || type.toLowerCase() !== 'post') {
$.get(apiUrl, getAjaxData(), function (data) {
if (sourceConverter && $.isFunction(sourceConverter)) {
_self.sourceData = sourceConverter(data.body)
} else {
_self.sourceData = data.body
}
addRowsToTbody()
if (isPager) {
pager.setPager(data.totalCount, start)
}
})
} else {
$.post(apiUrl, getAjaxData(), function (data) {
if (sourceConverter && $.isFunction(sourceConverter)) {
_self.sourceData = sourceConverter(data.body)
} else {
_self.sourceData = data.body
}
addRowsToTbody()
if (isPager) {
pager.setPager(data.totalCount, start)
}
})
}
} _self.get = function () {
var start = new Date().getTime();
_self.sourceData = []
listCount = 0
$.ajax({
url: apiUrl,
data: getAjaxData(),
type: 'GET',
contentType: 'JSON',
onBeforeSend: function () {
if (onBeforeSend && $.isFunction(onBeforeSend)) onBeforeSend()
},
success: function (data) {
_self.sourceData = (sourceConverter && $.isFunction(sourceConverter)) ? sourceConverter(data.body) : data.body
addRowsToTbody()
if (isPager) pager.setPager(data.totalCount, start)
if (onDataBindComplete && $.isFunction(onDataBindComplete)) onDataBindComplete()
},
error: function () {
if (onError && $.isFunction(onError)) onError()
}
})
} _self.post = function () {
_self.sourceData = []
var start = new Date().getTime();
listCount = 0
$.ajax({
url: apiUrl,
data: getAjaxData(),
type: 'POST',
contentType: 'JSON',
onBeforeSend: function () {
if (onBeforeSend && $.isFunction(onBeforeSend)) onBeforeSend()
},
success: function (data) {
_self.sourceData = (sourceConverter && $.isFunction(sourceConverter)) ? sourceConverter(data.body) : data.body
addRowsToTbody()
if (isPager) pager.setPager(data.totalCount, start)
if (onDataBindComplete && $.isFunction(onDataBindComplete)) onDataBindComplete()
},
error: function () {
if (onError && $.isFunction(onError)) onError()
}
})
} _self.getSelectedItems = function () {
if (selectedCount === 0) return null
if (isMulti) {
var result = []
$.each(wrapper.children('tr.selected'), function (idx, item) {
result.push(_self.sourceData[$(item).index()])
})
return result
} else {
var idx = wrapper.children('tr.selected').first().index()
return _self.sourceData[idx]
}
} _self.getSelectedId = function () {
var items = _self.getSelectedItems()
if (!items) return null
if (!isMulti) {
if (value_column) {
return items[value_column]
} else {
return null
}
} else {
if (items.length == 0) return null;
if (value_column) {
return items[0][value_column];
} else {
return null;
}
}
} init()
return _self
}
})(jQuery)

自己写的Grid组件,第二版的更多相关文章

  1. tensorflow应用于手写数字识别(第二版)

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data#载入数据集 mnist = inp ...

  2. (转载)持续集成(第二版)[来自:Martin Fowler]

    转载自:iTech的博客 持续集成(第二版) 作者:Martin Fowler 译者:雷镇 持续集成 是一种软件开发实践.在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以 ...

  3. Lucene.net站内搜索—6、站内搜索第二版

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  4. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  5. Python核心编程(第二版)PDF

    Python核心编程(第二版) 目录 第1部分 Python核心第1章 欢迎来到Python世界1.1 什么是Python1.2 起源1.3 特点1.3.1 高级1.3.2 面向对象1.3.3 可升级 ...

  6. 轻量级RPC设计与实现第二版

    在上一个版本中利用netty实现了简单的一对一的RPC,需要手动设置服务地址,限制性较大. 在本文中,利用zookeeper作为服务注册中心,在服务端启动时将本地的服务信息注册到zookeeper中, ...

  7. Vue3语法快速入门以及写一个倒计时组件

    Vue3写一个倒计时组件 vue3 beta版本发布已有一段时间了,文档也大概看了一下,不过对于学一门技术,最好的方法还是实战,于是找了一个比较简单的组件用vue3来实现,参考的是vant的count ...

  8. MySQL管理之道,性能调优,高可用与监控(第二版)pdf下载

    MySQL管理之道,性能调优,高可用与监控(第二版) 书中内容以实战为导向,所有内容均来自于笔者多年实践经验的总结和新知识的拓展,同时也针对运维人员.DBA等相关工作者会遇到的有代表性的疑难问题给出了 ...

  9. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

随机推荐

  1. 英语发音规则---s发/s/的读音规则

    英语发音规则---s发/s/的读音规则 一.总结 一句话总结:字母s的读音有/s/./z/./ʃ/./{/这几种,下面主要讲讲发/s/音的几条规则. 字母s的读音有/s/./z/./ʃ/./{/这几种 ...

  2. mpvue微信小程序分包

    ## 微信小程序分包(mpvue) 使用mpvue分包示例:1.下载vue脚手架(先有node环境,v8.12.0) npm install -g vue-cli 2.先用vue初始化一个mpvue小 ...

  3. 「LuoguP4147」 玉蟾宫(并查集

    题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F ...

  4. 「LuoguP3808」 【模板】AC自动机(简单版)

    题目背景 通过套取数据而直接“打表”过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. ...

  5. codevs 1154 能量项链

    传送门 1154 能量项链 2006年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 在Mars星 ...

  6. 登录加密 md5

    实现账户和密码登录的加密 https://github.com/AndreasPizsa/md5-jkmyers

  7. IO多路复用模型之epoll实现机制

    设想一下如下场景:有100万个客户端同时与一个服务器进程保持着TCP连接.而每一时刻,通常只有几百上千个TCP连接是活跃的(事实上大部分场景都是这种情况).如何实现这样的高并发? 在select/po ...

  8. H264解码器源码(Android 1.6 版)

    H264解码器源码,移植ffmpeg中的H264解码部分到Android,深度删减优化,在模拟器(320x480)中验证通过. 程序的采用jni架构.界面部分,文件读取,视频显示都是用java做的,底 ...

  9. COM组件开发实践(一)

    Preface 因为项目需要,开始从事ActiveX方面的工作,看了一些资料,可惜都是些COM原理方面的,没有切合实际动手的东西,在CodeProject上读完David Marcionek的文章[1 ...

  10. bzoj 3527 [Zjoi2014] 力 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 看了看TJ才推出来式子,还是不够熟练啊: TJ:https://blog.csdn.n ...