jQuery / javascript如何更快地计算宽度

我有一张有100列的桌子.我正在遍历所有th元素的循环,以显式设置每个th的宽度.

var $ths = $("table th");
$ths.each(function (i, th) {
    var $th = $(th);
    var width = $th.width();
    $th.width(width);
});

对于100列,这会花费太多时间(超过60s).每个“获取宽度”调用都需要500-700毫秒.这是因为每次我获得宽度时,都需要生成布局.

问题-是否有更快的获取宽度的方法?

原因-我冻结标题.为此,我需要将每个标头的宽度设置为固定像素宽度.一切都是动态的,因此不能以px为单位预先设置每列的宽度.

解决方法:

您可能会考虑为此编写普通的JavaScript.可能会节省几毫秒的时间.

var cells = myTable.rows[0].children;

for ( var i = 0; i < cells.length; i++ ){
   cells[i].style.width = cells[i].offsetWidth + "px";
}

因为您使用的是offsetWidth,所以值为you’re not going to be able to get away from reflow.但是,根据TH中有多少个字符(假设文本不会自动换行,并且您使用的是固定的单型字体)和creatively applying CSS can greatly reduce reflow latency来估算单元格宽度.

// Appends CSS Classes to stylesheet in doc head
function appendStyle(styles) {
  var css = document.createElement('style');
  css.type = 'text/css';

  // Browser compatibility check
  if (css.styleSheet) css.styleSheet.cssText = styles;
  else css.appendChild(document.createTextNode(styles));

  document.getElementsByTagName("head")[0].appendChild(css);
}

var cells       = myTable.rows[0].children;
var cellWidth   = 0;
var letterWidth = 5; // let's assume each letter is 5px wide
var classname   = '';
var styles      = '';

for ( var i = 0; i < cells.length; i++ ){
   classname         = "Cell" + i;
   cell[i].className = classname;
   cellWidth         = (letterWidth * cells[i].innerHTML.length);
   styles           += "." + classname + "{width:" + cellWidth + "px}";
} 

window.onload = function() { appendStyle(styles) };

通过使用文档片段(great writeup on performance benefits by John Resig),您可以在运行时在DOM外部渲染所有内容,并在DOM加载后交换片段,从而进一步扩展这个功能……但是,很重要的是,这时您真的要问榨汁是否值得.

上一篇:MySQL查询性能-


下一篇:预测完全加载javascript页面的时间