有效地选择A和B之间的元素

时间:2015-12-17 11:01:52

标签: javascript performance loops selector

我有一张桌子上有很多td' s。选择2选择2和中间的所有内容的最有效方法是什么?

在选择1上,我给选定的td一个id,在选择2上,我给那个选择另一个id,以便稍后查找那些id。

当前代码:

// small helpers
function _for(e,f) { var i, len=e.length; for(i=0;i<len;i++){ f(e[i]); }}
function _id(e) { return document.getElementById(e); }

// VARs
var main = _id('monthTables'),
    td = main.querySelectorAll('td'),
    go = false,
    stop = false,
    i = 0,
    s1i = 0,
    s2i = 999;

// Loop throught td's
_for(td, function(e){

    if( e.id == 'sel1' ) { go = 1; s1i = i; }
    if( e.id == 'sel2' ) { stop = 1; s2i = i; }

    if( s1i < s2i && go ) {
        if(go) { e.classList.add('range'); }
    }

    if( stop ) { go = 0; }

}) // end loop

实例(选择两个日期):
http://cdn.rawgit.com/tommiehansen/lightRange/master/test.html

1 个答案:

答案 0 :(得分:0)

我认为代码很好,也许你可以添加一些优化(比如找到第二个选择的id时停止循环)

循环示例:

function _for(e,f) { 
  var i, len=e.length; 
  for(i=0;i<len;i++){ if(f(e[i]) === false) break; }
}

因此当函数f返回false

时会中断
// Loop throught td's
_for(td, function(e){

    //...

    if( stop ) return false;

}) // end loop

另外,如果您想要更多performance,我建议您使用getElementsByTagName代替querySelectorAll ..但也许这是一个邪恶的微优化

另一个优化是从第一个选定的td开始循环,可能是storing the index当你选择td并在你发布的代码中使用该值作为初始索引