干咱们java web开发这一行的,一般可能都碰到过做Tab标签切换的js功能任务,我看到很多人都喜欢用循环去控制那个置为当前显示,剩下都置为隐藏,我就很奇怪,为什么一定要使用循环去做这件事呢,如果你有1000个标签,也用循环逐个搞定么?
原来的传统写法:
function tabit(id,cid) {
for(var i=0; i<10; i++){
gi(["tab"+i]).className = "taboff";
gi(["ctab"+i]).style.display = "none";
}
gi(id).className="tabon";
gi(cid).style.display="block";
}
原理:用for循环将全部的tab置为不显示,然后循环结束后,把指定的那个tab置前即可。
这样做效率极低,虽然感觉不出来慢,不过如果我是计算机,我肯定会骂这个编程的,让老子白白浪费时间体力干这么一件重复无意义的事情;另外受tab个数限制。
我初次接触这种切换问题的时候,就提出一种临时存储记忆法,可以比这种传统循环的算法效率高很多,实现起来也非常简单:
var lastTab; //临时存储上次时的tab ID值
function tabit(cid) {
//如果上次有存储值,且和本次请求切换的是同一个,那么直接提前结束
if( lastTab && lastTab == cid)
return;
//否则,改变上次的tab状态为隐藏状态,并且置换本次请求的tab为当前状态
/*这里要注意考虑第一次触发这个函数的情况,因为这个时候lastTab是undefined,所以直接查找id对应的元素肯定会报js错误的*/
if( lastTab) {
gi(lastTab).className = "taboff";
gi(lastTab).style.display="none";
}
gi(cid).className="tabon";
gi(cid).style.display="block";
//最后将本次的tab记录下来以备下次切换使用
lastTab = cid;
}
//根据id获取对应的元素对象
function gi(id) {
return document.getElementById(id);
}
我的这个版本的算法原理是:用一个变量临时存储最后一次请求切换的Tab id,这个时候,如果有下一次的切换请求,那么就跟上次请求的记录进行对比,如果相同,则不进行切换,直接结束,否则进行切换本次的tab状态和上次的tab状态即可。
这样一来没有做重复无意义的工作,二来效率高,且不受tab个数的限制,就算有10000个tab进行切换,处理的速度还是跟处理2个tab切换的速度一样的高。