怎么走上天台(短篇小说)

接触mvc不久,突然没有了viewstate和服务端控件处处皆以为不顺手,很多在webform时不必要考虑的题目都出现在头里,这之中分页时查询条件保障的题材又是最让自己胸口痛的事体,权衡再三,决定用ajax局部刷新列表的情势来缓解这些问题。网上基于jquery的grid组件很多,jquerygrid,jqgrid等等,分别试用了一晃,功效实在不行强劲,但觉得上有点重,配置项太多,用起来仍旧感到束手束脚,所以想来想去,如故用最笨的主意自己做了一个组件,很简陋,唯一的功利就是灵活,容易修改和决定。

=

没图没本质,先来个截图看看:

您是第一次捡到钱包,就在母校北门进门左拐的那条小道上,就在拖着箱子到这的率先天。里面的钱不多,导致你已经想要占为己有,你可不是什么高尚的人。不过你翻了翻钱包,又废弃了这个想法,你看来了这张成绩条,下面印着他的名字。其实你也不认识她,只然而在上次来复试的时候在公示信息栏上看出过这多少个名字。

您拖着箱子、气喘吁吁地赶来宿舍的时候,里面已经有了一个人,他热情地接过您手中的行李,你们便攀谈起来。于是你得知,对面这人和您是一个高校的同校,早在暑假的时候就被讲师叫到该校开端工作。你考虑他到这五个多月,也称得上是老油条了,便向他晃了晃手中的钱包,打听它主人的事。

“我清楚有如此个人,是大家这届的同室,”他说道。

“长什么样,雅观啊?”你笑着问。

“没见过,我只通晓有诸如此类个人,”他说,“然而······”

“然而怎么着?”

“我在大课题组群里见过他qq号,我发给你。”

您就如此得到了她的qq,但她并不曾立刻加你。一向到夜晚十点、你都快要上床休息时,她才同意了您的相知申请,她问你是何人,你便把工作一五一十说了。她也没立马回你,过了好一阵子,她才说:“谢谢你,今日悠闲吗?假使有空麻烦你下午11:00事先帮自己送到实验楼1205办公室进门左拐第二张桌子上。”你回了一句“好的”,对话便截止了。

第二天深夜你如期而至,但并未观看他。你问一旁的人,答曰:“预计在实验室忙呢。”你便把钱包放在他桌上,然后给她发了条音信,她回了一句“好的,谢谢您”就没了下文。

早晨躺在床上,你热得睡不着,玩起手机来。你点进她的qq空间,却发现自己没有权力访问。一连几天,你每一天点进去,看到的仍旧是“主人设置了权力”这三个字。你心中嘀咕这人也太不懂礼貌了呢,帮她找回了钱包,就简简单单一句谢谢,而且连人面都没见着,不说要千恩万谢,给个访问空间的权能总是能够的呢?

“太不会做人了!”你放出手机倒头继续睡了起来。

您就在这第一堂课上来看了她,也不是什么样机缘啊、邂逅啊,总归是要相会的,毕竟是同一个届、同一个业内的。你对新东西总有一种好奇心,所以一坐、进去,就起始打量着体育场馆里的男男女女。她就坐在那最后边的一排,长得是一副娃娃脸,齐刘海,梳着一个马尾辫,看上去没有特意赏心悦目的地方,但这长相、这身段倒也算得上迷人,很简朴。可是体育场馆里比他窘迫的有某些个,你也就没再特别地专注她。甚至你都不通晓他就是腰包的所有者,因为你坐在前面,点名的时候不佳往身后一个个地看。

过了很久你才把他的长相和名字对上号,这时你便不再认为他可爱。准确地说他的外形是喜人的,但她这个人——用你的话来讲——太不会做人了。

到此处也有些日子了,但你和她平昔没有说过话,这不奇怪,班里并不是所有人都熟,我们平日也是各忙各的。有天早晨你从办公室出来,按了电梯在那边等。她从走廊另一头过来,脚步声惊动了您,你抬眼看了看原来是他。你以为她脸熟,她看你估量也脸熟,但脸熟并从未让你们互动打一声招呼。她和你对视了一眼,便转头望着别处。你不知底他的想法,也不想知道,于是故作冷漠地埋下头继续玩你的无绳电话机。很快电梯到了,你便把手机收进裤兜。里面就你们俩人,她站在电梯前部的角落,你站在她对角线上的角落。你就站在那边打量着他,只能看看侧脸,她没什么表情,就这样默默地注视着前方。你也是个冷漠的人——正所谓道不同不相为谋——她的这股冷漠劲突然打动了您的心。

