Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么jquery这么慢?_Javascript_Jquery - Fatal编程技术网

Javascript 为什么jquery这么慢?

Javascript 为什么jquery这么慢?,javascript,jquery,Javascript,Jquery,我正在使用一个jquery插件,它修复了我生成的html表的标题。不幸的是,该插件的性能非常慢,我将其缩减为以下代码: var $tbl = $(this); var $tblhfixed = $tbl.find("thead"); $tblhfixed.find("th").each(function () $(this).css("width", $(this).width()); }); 在ie中有2000行的桌子上,这大约需要40秒。有人知道为什么速度如此之

我正在使用一个jquery插件,它修复了我生成的html表的标题。不幸的是,该插件的性能非常慢,我将其缩减为以下代码:

var $tbl = $(this);  
var $tblhfixed = $tbl.find("thead");  
$tblhfixed.find("th").each(function ()    
    $(this).css("width", $(this).width());  
});

在ie中有2000行的桌子上,这大约需要40秒。有人知道为什么速度如此之慢,更重要的是,我该如何使速度更快吗?我尝试过许多其他插件,这是唯一一个工作方式,我希望它。感谢您的帮助

罪魁祸首可能是
。每个

原因是当您使用
.each
而不是普通循环进行迭代时,每次迭代都会调用一个函数。在这种情况下,函数调用的开销相当大,因为每次迭代都必须创建一个新的调用堆栈

让它更快的改变

$tblhfixed.find("th").each(function ()    
    $(this).css("width", $(this).width());  
});


您不应该在传递到
.each()
的函数中重复
$(此)
。包装一个元素有非常大的开销,当您有20k个元素时,这是不好的。您希望在
.each()
调用中消除尽可能多的工作,或者完全消除它

另外,当您可以这样做时,为什么要查询两次
find()
,这应该会得到相同的结果:

$ths = $('table thead th'); //or tableid, or something
$ths.css('width', $ths.width());

首先,仅当需要通过所有嵌套节点时,才应使用
find()
。在这里,您可以使用
children()

其次,每次
$(this)
创建jQuery对象的新实例时,您可以创建一次:

var $this = $(this);
每次重新计算
$(this).width()
。确保需要重新计算它。或者:

var tableWidth = $this.width();
第三,根据@Martin Jespersen的说法,每次迭代都会创建
函数
对象

此外,这里根本不需要jQuery。您可以直接访问DOM:

var tableWidth = ...; // get the table width the way you want
var thead = this.tHead;
var thRow = thead.rows[0];
for (var i = 0; i < thRow.length; ++i) {
  thRow.cells[i].style.width = tableWidth + "px";
}
var tableWidth=…;//按您想要的方式调整桌子的宽度
var thead=this.thead;
var thRow=thead.rows[0];
对于(变量i=0;i
我想你面临的问题与我不久前遇到的问题相同。它被称为“重新计算布局”之类的东西

尝试将此脚本分成两个循环,如下所示:

var $tbl = $(this);
var $tblhfixed = $tbl.find("thead");
var widths = [];

// 1.
$tblhfixed.find("th").each(function ()
    widths.push($(this).width());
});

// 2.
$tblhfixed.find("th").each(function (index, element)
    $(this).css("width", widths[index]);
});
第一个将计算所有宽度。第二个将应用于TH

UPD: 您可以通过将此代码置于1之间来提高性能。和2.:

$tblhfixed.hide();
并在2之后再次显示:

$tblhfixed.show();

$.width()似乎比本机get(0)慢99倍。clientWidth,请检查此测试:

行数是否有差异(您测试过此测试吗)?您只是在操纵表格标题。有多少列?您应该使用筛选器而不是查找。这是什么?背景是什么?A太好了:)对不起,'this'是对我正在应用插件的表的引用,您可以尝试:
$tblhfixed.find(“th”).width(函数(I,val){return val;})你找到解决方案了吗?我在追问几乎完全相同的问题,我怀疑jQuery的width()方法似乎需要35秒左右的时间,虽然这是真的,但我认为
。与重复调用
$(this)
相比,每个()的开销可以忽略不计。每个开销都相当大,请看这里:
width()
也不是世界上最快的函数,IIRC,所以我也会缓存该调用。为什么要将
th
宽度设置为
表的
宽度?这不是OP的代码所做的。这确实帮助了我,尽管我不完全理解为什么我的代码仍然运行得很慢——肯定比以前快,但仍然很慢。
$tblhfixed.show();