从 $(document).ready 调用 Jquery 函数花费太长时间 - IE 弹出“停止运行脚本”对话
我有以下脚本来模仿 html 中的“freezepane”功能,就像在 Excel 中一样,当用户滚动结果表时,右侧和标题都会滚动。
fnAdjustTable=function(){
var colCount=$('#firstTr>td').length; //get total number of column
var m=0;
var n=0;
var brow='mozilla';
jQuery.each(jQuery.browser, function(i, val) {
if(val==true){
brow=i.toString();
}
});
$('.tableHeader').each(function(i){
if(m<colCount){
if(brow=='mozilla'){
$('#firstTd').css("width",$('.tableFirstCol').innerWidth());//for adjusting first td
$(this).css('width',$('#table_div td:eq('+m+')').innerWidth());//for assigning width to table Header div
}
else if(brow=='msie'){
$('#firstTd').css("width",$('.tableFirstCol').width());
$(this).css('width',$('#table_div td:eq('+m+')').width());//In IE there is difference of 2 px
}
}
m++;
});
$('.tableFirstCol').each(function(i){
if(brow=='mozilla'){
$(this).css('height',$('#table_div td:eq('+colCount*n+')').outerHeight()-1);//for providing height using scrollable table column height
}else if(brow=='msie'){
$(this).css('height',$('#table_div td:eq('+colCount*n+')').innerHeight());
}else{
$(this).css('height',$('#table_div td:eq('+colCount*n+')').height());
}
n++;
});
}
fnScroll=function(){
$('#divHeader').scrollLeft($('#table_div').scrollLeft());
$('#firstcol').scrollTop($('#table_div').scrollTop());
}
问题是,当迭代“tableFirstCol”tds 时,会弹出停止运行脚本的错误。有没有更有效的方法来做到这一点?
本质上,该脚本正在调整每个顶部标题和侧窗格的大小以匹配第一行/列的宽度。如果我使用较大的日期范围(侧标题)运行报告,通常当侧标题行大约超过 30 行时,脚本就会弹出。
任何帮助表示赞赏!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要缓存选择器:
您可以将 .eq(n) 用于列选择器。
当
this.style.height = n
; 时,不要使用$(this).css("height", n)
;更容易、更快。这:
应该是:
并且我不完全确定您甚至需要
i 检查(但我必须查看 HTML)。
浏览器嗅探可能是没有必要的。尝试应用重置样式表和有效的
doctype
或使用 HTML5Boilerplate。如果您必须浏览器嗅探:您可以只使用:
您也可以将该代码压缩很多。查找DRY 原则。
另外,至于设置
tableFirstCol
的高度,你不能只设置行的高度吗?You need to cache your selectors:
You can use for your column selectors .eq(n).
Don't use
$(this).css("height", n)
whenthis.style.height = n
; is easier and faster.This:
should be:
and I'm not entirely sure you would even need the
i<colCount
check (but I'd have to see the HTML).The browser sniffing is probably not necessary. Try applying a reset stylesheet and a valid
doctype
or use HTML5Boilerplate.If you HAVE to browser sniff: you could just use:
You could also condense that code down quite a lot. Look up the DRY principle.
Also, as for setting the height of the
tableFirstCol
, couldn't you just set the height of the row instead?您可以为每列和行生成带有
id
标记的 HTML。然后只需按名称进行选择即可,而无需使用复杂的选择器。我想说
$('#table_div td:eq('+colCount*n+')')
是一个复杂的选择器,而$('#row1')
是容易多了。另外 - 我相信你为浏览器检查所做的事情是行不通的。您拥有的代码会迭代检测到的浏览器的所有属性,并将
brow
值设置为最后一个。使用$.browser.webkit
等内容来检查 webkit,使用$.browser.msie
来检查 IE,而不是使用现有的循环。正如您现在的代码一样,我认为您将始终执行else
情况。有关 jQuery 浏览器对象的更多信息,请参见此处: http://api.jquery.com/jQuery.browser/You could generate the HTML with
id
tags for each column and row. Then just select by the name instead of using the complicated selectors.I would say that
$('#table_div td:eq('+colCount*n+')')
is a complicated selector, while$('#row1')
is much easier.Also - I believe what you are doing for a browser check will not work. The code you have iterates through all properties for the detected browser and sets the
brow
value to the last one. Instead of the loop you have, use something like$.browser.webkit
to check for webkit and$.browser.msie
to check for IE. As your code is now, I think you will always be executing theelse
case. See here for more on the jQuery browser object: http://api.jquery.com/jQuery.browser/