你逐步地从头关注起他来。这小鼻子小嘴的,很适合东方人的审美;身高比大部分女子稍高一些,身材则不胖不瘦,很正规;发型永远是这样,甚至都没去烫过;偶尔穿一两件相比流行的衣裳,但多数时候打扮得都挺普通的,你最欢喜看他穿着那身纯色的背心,配上她的紧身裤和帆布鞋。

就如此一年多仙逝了,你已经不再讨厌他,但从这次在电梯相遇后,你们会面时也依旧没有说过一句话。说实话,你早就有些爱不释手上她了,这从你后边好多次见他时的眸子里就能收看,你总是喜欢接近不在意地凝望着他。你也欢喜装作不小心的跟别人打听他,发轫,你以为像这么姿色还足以,而且看上去乖乖的女人,应该很招人疼,大概已经有男朋友了,可后来您听人说不是这般的,她依旧单身,因为她今后想考学士,现在专心都扑在求学上,没有搞任何东西的动机。你感到有点好笑,但也很欣慰。

转机出现在新兴四遍快放假的时候,她当年必须得把名师的职责完成了才能回家过年,但人员不够,课题组的其他同学也差不多很快就要回家。有个对象在闲聊时问你哪些时候走,你说您放假了想先在学堂这边玩耍,买的是八月二十七的机票。朋友便对您说起此事,还问您愿不愿意去帮衬,你则装出有点勉强的态势答应了下来。期盼的这天很快就来到了。其实你去援助的目标并不是想和他暴发点什么,只是她这样子,这神态,这份气场对您有种吸重力,何人会拒绝和这样的人待在共同吗?于是你走进他的实验室,你好哎?她没有立时答应,愣了须臾间,有一对矜持,随后点了一晃头,把你请进了房间。在您所在打量之际,她报了一堆材料来,逐个向你坦白工作的流程和注意事项,你嗯哦的应着,有些心神不定,但她接近没有发觉。她做起事来很认真,脸上没有太多表情,但也并不出示冷淡。每当你有记不住的东西向她提问时,她连续很耐心的解答,没有显得出一丁点的浮躁。你逐步地才发现她也是个温柔的人,你讲笑话时他也会笑。

你们总是忙到很晚。去吃夜宵吗?有一天你对她说。好啊,她用手拂了拂耳边的毛发,并且回答着您。你笑了,她也笑了。饭桌上一连要说点什么的,你们聊起很多作业:童年、家庭、学校,她谈话的时候脸上总挂着温情的笑脸,但这笑容毫不扭捏,这幅模样儿对你的心来说就像是酒精一样使人如醉如狂。

“你是什么地方人?”你问他。

“我家是广东的。”

“江西?四川什么地方?”

“三明,怎么?你去过陕西吧?”

“我也是河北的啊,我家在漳州。”

你们的共同语言便又多了一层,心灵上的距离感也在日趋变小。从那将来每晚你都会送她回宿舍,路上总是走得很慢,你也不通晓是因为你走得慢如故她走得慢。有一天夜晚在回来的路上,你突然想起来问她准备如何时候回家。

“我买了29号的机票,”她说道。

“29号是旧历什么日子?”

她看了看手机,“六月二十。”

“要不改签吧,”你有点半戏谑的说,“改到跟自己同一天的可怜航班,我是五月二十七飞普埃布拉。”

“为啥要本人改签?”她用一副天真无邪的表情盯着您。

“为了自身?”她离你很近,近到动一入手便可以碰着对方,你居然足以感觉到他的人工呼吸和心跳,正是这种田地、这种感觉让您敢于说出这话。她从未即时接招,只是冲你笑了笑,这是一种内敛的笑,你看得出来不是贻笑大方、也不是假笑,但你也说不清那笑是咋样意思。你们很快到了宿舍楼下,就在这边分路扬镳。你觉得自己说错了话,这事没戏了,但不一会儿,她在微信上给你发信息问你的航班号,又过了一会儿,她把改签过的航班音讯截图发给了你。你简直有点喜不自胜,在床上打起滚来,惹得旁边的舍友关切地问你是不是肚子疼。

