JS完成代码前最好对其做5件事_javascript技巧

写在前面

我们不得面对这样一个事实:许多程序员不会规划他们的JS代码。我们经常快速写完代码、运行、提交。但当我们继续开发遇到变量和函数时不得不再次回头查看它们代表的含义,麻烦就从这里开始了。同样当我们在其他程序员手中获取脚本也会遇到类似的错误。因此,当我们说”this is done, I can go on”时最好对脚本做下列5件事情。

问题描述

现在我们想给每一个带有class属性为collapsible的DIV内部添加超链接A,来显示和隐藏DIV。

下面是用模块函数编写的实现代码:

复制代码 代码如下:

var collapser = (function(){
var secs = document.getElementsByTagName('div');
for(var i=0;i<secs.length;i++){
if(secs[i].className.indexOf('collapsible')!==-1){
var p = document.createElement('p');
var a = document.createElement('a');
a.setAttribute('href','#');
a.onclick = function(){
var sec = this.parentNode.nextSibling;
if(sec.style.display === 'none'){
sec.style.display = 'block';
this.firstChild.nodeValue = 'collapse'
} else {
sec.style.display = 'none';
this.firstChild.nodeValue = 'expand'
}
return false;
};
a.appendChild(document.createTextNode('expand'));
p.appendChild(a);
secs[i].style.display = 'none';
secs[i].parentNode.insertBefore(p,secs[i]);
}
}
})();

上面的代码已经很准确的实现了我们想要的结果。但是我们还可以对上面的代码进一步的重构。

第一步:样式(CSS)与行为(JavaScript)分离

我们可以用添加一个CSS的class选择器来消除通过JS中设置的样式。这种现象在新手中经常遇到.

复制代码 代码如下:

var collapser = (function(){
var secs = document.getElementsByTagName('div');
for(var i=0;i<secs.length;i++){
if(secs[i].className.indexOf('collapsible')!==-1){
secs[i].className += ' ' + 'collapsed';
var p = document.createElement('p');
var a = document.createElement('a');
a.setAttribute('href','#');
a.onclick = function(){
var sec = this.parentNode.nextSibling;
if(sec.className.indexOf('collapsed')!==-1){
sec.className = sec.className.replace(' collapsed','');
this.firstChild.nodeValue = 'collapse'
} else {
sec.className += ' ' + 'collapsed';
this.firstChild.nodeValue = 'expand'
}
return false;
}
a.appendChild(document.createTextNode('expand'));
p.appendChild(a);
secs[i].parentNode.insertBefore(p,secs[i]);
}
}
})();

第二步:对代码进一步性能优化

这里我们可以做两件事情:1、循环语句中secs的length属性可以用变量保存。2、为事件处理器创建重用的函数。好处是减少事件处理器数量,减少内存占用。

复制代码 代码如下:

var collapser = (function(){
var secs = document.getElementsByTagName('div');
for(var i=0,j=secs.length;i<j;i++){
if(secs[i].className.indexOf('collapsible')!==-1){
secs[i].className += ' ' + 'collapsed';
var p = document.createElement('p');
var a = document.createElement('a');
a.setAttribute('href','#');
a.onclick = toggle;
a.appendChild(document.createTextNode('expand'));
p.appendChild(a);
secs[i].parentNode.insertBefore(p,secs[i]);
}
}
function toggle(){
var sec = this.parentNode.nextSibling;
if(sec.className.indexOf('collapsed')!==-1){
sec.className = sec.className.replace(' collapsed','');
this.firstChild.nodeValue = 'collapse'
} else {
sec.className += ' ' + 'collapsed';
this.firstChild.nodeValue = 'expand'
}
return false;
}
})();

第三步:添加配置对象

使用配置对象存放代码中的硬编码,如使用到的文本标签或自定义的属性名。有利于后续的维护。

复制代码 代码如下:

var collapser = (function(){
var config = {
indicatorClass : 'collapsible',
collapsedClass : 'collapsed',
collapseLabel : 'collapse',
expandLabel : 'expand'
}
var secs = document.getElementsByTagName('div');
for(var i=0,j=secs.length;i<j;i++){
if(secs[i].className.indexOf(config.indicatorClass)!==-1){
secs[i].className += ' ' + config.collapsedClass;
var p = document.createElement('p');
var a = document.createElement('a');
a.setAttribute('href','#');
a.onclick = toggle;
a.appendChild(document.createTextNode(config.expandLabel));
p.appendChild(a);
secs[i].parentNode.insertBefore(p,secs[i]);
}
}
function toggle(){
var sec = this.parentNode.nextSibling;
if(sec.className.indexOf(config.collapsedClass)!==-1){
sec.className = sec.className.replace(' ' + config.collapsedClass,'');
this.firstChild.nodeValue = config.collapseLabel
} else {
sec.className += ' ' + config.collapsedClass;
this.firstChild.nodeValue = config.expandLabel
}
return false;
}
})();

