自己写的Grid组件,第二版

大体没什么变化,主要是添加了一个方法,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)
时间: 2025-01-23 20:46:07

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

写在《精通比特币》第二版发行之际

一.翻译<精通比特币第二版>的起因 作为一名老IT技术,我自信还是能够抱着非常开放的心态对待新技术新概念的.这从我的技术职业生涯从网络开始,到AIX操作系统,再到数据库以及存储备份,虚拟化,到后期熟悉SEO,网络运营,直到独立运营聚众培训视频网可以得到佐证. 但是不知不觉,技术的发展已经逐渐演变为对三观的触动,质疑甚至是改变的时候,我觉得自己还是像大多数人一样保守. 因为我们从小接受的教育就是把命运寄托给别人,忠实于自己已经选择的道路,不要冒险,听命于制定规则的人. 其实当颠覆性创新来临时,一

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

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ----------------------------------------------------------------分界线------------------------------

python基础学习07(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #file与input output #文件对象 #简单说来,就是写入和读取的方式 #file(),open()2个操作都是一样的,一般推荐open() #语法 # open(name[, mode[, bufferin

【转载】COM 组件设计与应用(五)——用 ATL 写第一个组件

原文:http://vckbase.com/index.php/wv/1215.html 一.前言 1.如果你在使用 vc5.0 及以前的版本,请你升级为 vc6.0 或 vc.net 2003: 2.如果你在使用 vc6.0 (ATL 3.0)请阅读本回内容: 3.如果你在使用 vc.net(ATL 7.0)请阅读下回内容:(当然读读本文内容也不错) 4.这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外,我们再实现一个自己定义的接口 IFun,它有两个函数: Add()完成

【转载】COM 组件设计与应用(六)——用 ATL 写第一个组件

原文:http://vckbase.com/index.php/wv/1216.html 一.前言 1.与 <COM 组件设计与应用(五)>的内容基本一致.但本回讲解的是在 vc.net 2003 下的使用方法,即使你不再使用vc6.0,也请和上一回的内容,参照比对. 2.这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外,我们再实现一个自己定义的接口 IFun,它有两个函数: Add()完成两个数值的加法,Cat()完成两个字符串的连接. 3.下面......好好听讲! 开

《算法竞赛入门经典第二版》 P35 习题2-4 子序列的和(subsequence)

/* <算法竞赛入门经典第二版> P35 习题2-4: 输入两个正整数 n < m < 10^6,输出 (1/n)^2 + 1/(n+1)^2 +……+ 1/m^2,保留5位小数. 输入包含多组数据,结束标志为 m=n=0. 有错欢迎指出^_^ */ #include<stdio.h> int main() { int m,n,i,j=1; while(scanf("%d%d",&m,&n) != EOF) { double sum

阅读《代码大全》(第二版)体会小结

这一次阅读了著名的<代码大全>(第二版).全书虽然章节众多,但是主要就是几个大部分,这些部分我大多有一些浅显的了解但还未深入,当然也有一些全新的体验,例如表驱动法.全书内容丰富而详细,我在阅读的其中问题并不是太多,只不过很多的内容都觉得了解的还太浅,需要更多的实践以及阅读去体会.在这里记录下的也就是一些自己的体会,主要是对书中一些论断的不同看法与讨论,大部分是关于面向对象和结构化设计的内容:以及对于全新接触的表驱动法的学习体会. Question 1: “7.1 创建子程序的正当理由”中,提到

王爽《汇编语言第二版》读后感。

读了王爽的<汇编语言第二版>已经快两个月了,前几章写的都是些好理解的,所以速度稍快,到了中间,需要运用前面所学知识才能消化,所以有些稍慢.中间章节是汇编的语言核心,所以后面几章是汇编语言组织方式(子程序,中断安装等)和编程技巧,最爽的是有大段大段的完整代码展示.如果认真读过,经过中间章节的彷徨,到最后几章略有大功告成之感,速度稍快,跟心情感觉有很大关系.书中每个章节的题目都认真分析了,在网上下载了<王爽<汇编语言>第二版的习题答案>.不说了,虽然理解了书中代码,但一些编

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之8: Chap10: Lighting

这一章讲的是光照.光照(lighting)是Direct3D中非常重要的概念,而与之相对应的是材质(material)的概念.如果没有材质的话,那么光照的作用也无法体现. 在较早一些的关于DirectX 9的编程入门书籍里,一般是使用D3DLIGHT9结构体来建立一个光源,而用D3DMATERIAL9结构体来定义物体的材质.我们要做的就是一些很琐碎的家务活,基本上就是创建这些结构体对象.设定其中的参数.启用光照之类的,至于具体实现的细节就非吾等所需(和所能)操心的了. 不过在我们的"龙书&quo