业务也是刚刚,你和他在飞行器上的位子是挨着的,都不用去麻烦别人换位。你便抓住这一点和他大谈特谈缘分,但你们俩张嘴都很别扭,就像是古人作诗这样,云山雾罩。你们聊了联合,无奈这飞机太快,多个时辰对您和他来说就像手机开机关机那么快。在机场分其余时候,你感觉到到他多少依依不舍。

你们就这样各自拖着行李看着对方,于是你便先开了口,“抱一下吗?这都要分头了。”

他有某些娇羞,但要么笑了。你便不等她答应,走上去抱住他,你的动作很慢很轻,也不出示粗鲁,由此并无外人盯着你们看。她迟迟地把头靠在您肩上,什么话也没说。过了片刻,你尝试着在他脸颊上亲了一下,她也尚无抗拒。

你觉得是时候了,“我听说您不谈恋爱的?”

“嗯。”

“做自己女对象可以还是不可以。”

“嗯。”

你毕竟也发自内心地笑了。

图片 1

我不愿意和异性知己!因为自身心中一直就有那么一个结!有时候它逼得我接近要喘可是气来,我不得不试着转移自己的注意力,我把方方面面精力都投入到上学中去,百分之一百的心无旁骛,我没法不这么做,因为自己假诺有一刻闲下去,就会记念它,一想起它,我就有一种想要拼命抽打自己的激动,我认为自己很坏、很差劲、不配享受此外东西。

自身去看过心情医务卫生人员,被确诊为失眠。医务人员给自己开了药,并叮嘱我必然要如期吃,但自身并从未照做,因为药物会使自己不能集中注意力、不可能悉心读书,我前几日除外读书还有如何吧?什么也从不了!由此我自作主张断了药。你早晚无法清楚我的惨痛,这种心灵上的惨痛甚至要甚于皮肉之苦,不信?我手臂内侧的口子能够表达一切,过去自己常拿一些利物伤害自己,这样可以让我临时忘记心中的噩梦,假如你能体验到自我的百分之一的感想,就决然能领会自己干吗没法不这样做。

自身未曾想过要自杀。我认可自己想开过这个定义,但从不曾要去实践。遗弃生命对本人的话是不容许的,我以为没有人可以很容易地丢弃生命,即便是像本人这么的人。我们活着、所做的满贯事,我们天天吃饭睡觉、大家和人交往、我们做事、我们在那个星球上滋生生息,难道不就是为了生命可以更好地持续呢?我是纯属不肯丢弃生命的——即使本人心中的惨痛每日都在折磨着我。

这天我收下她好友验证音信之后看了看他的qq资料,是个男的。我说过自己不甘于和异性知己,因而我对他的回复很冷淡,即使她是个热心肠,捡到了自身的钱包要还给自身。我的确没法不这样做,我一想到要和一个异性面对面沟通,心中的梦魇就又卷土重来,一股羞耻感会把自己包裹住,把自己花了很长日子平静下来的心再度搅动起来,所以自己很无所谓地对她说把我的钱包放在自家办公室的案子上。我不想和异性有太多交集,假使他当着还给自身,出于礼貌我是不是得对她意味着相当的感谢?我是不是还得请他用餐?我是不是还得在饭桌上和他聊天,为了不冷场拼命地想出话题?我不愿意做这多少个工作!我自家就是个冰冷的人,再加上自身的可怜心结,让自身和异性呆在一齐就像在把我凌迟。

有几回我深感到他在看自己,这也使自己痛苦,是的,单单是异性的体贴就能够使自身痛苦,我把头扎进被子里想要忘记这个工作,但至极难,人更加不甘于去想什么,那多少个想法就越会往脑袋里钻!更可怕的是那种向自身脑袋里钻的东西依旧使自己逐步地起初关心起她来,没有任谁可以发现,因为我老是小心翼翼,因为自己觉得单是令人清楚自己有那个想法就足以使自身无地自容地无地自容,我不甘于让任何人知道。我记得《傲慢与偏见》里夏洛蒂(Charlotte)曾经有过一番谈谈,大意是说假设一个妇女在她热爱的男子面前极力地覆盖自己的心意,那么她也就具有失去了获取他的心的空子。我晓得我永远也不容许获取她的心,因为他看起来很冷漠,甚至他在看本身时总让自身觉着盛气凌人。但对本身来说得不到相反是最好的,得到了会使自己无地自容得想杀了上下一心。

