Select A 和 B 之间的元素有效

Select elements between A and B efficiently

我有一个 table 有很多 td。从 select selection 1 到 selection 2 以及介于两者之间的所有内容的最有效方法是什么?

在 selection 1 上,我给 selected td 一个 id,在 selection 2 上,我给 selection 另一个 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

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

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

循环示例:

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

所以它会在函数 f returns false

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

    //...

    if( stop ) return false;

}) // end loop

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

另一个优化是从第一个 selected td 开始循环,也许 storing the index 当你 select td 并在你作为初始发布的代码中使用该值指数