我的js中有好多的这个$(function (),请问怎么二三本合并影响这些function还不影响使用

jquery写的合并单元格的一个方法 - 飞翔的蚂蚁 - ITeye技术网站
博客分类:
项目中经常使用的一个功能就是把排序之后的表格进行单元格的合并,一般是列的合并.
之前使用的方法是在后台进行html拼串,结果造成后台及其复杂,可维护性很差.
自己的想法就是在画完了表格之后再修改表格的结果,添加rowspan属性达到合并单元格的目的.
假如表格列数据依次是A,A,A,B,B,B,C,C,C
显示表格完之后,进行逐行进行查找得到这样的一个数组[3,3,3]
,表示重复的单元格的次数,然后在进行一次循环,再根据这里的数组里面的数字进行处理,将第一个遇到的单元格设置rowspan属性,剩余的重复的单元格remove掉...有点小小复杂的算法.
用jquery写完之后,到网上搜了一下,才发现有普通的js的版本的,看了一下,思路基本差不多.这里把我写的jquery的版本代码粘贴出来,附件有两个版本的网页.
* willcheck:要进行处理的表格对象(或者行的集合即可)
* colnum:要进行合并单元格的列
function coltogather(willcheck,colnum){
var alltext = [],togotherNum = [],oldnum = [],id=1,lasttext=null,rmflag=1;
//逐列的数据进行扫描,得到里面的不重复的数据,以及各个数据的数目,然后将依据此结果进行设置rowspan属性
willcheck.each(function(){
var _rmnum = this.getAttribute('rmnum');
if(!_rmnum)_rmnum=0;
var trdom= jQuery('td:eq('+(colnum-_rmnum)+')',this)
var text = jQuery(trdom).text();
//如果上一行记录文本为空,说明是第一行
if(lasttext==null) {
lasttext =
//如果当前行和上一行记录一样,说明要进行合并,合并的单元格数目就加1
if(lasttext!=text){
togotherNum.push(id);
lasttext =
togotherNum.push(id);
//复制allnum数组中的数据到oldnum数组
jQuery.each(togotherNum, function(i, n){
oldnum[i] =n;
var index = 0,len = togotherNum.
//逐行进行处理,设置指定列的rowspan属性,以及将要合并的单元格remove!
willcheck.each(function() {
// 得到一个属性表示该行已经被移除了几个td
var _rmnum = this.getAttribute('rmnum');
if (!_rmnum)
_rmnum = 0;
var tddom = jQuery('td:eq(' + (colnum - _rmnum) + ')', this)
if (togotherNum[index] == oldnum[index]) {
tddom.attr('rowSpan', togotherNum[index]);
if(togotherNum[index]&1)
togotherNum[index] = togotherNum[index] - 1;
if (togotherNum[index] == 0) {
tddom.attr('rowSpan', togotherNum[index]);
tddom.remove();
if(--togotherNum[index]==0){
// 移除了td之后,要在tr里面添加一个属性标示已经移除的td的数目
if (_rmnum == 0) {
jQuery(this).attr('rmnum', 1);
jQuery(this).attr('rmnum', 1 + _rmnum * 1);
//清空数组
togotherNum =
全部的可执行网页见附件.
感觉没有必要总是使用jquery做这些事情,因为可以看到普通的js一样可以处理很多的事情,用jquery的话有点杀鸡用牛刀了,不过jquery确实很方便.
下载次数: 1249
论坛回复 /
(10 / 7237)
interjc 写道对dom操作过多会有性能问题,我的做法一般是对后台传来的json对象进行直接拼合字符串统一输出,这样性能会好很多。恩 具体问题具体分析.我们的表格数据很大的,以前就是用的你的类似的方法在后台直接拼html显示在前台,结果后台代码乱七八糟.现在的这样js处理,在显示一页1000条的时候略有影响可以看出白页的效果,其余不会出现明显的停顿.不是后台拼,而是用js拼好字符串后再输出
下载文件功能还有问题!孙臻轶&&&&&&&&&&&&& 博时基金 A010 .68 .81 2 &&&&&&&&&&&&&&&&&&&&&&&& A010 .68 .81 16 &&&&&&&&&&&&&&&&&&&&&&&& A010 .68 .81 2 &&&&&
测试本机 A010 .68 .81 2 &&&&&&&&&&&&&&&&&&&&&&&& A010 .68 .81 16 &&&&&&&&&&&&&&&&&&&&&&&& A010 .68 .81 2 &&&&&&&&&&&&&&&& 信托基金 A010 .68 .81 2 &&&&&&&&&&&&&&&&&&&&&&&& A010 .68 .81 16 &&&&&&&&&&&&&&&&&&&&&&&& A010 .68 .81 2 严娅
博时基金 A002 .57 0 1 &&&
博时基金 A002 .57 0 8 &&&&&&&&&&&&&&&&&&&&&& A002 .57 0 1 &&&&&&&&&&&&&& 测试本机 A002 .57 0 1 &&&&&&&&&&&&&&&&&&&&&& A002 .57 0 8 &&&&&&&&&&&&&&&&&&&&&& A002 .57 0 1 &&&&&&&&&&&&&& 信托基金 A002 .57 0 1 &&&&&&&&&&&&&&&&&&&&&& A002 .57 0 8 &&&&&&&&&&&&&&&&&&&&&& A002 .57 0 1 我这里合并的用途只在显示页面做的操作,而下载的话我不知道你是怎么实现的,是不是下载的jsp文件然后设置头信息为excel类型.如果是这样可能没有问题(我没有试验过)..如果有问题,要自己解决了.
试了下,点击合并按钮后没反应啊
不用点击,已经是合并了单元格了。呵呵
但是你这样的话,要改动后台代码,对吧?而只用前台js处理的话,就不用改动后台的java代码.前台数据量多了,可能会有性能的影响.
如果只是为了避免改,后台一样可以做成可配置形式。至于数据量大的问题,数据量大,前台PC的压力肯定比后台服务器来的大,况且我这样做,实际上是压缩了数据量,因为合并了一些重复的数据。另外,每页显示1000条数据,个人认为对用户是非常不友好的,所以我做表格显示的时候基本不会这样做。
flashing 写道不错,.另外我觉得是还是像lz这样在js里面处理比较好,在服务器端合并性能更差,现在浏览器js引擎的性能已经不是当年了。
另外把计算的事情扔给各个客户端,在有一定并发压力的时候其实是更明智的办法。
你这个想法我是赞同的,但我做的是企业内部的应用,办公用PC难免良莠不齐,而且越是一线的业务员,所用的机器往往越差,去年因为这个栽过跟头,所以印象深刻。不过还是一句话,具体问题具体分析吧。
写的太不 jquery 了。
手痒写了一段
&script type="text/javascript"&
$.fn.merge = function () {&&
& return this.each(function(){
&& for(var i= $(this).find('tr:first td').size() -1; i&=0; i--){
&&&& var s =
&&&& var prevTd =
&&&& $(this).find('tr').each(function(){&
&&&&&& var td = $(this).find('td').eq(i);
&&&&&& var s1= td.text() ;
&&&&&& if (s1 == s) {
&&&&&&&& td.remove();
&&&&&&&& prevTd.attr('rowspan', prevTd.attr('rowspan')? parseInt(prevTd.attr('rowspan')) + 1:2);
&&&&&& }
&&&&&& else {
&&&&&&&& s = s1;
&&&&&&&& prevTd =
&&&&&& }
&&&& });
&& }
& });
}
$(document).ready(function(){
& $('button').click(function(){
&&& $('table').merge();
& });
});
&/script&
谢谢指点!学习了!
对dom操作过多会有性能问题,我的做法一般是对后台传来的json对象进行直接拼合字符串统一输出,这样性能会好很多。
恩 具体问题具体分析.我们的表格数据很大的,以前就是用的你的类似的方法在后台直接拼html显示在前台,结果后台代码乱七八糟.
现在的这样js处理,在显示一页1000条的时候略有影响可以看出白页的效果,其余不会出现明显的停顿.
和我做类似功能的思路很不一样
我倾向于在服务器端就做好一定的合并,然后页面上直接遍历构建
例如,原始的变量是这样
[
{ var1: "aa", var2: "b1", var3: "c1"},
{ var1: "aa", var2: "b2", var3: "c2"},
{ var1: "xx", var2: "yy", var3: "zz"},
……
]
我一般先在服务器端转换为这样的形式
[
{ var1: "aa", sub: [{var2: "b1", var3: "c1"}, {var2: "b2", var3: "c2"}]},
{ var1: "xx", sub: [{var2: "yy", var3: "zz"}],
……
]
然后按照数据,一次性生成合并行列的表格
可以减少对dom对象的操作,个人认为好些
但是你这样的话,要改动后台代码,对吧?而只用前台js处理的话,就不用改动后台的java代码.前台数据量多了,可能会有性能的影响.
浏览: 161530 次
来自: 上海
浏览量:14997
楼主,能发个源码吗,我删除后刷新有问题,总是跳转到第一页。查询 ...
DWZ研究中,楼主可以分享源码学习下吗?万分感谢! 93020 ...
前辈,dwz刚开始学,给我发份源码,万分感谢!!!!!,邮箱
能分享一份源码么?谢谢!
能给发一份源码学习吗?
谢谢 ! carey_pro@126 ...2010年6月 Web 开发大版内专家分月排行榜第三2009年7月 Web 开发大版内专家分月排行榜第三
2009年12月 Web 开发大版内专家分月排行榜第二
2009年10月 Web 开发大版内专家分月排行榜第三
2005年4月 Web 开发大版内专家分月排行榜第一
2005年2月 硬件使用大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。Javascript模块化编程(三):require.js的用法 - 阮一峰的网络日志
Javascript模块化编程(三):require.js的用法
这个系列的和,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战。
我采用的是一个非常流行的库。
一、为什么要用require.js?
最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码,相信很多人都见过。
  &script src="1.js"&&/script&
  &script src="2.js"&&/script&
  &script src="3.js"&&/script&
  &script src="4.js"&&/script&
  &script src="5.js"&&/script&
  &script src="6.js"&&/script&
这段代码依次加载多个js文件。
这样的写法有很大的缺点。首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。
require.js的诞生,就是为了解决这两个问题:
  (1)实现js文件的异步加载,避免网页失去响应;
  (2)管理模块之间的依赖性,便于代码的编写和维护。
二、require.js的加载
使用require.js的第一步,是先去官方网站最新版本。
下载后,假定把它放在js子目录下面,就可以加载了。
  &script src="js/require.js"&&/script&
有人可能会想到,加载这个文件,也可能造成网页失去响应。解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样:
  &script src="js/require.js" defer async="true" &&/script&
async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。
加载require.js以后,下一步就要加载我们自己的代码了。假定我们自己的代码文件是main.js,也放在js目录下面。那么,只需要写成下面这样就行了:
  &script src="js/require.js" data-main="js/main"&&/script&
data-main属性的作用是,指定网页程序的主模块。在上例中,就是js目录下面的main.js,这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,所以可以把main.js简写成main。
三、主模块的写法
上一节的main.js,我把它称为"主模块",意思是整个网页的入口代码。它有点像C语言的main()函数,所有代码都从这儿开始运行。
下面就来看,怎么写main.js。
如果我们的代码不依赖任何其他模块,那么可以直接写入javascript代码。
  // main.js
  alert("加载成功!");
但这样的话,就没必要使用require.js了。真正常见的情况是,主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。
  // main.js
  require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
    // some code here
require()函数接受两个参数。第一个参数是一个数组,表示所依赖的模块,上例就是['moduleA', 'moduleB', 'moduleC'],即主模块依赖这三个模块;第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。
require()异步加载moduleA,moduleB和moduleC,浏览器不会失去响应;它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。
下面,我们看一个实际的例子。
假定主模块依赖jquery、underscore和backbone这三个模块,main.js就可以这样写:
  require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
    // some code here
require.js会先加载jQuery、underscore和backbone,然后再运行回调函数。主模块的代码就写在回调函数中。
四、模块的加载
上一节最后的示例中,主模块的依赖模块是['jquery', 'underscore', 'backbone']。默认情况下,require.js假定这三个模块与main.js在同一个目录,文件名分别为jquery.js,underscore.js和backbone.js,然后自动加载。
使用require.config()方法,我们可以对模块的加载行为进行自定义。require.config()就写在主模块(main.js)的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。
  require.config({
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
上面的代码给出了三个模块的文件名,路径默认与main.js在同一个目录(js子目录)。如果这些模块在其他目录,比如js/lib目录,则有两种写法。一种是逐一指定路径。
  require.config({
    paths: {
      "jquery": "lib/jquery.min",
      "underscore": "lib/underscore.min",
      "backbone": "lib/backbone.min"
另一种则是直接改变基目录(baseUrl)。
  require.config({
    baseUrl: "js/lib",
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
如果某个模块在另一台主机上,也可以直接指定它的网址,比如:
  require.config({
    paths: {
      "jquery": "/ajax/libs/jquery/1.7.2/jquery.min"
require.js要求,每个模块是一个单独的js文件。这样的话,如果加载多个模块,就会发出多次HTTP请求,会影响网页的加载速度。因此,require.js提供了一个,当模块部署完毕以后,可以用这个工具将多个模块合并在一个文件中,减少HTTP请求数。
五、AMD模块的写法
require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。
具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。
假定现在有一个math.js文件,它定义了一个math模块。那么,math.js就要这样写:
  // math.js
  define(function (){
    var add = function (x,y){
      return x+y;
    };
    return {
      add: add
    };
加载方法如下:
  // main.js
  require(['math'], function (math){
    alert(math.add(1,1));
如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。
  define(['myLib'], function(myLib){
    function foo(){
      myLib.doSomething();
    return {
      foo : foo
    };
当require()函数加载上面这个模块的时候,就会先加载myLib.js文件。
六、加载非规范的模块
理论上,require.js加载的模块,必须是按照AMD规范、用define()函数定义的模块。但是实际上,虽然已经有一部分流行的函数库(比如jQuery)符合AMD规范,更多的库并不符合。那么,require.js是否能够加载非规范的模块呢?
回答是可以的。
这样的模块在用require()加载之前,要先用require.config()方法,定义它们的一些特征。
举例来说,underscore和backbone这两个库,都没有采用AMD规范编写。如果要加载它们的话,必须先定义它们的特征。
  require.config({
    shim: {
      'underscore':{
        exports: '_'
      },
      'backbone': {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
      }
require.config()接受一个配置对象,这个对象除了有前面说过的paths属性之外,还有一个shim属性,专门用来配置不兼容的模块。具体来说,每个模块要定义(1)exports值(输出的变量名),表明这个模块外部调用时的名称;(2)deps数组,表明该模块的依赖性。
比如,jQuery的插件可以这样定义:
  shim: {
    'jquery.scroll': {
      deps: ['jquery'],
      exports: 'jQuery.fn.scroll'
七、require.js插件
require.js还提供一系列,实现一些特定的功能。
domready插件,可以让回调函数在页面DOM结构加载完成后再运行。
  require(['domready!'], function (doc){
    // called once the DOM is ready
text和image插件,则是允许require.js加载文本和图片文件。
  define([
    'text!review.txt',
    'image!cat.jpg'
    ],
    function(review,cat){
      console.log(review);
      document.body.appendChild(cat);
类似的插件还有json和mdown,用于加载json文件和markdown文件。
一、什么是内存泄漏?
程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。
学习函数式编程,必须掌握很多术语,否则根本看不懂文档。
本文要回答一个很重要的问题:函数式编程有什么用?
学习函数式编程的过程中,我接触到了 Ramda.js。114网址导航}

我要回帖

更多关于 二三本合并影响 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信