但是爱情仍旧来了,放寒假的时候自己急需人来实验室协理,我的一个情侣找了他来,即便我不甘于和异性相处,可是这时候高校里早就找不到人家了,况且人家来匡助,我哪有理由往外赶?我只能在心里默默地祈愿我的那个坏想法不要在自身工作的时候折磨我。

在实验室刚先河和她相处的光阴里,我老是要时时刻刻地面对自己的心魔,我一连装出一副不食人间烟火的旗帜,一丝不苟地劳作。然而人到底是有情义的动物啊!每一日和她在一块儿工作、互换,使自己渐渐地在自己的心堤上决了一个口,我的情丝就从这伤口处向外流。我感觉得到我和她在日益靠近,我感觉得到他的意在,可是我接连在拷问自己,我实在可以面对她呢?他会接受我呢?我觉得自身还不曾未雨绸缪好,因而我也就发乎情止乎礼,并从未过于笼统的行径。

这天她要自我改签机票,和他坐同一个航班回家,我问他怎么?理由吧?“为了自身。”我不明白该怎么回答她,那就像是最后通牒一样,不过我向来未曾做好准备迎接它,我只好对她笑笑。我觉着我的心坎有宏伟在打架,我认为自己不配享受爱情,爱情会让自家感觉羞愧,不过在这么些生活的相处中,我只好认可自身的心和他的心被绑在一齐了,我该如何做?我不知晓,我用手用力敲打着脑袋,最后自己控制要和千古做一个了断,人总是要向前走的。

于是乎我真正改签了航班,飞机上大家也相谈甚欢,后来在航站分此外时候,他还指出要抱一下自身。当自己把头靠在她肩上的时候,我以为天旋地转,好像过去的全套都尚未发出过,我只以为很甜美,这种感觉我一度很久没有经验过了。

而是具有的幸福感都是不久的,在大家从机场挥手告别之后,那种耻辱感,这种使自己心疼的能力又向自己袭来,整个过年期间我都在和它做着加油。每当自己记念这段心理中幸福的点滴,这种黑暗的力量就会致命地砸在自身的心里,我的切肤之痛似乎被他意识到了,他在对讲机里问我是不是碰到了怎么事,我默然了很久,最后如故控制说出这句话:“我内心确实有事,等我们都回母校,大家再聊好啊?我想把工作对你说了然。”

这天依然在这间实验室里,我把门关上,他就坐在我的先头。我的心早已像一锅开水了,我备感自我无时无刻都可能昏倒,我不晓得他会咋样,或许她会接受自己?我实在不清楚,不过本人登时就要开口了,我认为很冷,手不住地打哆嗦。

“你把电脑打开,”我说。

他按自己的指令做了。似乎是因为发现到工作并不简单,他沉默着,什么也没说。

我在浏览器输入那些让我痛苦一生的网址,咬着牙、但还要又镇定地对她说:“你看看啊。”

浏览器的画面上有一对赤身裸体的子女在交织着,我强迫着祥和看着它,不过我无能为力形成,我的眼皮就像有千钧之力一样覆盖住我的眼睛。我就那么站在这边,听不到祥和的哭声,不过感觉拿到眼泪不住地往下流。尽管自己的肉眼闭上了,可是这画面在本人脑公里清晰的老大,因为我一度看过一千零五遍了!况且这录像的声息还在不断地撞击着自家,不错,这是自我声音,我每听到一声,就像心被人割了一刀。

她站起来,又坐下。他的手无意义地搓弄着鼠标,我听得见他沉重的呼吸声。他最后仍旧向我问话了,“这是你?”

自家再几回闭上了眼,感受拿到眼泪仍旧在往下流,“嗯。”

“那多少个男人是什么人?”

“我的前男友,视频是自我上大一时拍的。”

“自愿的?”

“自愿的。”我此时倒没有要昏倒的觉得了,不过他坐着,我站着,那让自己备感到自己像是在被讯问,我受持续这种感觉,于是我用手扶着椅背,缓缓地坐下。

他抽出一丝冷笑,“我还觉得你是个天真的天使,你明白啊?”

“我领会。”我很惊叹自己甚至会作出回应,我甚至没有感觉得到我透露的这句话。

“前日的事本身不会告诉旁人,然而我们未来也毫无有其他交集了,就当没认识过呢。”他说完,推开门走了。

