`

js代码编写完成前要做到的5件事

阅读更多
许多程序员不会规划他们的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;
}
})();
分享到:
评论

相关推荐

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

    为了避免这种情况,下面列出了在完成JavaScript代码前应当做的五件事。 第一件:样式(CSS)与行为(JavaScript)分离 在JavaScript代码中直接添加样式会使得代码难以维护。建议使用CSS来控制样式,这样可以使样式更加...

    一个小的完整的页面计算器,js代码编写的

    每个按钮代表一个数字或运算符,它们通过事件监听器与JavaScript代码关联。当用户点击按钮时,对应的函数会被调用,从而触发相应的操作。 例如,你可以创建一个函数`addNumber(number)`用于处理数字输入,另一个...

    js编写的黄金矿工源代码

    - `images` 文件夹很可能包含了游戏所需的所有图像资源,如角色、背景、道具等,这些图片在JavaScript代码中被引用,以创建游戏的视觉效果。 - `js` 文件夹则包含JavaScript源代码,这是游戏逻辑的核心,包括游戏...

    用javascript制作简单计算器.html

    学习了javascript ,这个代码是使用javascript来做一个简单的计算器,可以实现简单的额加减乘除的计算

    【JavaScript源代码】用JS编写选项卡效果.docx

    在JavaScript编程中,实现选项卡效果是一种常见的交互设计,它能帮助用户更直观地浏览和切换...在这个例子中,虽然没有提供完整的JavaScript代码,但我们可以推断出大致的逻辑和需要完成的步骤,从而实现预期的功能。

    1000份前端js代码模板可做工具类

    这份"1000份前端js代码模板可做工具类"资源集合,旨在为开发者提供大量的代码片段和实用工具,帮助他们更高效地完成项目开发。下面,我们将深入探讨这些标签所涵盖的知识点,并结合资源中的文件名"js代码1000个"来...

    真实可弹的JS弹窗代码

    这种做法并不常见,一般我们会直接在`&lt;script&gt;`标签内编写JavaScript代码。 ### 2. 变量声明与赋值 JavaScript支持多种变量声明方式,包括`var`、`let`和`const`。其中`var`是最传统的声明方式,在ES6之前被广泛...

    用JS做的一个关于淘宝网的网站

    【标题】:“用JS做的一个关于淘宝网的网站”揭示了这个项目主要使用JavaScript语言来构建,目的是模拟或实现一个类似于淘宝网的功能。JavaScript是一种广泛应用于客户端Web开发的编程语言,它允许在用户浏览器上...

    html5制作,纯js完成 单机版消消乐 注意此为单机模式无服务器,支持手机打开

    首先,HTML5是超文本标记语言的第五个版本,它在前一代的基础上增加了许多新特性,如离线存储(localStorage)、拖放功能(drag and drop)、媒体元素(video/audio)以及Canvas画布等。在这个项目中,Canvas可能是...

    使用 JavaScript 编写的 Muffle Runner 游戏及其源代码.zip

    项目:使用 JavaScript 编写的 Muffle Runner 游戏及其源代码 javascript 中的 muffle runner 游戏是一款基于平台的游戏。整个编程都使用 HTML、CSS 和 JavaScript。这款游戏完全使用 javascript 编写,并使用了一些...

    使用 JavaScript 编写的点击游戏源代码.zip

    完成每个关卡后,难度级别会越来越高。玩家必须在时间耗尽之前点击每个蓝点。游戏屏幕上蓝点与红点混合散布。你必须小心,不要点击红点。谈到这款游戏的 PC 控制,一切都很简单。你只需要使用鼠标光标并单击鼠标左键...

    使用 JavaScript 编写的掷骰子游戏(附源代码).zip

    项目:JavaScript 掷骰子游戏及源代码 javascript 中的掷骰子游戏是一款基于骰子的游戏。整个编程都使用 HTML、CSS 和 JavaScript。这款游戏完全使用 javascript 编写,并使用了一些精灵图像。您可以简单地使用任何...

    QQ在线客服JS代码,可做分享,滑动伸缩

    2. 编写JS代码:根据QQ的API文档编写JavaScript代码,设置客服的显示位置、样式以及触发事件(如鼠标悬停、点击等)。 3. 调整样式:为了实现滑动伸缩效果,需要通过CSS来控制客服图标的隐藏、显示以及动画效果。 4....

    js加html编写的级联菜单

    1. `index.html` - 主HTML文件,包含基本的HTML结构和JavaScript代码片段。 2. `style.css` - CSS样式表,用于定义菜单的外观和行为。 3. `script.js` - JavaScript脚本文件,处理事件监听、DOM操作和Ajax请求。 4. ...

    html+css+js高仿汤姆猫

    `Buttons`目录可能包含了与游戏按钮相关的JavaScript代码,这些按钮可能是游戏中的操作触发器,比如让汤姆猫做出反应或者播放声音。JavaScript也用于处理用户的输入事件,如点击、触摸或键盘输入,以及实现游戏的...

    JS高手做的

    而描述中的“全部用JS完成,一个JS高手做的,特转载”进一步强调了这个项目完全依赖JavaScript技术,并且是由一位经验丰富的JavaScript开发者编写的。考虑到标签中提到了“JS,excel”,我们可以推测这个项目可能涉及到...

    如何组织你的javascript代码

    ### 如何组织你的JavaScript代码 在现代Web开发中,JavaScript已成为不可或缺的一部分,它的重要性随着Web应用变得越来越复杂而日益凸显。对于ASP/JSP程序员来说,掌握如何高效地组织JavaScript代码是一项重要的...

    JS.NET编写的防刷新访问记数器

    这样做的好处是能够利用.NET的类型系统、垃圾收集以及强大的类库,使得JavaScript代码可以更高效、更安全地运行。 要实现防刷新访问记数器,我们可以遵循以下步骤: 1. **存储状态**:由于我们希望在页面刷新时...

    使用 JavaScript 编写的卡片交换游戏(附源代码).zip

    项目:使用 JavaScript 编写的卡片交换游戏(附源代码) javascript 中的卡片交换游戏是使用 HTML、CSS 和 JavaScript 开发的。谈到游戏玩法,这个游戏的主要目标是找出正确的卡号和面卡。您所要做的就是输入正确的...

Global site tag (gtag.js) - Google Analytics