第四步:为变量和函数起有含义的名字

复制代码 代码如下:

var collapser = (function(){
var config = {
indicatorClass : 'collapsible',
collapsedClass : 'collapsed',
collapseLabel : 'collapse',
expandLabel : 'expand'
}
var sections = document.getElementsByTagName('div');
for(var i=0,j=sections.length;i<j;i++){
if(sections[i].className.indexOf(config.indicatorClass) !== -1){
sections[i].className += ' ' + config.collapsedClass;
var paragraph = document.createElement('p');
var trigger = document.createElement('a');
trigger.setAttribute('href','#');
trigger.onclick = toggleSection;
trigger.appendChild(document.createTextNode(config.expandLabel));
paragraph.appendChild(trigger);
sections[i].parentNode.insertBefore(paragraph,sections[i]);
}
}
function toggleSection(){
var section = this.parentNode.nextSibling;
if(section.className.indexOf(config.collapsedClass) !== -1){
section.className = section.className.replace(' ' + config.collapsedClass,'');
this.firstChild.nodeValue = config.collapseLabel
} else {
section.className += ' ' + config.collapsedClass;
this.firstChild.nodeValue = config.expandLabel
}
return false;
}
})();

第五步:添加必要的注释

复制代码 代码如下:

// Collapse and expand section of the page with a certain class
// written by Christian Heilmann, 07/01/08
var collapser = (function(){
// Configuration, change CSS class names and labels here
var config = {
indicatorClass : 'collapsible',
collapsedClass : 'collapsed',
collapseLabel : 'collapse',
expandLabel : 'expand'
}
var sections = document.getElementsByTagName('div');
for(var i=0,j=sections.length;i<j;i++){
if(sections[i].className.indexOf(config.indicatorClass) !== -1){
sections[i].className += ' ' + config.collapsedClass;
var paragraph = document.createElement('p');
var trigger = document.createElement('a');
trigger.setAttribute('href','#');
trigger.onclick = toggleSection;
trigger.appendChild(document.createTextNode(config.expandLabel));
paragraph.appendChild(trigger);
sections[i].parentNode.insertBefore(paragraph,sections[i]);
}
}
function toggleSection(){
var section = this.parentNode.nextSibling;
if(section.className.indexOf(config.collapsedClass) !== -1){
section.className = section.className.replace(' ' + config.collapsedClass,'');
this.firstChild.nodeValue = config.collapseLabel
} else {
section.className += ' ' + config.collapsedClass;
this.firstChild.nodeValue = config.expandLabel
}
return false;
}
})();

 

时间: 2024-09-07 22:37:20

JS完成代码前最好对其做5件事_javascript技巧的相关文章

好的董事长只做三件事

好的董事长应当只做三件事:看别人看不见的地方,算别人算不清的账,做别人不做的事. 董事长是公司的一把手和公司团队的核心.我算是中国最资深的董事长之一,20年来我只做过这一个职务,没做过任何总经理之类的职务.在<公司法>出台之前,我就担任董事长,一直到现在仍然是这个岗位,因此对这个角色的扮演,我有一些自己的观察和体会. 按照<公司法>规定,总经理可以管很多事情,那么董事长该做什么?很少做事或什么事都不做,就挂个名签个字吗?一般来说董事长并不愿意这样,也不放心:但如果什么都管,管得非常

美丽说无线总监胡嵩:一个APP只做一件事

美丽说无线总监胡嵩 (TechWeb配图)3月26日消息,美丽说无线产品负责人胡嵩在接受TechWeb采访时透露,美丽说移动客户端的装机量已超过600万,日活跃量超过60万.而在最初的设计原则上美丽说曾走过一些弯路.胡嵩曾在百度工作7年,历任网页搜索部工程师.Spider架构师.技术委员会主席.百度无线总架构师兼无线搜索高级经理.2011年7月,胡嵩加入美丽说担任无线总监,当时美丽说的无线团队 刚刚起步不久.一个APP的诞生美丽说在移动互联网领域探索较早.2011年3月份,美丽说就开始开发无线客