自我坐在这里,回想着这所有,感到有一种不真实感,但这整个都着实暴发了:年少无知时候录下的性爱视频,分手之后被放上了网络;我私下地在网上检索自己的名字和院校,惊喜地意识并不曾痕迹;高中同学发来一个链接并问我“这是您呢”;经历一番折磨后再行振作,并向外人撒谎说自己只想学学不想找男朋友,以此来逃避现实;以及前几天和她的事。这一切都心心念念,我以为自家的社会风气塌了下去。我太痛苦了,比往日的悲苦更胜一筹,他击碎了自我的奇想,我想用“他并不爱自我,只是在意我的肉身”来慰藉自己,不过屈辱感使自己歇斯底里地大哭起来,不能安然。

性爱是本身的义务,不应当遭到别人的非议,然而实际就是如此残酷,它戴上钢铁的面具,举着剑向自己扑来,我却绝不还手之力。我说过我会热爱生命,绝不轻言摈弃生命,但这时自己甚至走上了这天台,丝毫尚无迷途知返的打算。

功能:

  1. 指定url,协理post或get情势加载数据
  2. 自定义数据查询条件
  3. 列定义时可以对数据项进行简短的转换处理。如:数据源[{ “name”:
    “张三”,  “age”: 12, “sex”: 1 }],渲染时梦想把sex的值 1 显示为 男性
  4. 支撑多选
  5. 辅助分页
  6. 点击行时自动选中,多选时,点击checkbox举行选中和撤回选中
  7. 可知回到选中项目的值,多选时回来选中值的数组

按照个体的习惯和对效果的表明,定义了这般一个setting:

var list = $('#list').GridView({
            'apiUrl': '/Student/List',  // 指定数据请求的URL路径
            'apiType': 'post',  // 请求的方式
            'columns': [    // 要显示的列,title对应表头,column对应数据项的属性名称,width指定列的宽度,func指定绑定时调用的函数名称
                { title: '姓名', column: 'Name', width: 160 },
                { title: '年龄', column: 'Age' },
                { title: '性别', column: 'Sex', width: 100, 'func': 'convertToSex' }
            ],
            'valueColumn': 'StudentId', // data-value 取值的属性名
            'pageSize': 20, // 每页显示的数量
            'isMultiy': false,  // 是否支持多选
            'isTreeView': false,   // 是否支持树形
            'pager': 'pager',   // 指定包含分页的divid,主要是为了能单独控制pager中的一些数据,把pager给拆出来了,后来发现似乎用处不大
            'onRowClick': function(id) { }, // 当数据行被点击时执行的回调,参数是tr中的data-value
            'convertSource': function (data) { return data.body; }, // 使用数据源之前对数据进行转换。因为我的api返回的都是{ code: 200, body: [] }这种类型,需要在这里直接返回body
            'onDataBindComplete': function() {}, // 当数据加载完成,也就是列表渲染完成后的回调。比如说提醒用户加载完成之类的
            'getSearchData': function() { return $('#form1').serialize(); },    // 获取查询参数,这个很重要,想了很多办法,最终采用了这种方案,在查询前运行这个函数,将返回值作为ajax的查询参数
            'listCssClass': 'table',    // 列表table的样式名
            'pagerCssClass': 'pager',   // 分页最外面div的样式名
            'beforeSend': function() { }    // ajax请求之前调用的函数,原本是为了提醒一下加载已开始,请稍后之类的,现在没怎么用到
        });

OK,接下去就是那一个扩充的求实实现了,代码很多,但思路很简短,主要就是代码的拼凑。我们自己看吗!

