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 并在你作为初始发布的代码中使用该值指数
我有一个 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 并在你作为初始发布的代码中使用该值指数