王德禄:中国高新区还要做几件事

领先世界 中国高新区还要做几件事 -- 对话北京市长城企业战略研究所所长王德禄 21年前,中国开始了火炬计划,高新区在全国雨后春笋般地建立起来,经过二十多年的发展,高新区已经成为地方经济的领头羊,成为创业创新的中心.2008年我国高新技术产业总产值达到5.8万亿元,比上年增长了14.1%,高新技术产业增加值约2.17万亿元,比上年增加了14%,一批具有自主知识产权的高新技术企业在国际金融危机面前不仅能够生存,而且展现了良好的发展态势. 高新技术企业主要聚集在高新区,然而,我们也应该看到,和美国硅

支付宝总裁樊治铭:在物流POS战略实施中支付宝只做两件事

3月19日消息,支付宝启动物流POS战略,宣布向中国电商COD市场投资5亿元,推动整个电商COD体系发展.支付宝副总裁樊治铭表示,支付宝发力物流POS支付未来专注两件事,分别是做好物流POS支付方案和支付宝POS设备布建投资. 樊治铭称,支付宝开始关注COD市场,发现市场COD支付方案未能很好的需求客户与用户需求,主要表现为配送收银时,不能实现配送签收信息的同步传送,而且许多COD服务也不能提供POS刷卡应用.为此,支付宝市场投资5亿元推动整个COD体系软硬环境的改善. 樊治铭说,在这个物流PO

IT女屌丝只用微信做五件事:获取信息 分享内容

女屌丝转土重来了,昨天下午冒着蒙蒙细雨,参加了腾讯汇一个高端活动,门口几个大叔保安说"安全警卫升级",打了好几个电话才放我进去,看着简约而不简单的高端会所腾讯汇,顿时肃然起敬,私心想,将来我得写篇文章叫做"十个方法教你做逼格很高的沙龙",其中一个方法就是,保安一定要帅的. 图文无关 微信官方昨天下午的活动还没有完,勤奋的自媒体们,门户同仁们的稿子就铺天盖地出来了.微信产品总监曾鸣高喊"微信不是http://www.aliyun.com/zixun/aggr

91金融创始人许泽玮解密生存武器:其实我们就做一件事

这是最好的时代,互联网赋予了我们将一切理想转化为现实的可能:这是智慧的时代,传统金融正在借助互联网开始几何般的增长:这是信仰的时代,那些成功的创业者已成为这个时代最为积极的"正能量"无限传播. 互联网与传统金融,这是一次奇妙的化学反应,也是一场未知的跨界"旅行".虽然这场大幕已经开启,但无疑我们对于它的了解要远远小于以往每次的互联网变革.探寻未知是最大的乐趣,找寻答案也是投资界的"使命". 在这个充满创业朝气的春天,互联网金融圈子里涌现出了一批创

我微信粉丝快速增长的方法 只做两件事

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 10个月时间,必途微信粉丝从2000到60万的超级增长率,一个主做职场.测试类的微信只坚持做了两件事,自己第一次真切的体会到了坚持.关注和持续执行力的神奇.本文章只分享干货,力求言简意赅,只做两件事. 第一件事,找最好的文章,什么样的文章是最好的文章,我这里的定义,只看阅读量,只有被用户认可的文章才是最好的文章,最好的文章从哪里来,怎么筛选,

一个JS小玩意 几个属性相加不能超过一个特定值._javascript技巧

最有名的例子就是三国志和太阁里给新武将角色分配属性值啦. 在下不才,用javascript做了这么一个功能,顺便把页面中的链接下划线给隐藏掉. 大家看看,有什么更好的优化意见,大家尽管提. 下面是代码: 首先是test.html: 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Docum

HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列_javascript技巧

BS架构的企业级应用中,当一个表格列数较多时,用户一个常见的需求就是把前面几个重要的列固定住,这样拖动滚动条时固定的列会方便用户查看数据,用户体验很好.一些重量级的JS组件库也都有这个功能,那么有没有更简单的方法实现这个功能呢? 这个需求常见的解决方案是使用表格拼接的方法,这个方案如果要制作静态的网页,或者功能简单的动态页面,逻辑比较简单,技术上也不复杂,很容易实现,但是如果要做成组件,动态功能较多的话,就需要写大量的冗余代码,难以维护,甚至于一个简单的功能,都需要写很多的代码,比如事件处理等,