- 浏览: 90516 次
文章分类
最新评论
许多程序员不会规划他们的JS代码。我们经常快速写完代码、运行、提交。但当我们继续开发遇到变量和函数时不得不再次回头查看它们代表的含义,麻烦就从这里开始了。同样当我们在其他程序员手中获取脚本也会遇到类似的错误。
因此,当我们说”this is done, I can go on”时最好对脚本做下列5件事情。
问题描述
现在我们想给每一个带有class属性为collapsible的DIV内部添加超链接A,来显示和隐藏DIV。
下面是用模块函数编写的实现代码:
上面的代码已经很准确的实现了我们想要的结果。但是我们还可以对上面的代码进一步的重构。
第一步:样式(CSS)与行为(JavaScript)分离
我们可以用添加一个CSS的class选择器来消除通过JS中设置的样式。这种现象在新手中经常遇到.
第二步:对代码进一步性能优化
这里我们可以做两件事情:1、循环语句中secs的length属性可以用变量保存。2、为事件处理器创建重用的函数。好处是减少事件处理器数量,减少内存占用。
第三步:添加配置对象
使用配置对象存放代码中的硬编码,如使用到的文本标签或自定义的属性名。有利于后续的维护。
第四步:为变量和函数起有含义的名字
第五步:添加必要的注释
因此,当我们说”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; } })();
发表评论
-
javascript如何检查浏览器是否支持flash?
2014-08-14 21:59 714如何用javascript脚本检查浏览器是否支持flash?初 ... -
js脚本如何判断checkbox是否选中?
2014-08-13 06:21 580分享下js判断是否选中CheckBox的方法。 代 ... -
js获取IP地址有哪些方法
2014-08-13 06:20 639js获取IP地址方法总结 (http://www.cnblo ... -
java 判断邮箱格式是否正确
2014-08-12 06:24 605java 判断邮箱格式是否正确,电话号码是否正确。 代码 ... -
js判断邮箱格式是否正确 的几个例子
2014-08-12 06:22 1656判断邮箱格式是否正确 - (void)viewDid ... -
javascript页面刷新的多种方法
2014-07-25 06:16 427javascript页面刷新的几种方法 ... -
js截取中英文字符串、标点符号无乱码
2014-04-18 06:47 658js截取中英文字符串、标点符号无乱码。 <script& ... -
ajax返回json类型的数据 js处理json类型的数据
2013-12-27 07:07 522ajax验证用户名 index_do. ... -
PHP AJAX实现省市联动
2013-12-27 07:02 6351,province.php <html> ... -
javascript判断两个IP地址是否在同一个网段
2013-12-14 08:34 1287要判断两个IP地址是否在同一个网段,将它们的IP地址分别与子 ... -
js设置在iframe框架中指定div不显示
2013-12-05 06:27 573在iframe框架中指定div不显示,有多种实现方法,接下来 ... -
JS验证URL函数 正则
2013-08-25 11:01 1154一个JS验证URL函数,分享下。 这个url的正则表达式判 ... -
js正则解析URL参数的代码
2013-08-25 10:59 846使用js正则解析URL参数的实现代码。 如下: var url ... -
jquery indexOf使用方法
2013-08-20 06:56 1803当无法确定在某个字符串中是否确实存在一个字符的时候,就可调用 ... -
css和jquery设置文字的显示和隐藏
2013-08-20 06:50 589文字的显示和隐藏。 1.先设置为none: <sp ... -
javascript radio值获取代码
2013-08-18 12:20 10621,用js获取radio的值。 <!DOCTYPE h ... -
jQuery中获取Radio元素值的方法
2013-08-18 12:17 688jQuery中获取Radio元素值的方法。 又发现自己写的Ja ... -
javascript判断机器是否联网的2种方法
2013-08-09 23:47 1050只有机器已经联网以后 ... -
JavaScript修改css样式style的方法介绍
2013-06-20 21:30 940介绍下用JavaScript修改网页样式的方法。 一、局部改 ... -
理解javaScript 数值型和字符串型之间的转换
2013-06-13 23:04 869理解javaScript中数值型和字符串型之间的转换,分享下, ...
相关推荐
为了避免这种情况,下面列出了在完成JavaScript代码前应当做的五件事。 第一件:样式(CSS)与行为(JavaScript)分离 在JavaScript代码中直接添加样式会使得代码难以维护。建议使用CSS来控制样式,这样可以使样式更加...
每个按钮代表一个数字或运算符,它们通过事件监听器与JavaScript代码关联。当用户点击按钮时,对应的函数会被调用,从而触发相应的操作。 例如,你可以创建一个函数`addNumber(number)`用于处理数字输入,另一个...
- `images` 文件夹很可能包含了游戏所需的所有图像资源,如角色、背景、道具等,这些图片在JavaScript代码中被引用,以创建游戏的视觉效果。 - `js` 文件夹则包含JavaScript源代码,这是游戏逻辑的核心,包括游戏...
学习了javascript ,这个代码是使用javascript来做一个简单的计算器,可以实现简单的额加减乘除的计算
在JavaScript编程中,实现选项卡效果是一种常见的交互设计,它能帮助用户更直观地浏览和切换...在这个例子中,虽然没有提供完整的JavaScript代码,但我们可以推断出大致的逻辑和需要完成的步骤,从而实现预期的功能。
这份"1000份前端js代码模板可做工具类"资源集合,旨在为开发者提供大量的代码片段和实用工具,帮助他们更高效地完成项目开发。下面,我们将深入探讨这些标签所涵盖的知识点,并结合资源中的文件名"js代码1000个"来...
这种做法并不常见,一般我们会直接在`<script>`标签内编写JavaScript代码。 ### 2. 变量声明与赋值 JavaScript支持多种变量声明方式,包括`var`、`let`和`const`。其中`var`是最传统的声明方式,在ES6之前被广泛...
【标题】:“用JS做的一个关于淘宝网的网站”揭示了这个项目主要使用JavaScript语言来构建,目的是模拟或实现一个类似于淘宝网的功能。JavaScript是一种广泛应用于客户端Web开发的编程语言,它允许在用户浏览器上...
首先,HTML5是超文本标记语言的第五个版本,它在前一代的基础上增加了许多新特性,如离线存储(localStorage)、拖放功能(drag and drop)、媒体元素(video/audio)以及Canvas画布等。在这个项目中,Canvas可能是...
项目:使用 JavaScript 编写的 Muffle Runner 游戏及其源代码 javascript 中的 muffle runner 游戏是一款基于平台的游戏。整个编程都使用 HTML、CSS 和 JavaScript。这款游戏完全使用 javascript 编写,并使用了一些...
完成每个关卡后,难度级别会越来越高。玩家必须在时间耗尽之前点击每个蓝点。游戏屏幕上蓝点与红点混合散布。你必须小心,不要点击红点。谈到这款游戏的 PC 控制,一切都很简单。你只需要使用鼠标光标并单击鼠标左键...
项目:JavaScript 掷骰子游戏及源代码 javascript 中的掷骰子游戏是一款基于骰子的游戏。整个编程都使用 HTML、CSS 和 JavaScript。这款游戏完全使用 javascript 编写,并使用了一些精灵图像。您可以简单地使用任何...
2. 编写JS代码:根据QQ的API文档编写JavaScript代码,设置客服的显示位置、样式以及触发事件(如鼠标悬停、点击等)。 3. 调整样式:为了实现滑动伸缩效果,需要通过CSS来控制客服图标的隐藏、显示以及动画效果。 4....
1. `index.html` - 主HTML文件,包含基本的HTML结构和JavaScript代码片段。 2. `style.css` - CSS样式表,用于定义菜单的外观和行为。 3. `script.js` - JavaScript脚本文件,处理事件监听、DOM操作和Ajax请求。 4. ...
`Buttons`目录可能包含了与游戏按钮相关的JavaScript代码,这些按钮可能是游戏中的操作触发器,比如让汤姆猫做出反应或者播放声音。JavaScript也用于处理用户的输入事件,如点击、触摸或键盘输入,以及实现游戏的...
而描述中的“全部用JS完成,一个JS高手做的,特转载”进一步强调了这个项目完全依赖JavaScript技术,并且是由一位经验丰富的JavaScript开发者编写的。考虑到标签中提到了“JS,excel”,我们可以推测这个项目可能涉及到...
### 如何组织你的JavaScript代码 在现代Web开发中,JavaScript已成为不可或缺的一部分,它的重要性随着Web应用变得越来越复杂而日益凸显。对于ASP/JSP程序员来说,掌握如何高效地组织JavaScript代码是一项重要的...
这样做的好处是能够利用.NET的类型系统、垃圾收集以及强大的类库,使得JavaScript代码可以更高效、更安全地运行。 要实现防刷新访问记数器,我们可以遵循以下步骤: 1. **存储状态**:由于我们希望在页面刷新时...
项目:使用 JavaScript 编写的卡片交换游戏(附源代码) javascript 中的卡片交换游戏是使用 HTML、CSS 和 JavaScript 开发的。谈到游戏玩法,这个游戏的主要目标是找出正确的卡号和面卡。您所要做的就是输入正确的...