(function ($) {

    $.fn.GridView = function (settings) {
        // 系统变量
        var self = this;
        self.selected = [];
        var pageindex = 1, pageSize = 20;

        if (settings.pageSize && $.isNumeric(settings.pageSize) && settings.pageSize > 0) {
            pageSize = settings.pageSize;
        }

        var rand = Math.floor(Math.random() * 1000);
        var table = $("<table" + (settings.listCssClass ? " class='" + settings.listCssClass + "'" : "") + " id='myList" + rand + "'></table>");

        var colgroup = colgroup2 = "<colgroup>"
        $.each(settings.columns, function (idx, item) {
            colgroup += "<col" + item.width ? " style='width:" + item.width + "px;'" : "" + ">";
            colgroup2 += "<col" + item.width ? " style='width:" + item.width + "px;'" : "" + ">";
        });
        colgroup += "<col style='width:18px;'></col>";
        colgroup += "</colgroup>";
        colgroup2 += "</colgroup>";
        var table = $("<table" + (settings.listCssClass ? " class='" + settings.listCssClass + "'" : "") + " id='myList" + rand + "'></table>");

        var pagerHtml = '<div' + (!settings.pagerCssClass ? '' : ' class="' + settings.pagerCssClass + '"') + '>';
        //var pagerHtml = '';
        pagerHtml += '<a class="disabled" id="first' + rand + '"><i class="fa fa-fast-backward"></i></a>';
        pagerHtml += '<a class="disabled" id="prev' + rand + '"><i class="fa fa-backward"></i></a>';
        pagerHtml += '<div class="pager-index"><b>第</b><input value="1" type="text" maxlength="4" id="index' + rand + '"><b>页</b></div>';
        pagerHtml += '<a class="disabled" id="next' + rand + '"><i class="fa fa-forward"></i></a>';
        pagerHtml += '<a class="disabled" id="last' + rand + '"><i class="fa fa-fast-forward"></i></a>';
        pagerHtml += '<div class="pager-info2"> 共计 0 条记录,';
        pagerHtml += '每页显示 ' + pageSize + ' 条,';
        pagerHtml += '共 1 页,';
        pagerHtml += '用时 0毫秒';
        pagerHtml += "</div></div>";
        var pagerDom = $(pagerHtml);
        var firstButton, prevButton, nextButton, lastButton, currentSpan, pageSizeSpan, totalCountSpan, totalPagesSpan, loadTimeSpan;

        // 临时变量
        var tbody, pager, cbAll, checkboxes, isPager = false, totalPage = 1;

        // 创建table
        self.append(table);

        // 创建thead
        addChildrenToTable();

        // 为tbody赋值
        tbody = $("#tbody" + rand);

        var colCount = settings.columns.length + 2;
        tbody.html("<tr class='empty'><td colspan='" + colCount + "'>等待加载数据...</td></tr>");

        // 创建分页
        if (settings.pager && $("#" + settings.pager)[0]) {
            pager = $("#" + settings.pager);
            isPager = true;
            pager.append(pagerDom);
            setPagerButtonEvent();
        }

        // 创建渲染函数
        self.fun = new Function("data", renderFunString());

        // 渲染第一列
        self.setFirstCol = function (val) {
            if (settings.isMulti) {
                return "<td class='chk'><input type='checkbox' id='cb" + val + "' value='" + val + "'></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 += ">";
            if (settings.isTreeView) {
                html += level ? "" + (level > 0 ? "|—" : "") + "" : "";
            }
            html += content && content != "undefined" ? content : "";
            html += "</td>";
            return html;
        }

        // 显示指定页码的数据
        self.show = function (index, type) {
            self.selected = [];
            if (!settings.apiUrl) {
                return;
            }

            if (!type || type.toLowerCase() != "post") {
                $.get(settings.apiUrl, getAjaxData(), function (data) {
                    var source = [];
                    if (settings.convertSource && $.isFunction(settings.convertSource)) {
                        source = settings.convertSource(data);
                    } else {
                        source = data;
                    }
                    addRowsToTbody(source);
                });
            } else {
                $.post(settings.apiUrl, getAjaxData(), function (data) {
                    var source = [];
                    if (settings.convertSource && $.isFunction(settings.convertSource)) {
                        source = settings.convertSource(data);
                    } else {
                        source = data;
                    }
                    addRowsToTbody(source);
                });
            }
        };

        // 获取选中的ID
        self.getSelectedId = function () {
            if (self.selected.length == 0) {
                return null;
            } else {
                return self.selected[0];
            }
        };

        self.getSelectedIds = function () {
            return self.selected;
        };

        self.clear = function () {
            self.selected = [];
            $("tr", "#myList" + rand).removeClass("selected");
            $(":checkbox", "#myList" + rand).prop("checked", false);
        };

        // 为table内的元素绑定事件
        tbody.on("click", "tr", function () {
            if ($(this).hasClass("empty")) return;
            $("tr", tbody).removeClass("selected").find(":checkbox").prop("checked", false);
            $(this).addClass("selected").find(":checkbox").prop("checked", true);
            $("#cbAll" + rand).prop("checked", false);
            self.selected = [$(this).data("value")];
        });

        // 绑定复选框点击事件
        if (settings.isMulti) {
            cbAll = $("#cbAll" + rand);

            cbAll.on("click", function () {
                if (!checkboxes) checkboxes = $(":checkbox", tbody);

                if ($(this).prop("checked")) {
                    self.selected = [];

                    $.each(checkboxes, function (idx, item) {
                        $(this).prop("checked", true);
                        self.selected.push($(this).val());

                        var tr = $("#tr" + $(item).val());
                        if (!tr.hasClass("selected")) tr.addClass("selected");
                    });
                } else {
                    checkboxes.prop("checked", false);
                    $("tr", tbody).removeClass("selected");
                    self.selected = [];
                }
            });

            tbody.on("click", ":checkbox", function (event) {
                event.stopPropagation();

                if ($(this).prop("checked")) {
                    $("#tr" + $(this).val()).addClass("selected");
                } else {
                    $("#tr" + $(this).val()).removeClass("selected");
                }
                if (!checkboxes) {
                    checkboxes = $(":checkbox", tbody);
                }

                self.selected = [];

                var unCheckedCount = 0;

                $.each(checkboxes, function () {
                    if ($(this).prop("checked")) {
                        self.selected.push($(this).val());
                    } else {
                        unCheckedCount++;
                    }
                });

                if (unCheckedCount > 0) {
                    cbAll.prop("checked", false);
                } else {
                    cbAll.prop("checked", true);
                }
            });
        }

        // 返回渲染函数的程序体
        function renderFunString() {
            var funString = "var self = this; var html = ''; $.each(data, function(idx, item) { var val = ";
            funString += (settings.valueColumn ? "item." + settings.valueColumn : "idx");
            funString += "; html += '<tr id=\"tr' + val + '\" data-value=\"' + val + '\">'; html += self.setFirstCol(val);";
            var level = null;
            if (settings.levelColumn) {
                level = settings.levelColumn;
            }
            $.each(settings.columns, function (idx, item) {
                if (item.func) {
                    funString += " html += self.setCol( " + item.func + "(item), " + item.width + ", '" + item.cssClass + "'" + (level ? " , item." + level : "") + " );";
                } else {
                    funString += " html += self.setCol( item." + item.column + ", " + item.width + ", '" + item.cssClass + "'" + (level ? " , item." + level : "") + " );";
                }
            });
            funString += " html += self.setLastCol(); html += '</tr>'; idx++; }); return html;";
            return funString;
        }

        // 将数据生成html,并插入到tbody中
        function addRowsToTbody(data) {
            if (data && data.body && data.body.length > 0) {
                var html = self.fun(data.body);
                tbody.html(html);

                if (isPager) {
                    setPagerButton(pageSize, pageindex, data.totalCount, new Date().getTime());
                }
            } else {
                var colCount = settings.columns.length + 2;
                tbody.html("<tr class='empty'><td colspan='" + colCount + "'>请求的数据为空</td></tr>");
            }
        }

        // 创建table
        function addChildrenToTable() {
            var body = "<thead>"
            if (settings.columns) {
                if (settings.isMulti) {
                    body += "<th class='chk'><input type='checkbox' id='cbAll" + rand + "' /></th>";
                } else {
                    body += "<th class='no'></th>";
                }

                $.each(settings.columns, function (idx, col) {
                    body += "<th>" + col.title + "</th>";
                });
                body += "<th></th>";
                body += "</thead><tbody id='tbody" + rand + "'></tbody>";

                table.append($(body));
            }
        }

        // 绑定分页按钮的点击事件
        function setPagerButtonEvent() {
            firstButton = $("#first" + rand);
            prevButton = $("#prev" + rand);
            nextButton = $("#next" + rand);
            lastButton = $("#last" + rand);
            currentSpan = $("#index" + rand);

            pageSizeSpan = $("#size" + rand);;
            totalCountSpan = $("#total" + rand);;
            totalPagesSpan = $("#page" + rand);;
            loadTimeSpan = $("#time" + rand);;

            firstButton.on("click", function () {
                if (!$(this).hasClass("disabled")) {
                    pageindex = 1;
                    self.show();
                }
            });

            prevButton.on("click", function () {
                if (!$(this).hasClass("disabled")) {
                    pageindex -= 1;
                    pageindex = pageindex <= 0 ? 1 : pageindex;
                    self.show();
                }
            });

            nextButton.on("click", function () {
                if (!$(this).hasClass("disabled")) {
                    pageindex += 1;
                    self.show();
                }
            });

            lastButton.on("click", function () {
                if (!$(this).hasClass("disabled")) {
                    pageindex = totalPage;
                    self.show();
                }
            });

            currentSpan.on("change", function () {
                var nc = Number($(this).val());
                if (nc && nc <= totalPage && nc > 0) {
                    pageindex = nc;
                    self.show();
                } else {
                    $(this).val(pageindex);
                }
            });
        }

        // 配置 Pager 按钮
        function setPagerButton(size, index, total, start) {
            if (total == 0) {
                pager.hide();
            } else {
                pager.show();
            }

            // 总页数
            var pages = Math.ceil(total / size);
            pages = (pages == 0 ? 1 : pages);
            totalPage = pages;

            if (pages == 1) {
                if (!firstButton.hasClass("disabled")) {
                    firstButton.addClass("disabled");
                }
                if (!prevButton.hasClass("disabled")) {
                    prevButton.addClass("disabled");
                }
                if (!nextButton.hasClass("disabled")) {
                    nextButton.addClass("disabled");
                }
                if (!lastButton.hasClass("disabled")) {
                    lastButton.addClass("disabled");
                }
            } else {
                if (index == 1) {
                    if (!firstButton.hasClass("disabled")) {
                        firstButton.addClass("disabled");
                    }
                    if (!prevButton.hasClass("disabled")) {
                        prevButton.addClass("disabled");
                    }
                } else {
                    if (firstButton.hasClass("disabled")) {
                        firstButton.removeClass("disabled");
                    }
                    if (prevButton.hasClass("disabled")) {
                        prevButton.removeClass("disabled");
                    }
                }
                currentSpan.val(index);
                if (index == pages) {
                    if (!nextButton.hasClass("disabled")) {
                        nextButton.addClass("disabled");
                    }
                    if (!lastButton.hasClass("disabled")) {
                        lastButton.addClass("disabled");
                    }
                } else {
                    if (nextButton.hasClass("disabled")) {
                        nextButton.removeClass("disabled");
                    }
                    if (lastButton.hasClass("disabled")) {
                        lastButton.removeClass("disabled");
                    }
                }
            }
            totalCountSpan.text(total);
            pageSizeSpan.text(this.pageSize);
            totalPagesSpan.text(pages);
            loadTimeSpan.text((new Date().getTime() - start));
        }

        // 获取ajax的查询参数
        function getAjaxData() {
            var param;
            if ($.isFunction(settings.getSearchData)) {
                param = settings.getSearchData();
            }
            if (isPager) {
                if ($.isArray(param)) {                                             // $("form").serializationArray()
                    param.push({ "name": "pageSize", "value": pageSize });
                    param.push({ "name": "pageIndex", "value": pageindex });
                } else if ($.isPlainObject(param)) {                                 // 自定义查询对象
                    $.extend(true, param, { "pageSize": pageSize, "pageIndex": pageindex });
                } else {                                                             // $("form").serialization()
                    param = (param ? param + "&" : "") + "pageSize=" + pageSize + "&pageIndex=" + pageindex;
                }
            }
            return !!param ? param : {};
        }

        return self;
    }

})(jQuery);

/*
 *使用范例:
 *==========================数据格式============================
 {
  "code": 200,
  "describe": "",
  "totalCount": 3,
  "body": [
    {
      "no": 1,
      "name": "王五",
      "family": {
        "father": "王老五",
        "mother": "陈静蓉"
      }
    },
    {
      "no": 2,
      "name": "张三",
      "family": {
        "father": "张作霖",
        "mother": "李培芳"
      }
    },
    {
      "no": 3,
      "name": "李四",
      "family": {
        "father": "李宗仁",
        "mother": "江少芬"
      }
    }
  ]
 }

 *==========================页面调用============================
    <script src="jquery-1.10.2.js"></script>
    <script src="myGrid.js"></script>
    <script>
        var list = $("#list").myGrid({
            apiUrl: "data.json",
            isMulti: false,
            isTree: true,
            cols: [
                { col: "no", width: 120, title: "编号", cssClass: "chk", level: 0 },
                { col: "name", width: 120, title: "姓名", level: 0 },
                { col: "family.father", width: 120, title: "父亲", level: 1, func: "addFix" }
            ],
            valueCol: "no",
            pager: "pager",
            pageSize: 2,
            cssClass: "default-list-table",
            convertSource: function(data) {
                return data;
            }
        });

        // 这个是用来转换数据的方法
        function addFix(obj) {
            return "000" + obj;
        }
        list.show();
    </script>

一个修改的操作:

图片 2