JS代码指导原则

一.什么是平稳退化?

如果含有JS代码的网页在用户浏览器不支持JS(或者禁用JS)时,用户仍然能够顺利浏览(网站功能正常,只是视觉效果可能差一些),那么这个网页就能够平稳退化

网页能够平稳退化是很必要的,因为JS向来名声不好(各种广告,各种弹窗,甚至还有XSS等等阴暗的东西),所以有一个用户群是习惯禁用浏览器的JS支持的,这个用户群可能不大,但是作为编码人员应该尽量让自己的代码尽可能的完善(就像培养自己的孩子一样),我们应该考虑到这种情况,给各种用户完美的体验

如果上面的理由还不够充分,那么可能有一点更值得重视:SEO,也就是搜索引擎优化,想让自己的网站在搜索结果里靠前些,就有必要做好SEO,搜索引擎的搜索机器人无法理解JS代码的含义,所以搜索机器人相当于一个坚持使用老式浏览器(不支持JS)的用户,显然,这个用户很重要

二.怎样才能平稳退化?

要平稳退化只需要遵循一个原则:渐进增强

所谓的“渐进增强”就是用一些原始的可靠的方法去实现最基本最重要的功能,先保证功能的完整,再用一些额外的信息层去包裹原始页面(实现显示特效,实现更好的视觉效果和用户体验),即便衣服被屏蔽了,功能仍然完整,只是可能不好看而已

把JS代码与HTML代码彻底分离就可以实现“渐进增强”,HTML是功能完整的原始层,外部JS代码是一个华丽的外衣(说起来有点像CSS,不过确实是这样,JS功能很强大,但如果过分依赖于JS代码就颠倒了主次)

三.什么是向后兼容?

向后兼容是指JS代码要能够兼容低版本的DOM(有些浏览器可能不支持最新版本的DOM,意味着某些DOM API将无法使用),例如:

最常用的DOM API可能是这些:

document.getElementById();
document.getElementsByTagName();
document.getElementsByClassName();//HTML5 DOM中的新特性

但可能有的浏览器根本不支持这些方法,或者说只支持一部分,那么页面将因为JS代码出错而无法访问,或者页面功能不再完整

之前有一种用来保证向后兼容的方法是“浏览器嗅探”技术,也就是通过BOM去问浏览器:“你支持不支持这个DOM API?”,因为浏览器实在太多了,所以一句很简单的JS代码都需要被很多层浏览器嗅探代码包裹起来,导致我们的代码变得非常臃肿

浏览器嗅探技术其实在CSS中依然存在,当然CSS无法通过BOM获取浏览器特征,所以采用了相对被动的一种方式:

/*设置透明度为0.75*/
filter: alpha(opacity =   25); /*支持 IE 浏览器*/
-moz-opacity: 0.25; /*支持 FireFox 浏览器*/
opacity: 0.25; /*支持 Chrome, Opera, Safari 等浏览器*/

DOM发展到现在已经不需要用浏览器嗅探技术来保证向后兼容了,我们可以这样做:

if(document.getElementById){
    document.getElementById();
}
if(document.getElementsByTagName){
    document.getElementsByTagName();
}
if(document.getElementsByClassName){
    document.getElementsByClassName();//HTML5 DOM中的新特性
}

这种更好的方式叫做“对象检测”技术,虽然还是不太完美(要想完美,除非浏览器市场被大一统了..),不过已经比浏览器嗅探要好很多了(至少不需要因为市场上出现一种新的浏览器而修改JS代码),对象检测不再依赖BOM,靠DOM自己检测浏览器是否支持指定的DOM API

四.JS性能优化技巧

  1. 尽量少JS访问DOM
  2. 尽量减少HTML标记
  3. 合并JS脚本
  4. script标签的位置
  5. 压缩JS代码

1.优化前:

for(var i = 0;i < document.getElementsByTagName("a");i++){
    if(document.getElementsByTagName("a")[i].getAttribute("title") == "main"){
        //do something
    }
}

优化后:

var elems = document.getElementsByTagName("a");
for(var i = 0;i < elems.length;i++){
    if(elems[i].getAttribute("title") == "main"){
        //do something
    }
}

每次调用DOM方法获取标签对象内部都是对DOM树做一次完全搜索,这是非常昂贵的操作,尽量减少DOM访问可以提高性能

2.优化前:

<div>
    <div>
        <div>
            <div>
                <div>
                    <p>
                    正文
                    </p>
                </div>
            </div>
        </div>
    </div>
</div>

优化后:

<p>
正文
</p>

这个例子可能有些极端了,不过也足够说明问题了,HTML代码应该尽量简洁(能够达到预期的表现效果就好)

3.优化前:

<scrpit src="./scripts/A.js" type="text/javascript"></script>
<scrpit src="./scripts/B.js" type="text/javascript"></script>
<scrpit src="./scripts/C.js" type="text/javascript"></script>

优化后:

<scrpit src="./scripts/All.js" type="text/javascript"></script>

浏览器在加载页面时每遇到一个script标签,如果标签指向外部脚本文件,都需要发送请求加载外部文件,如果script标签过多,这笔开销将是无法忽视的,所以应该把JS代码全部放在一个外部文件中,用一个script标签来加载

4.优化前:

<head>
    <script></script>
</head>

优化后:

<body>
    html code

    <script></script>
</body>

也就是说把script标签放在body的末尾加载最快,而且放在这里并不影响window.onload等事件的触发,至于为什么放在这个位置最快,可能和浏览器解释HTML代码的顺序有关(先加载head部分,如果head太大,会导致用户等待了很久仍然看不到body内容)

5.优化前:

var elems = document.getElementsByTagName("p");
for(var i = 0;i < elems.length;i++){
    //do something
}

优化后:

var elems=document.getElementsByTagName("p");for(var i=0;i<elems.length;i++){}

嗯,没错,优化后的代码不是给人读的,不过虽然不易读,但这样的代码体积小,使得外部文件体积缩小,当然能够提高性能

P.S.这个工作有专门的工具来帮我们做,比如JSMin等等

参考资料:《JavaScript DOM变编程艺术》

时间: 2024-10-10 21:26:03

JS代码指导原则的相关文章

openstack 升级设计要求的指导原则

不知道其他软件有没有类似的指导原则. Theory of Upgrade Grenade works under the following theory of upgrade. New code should work with old configs(新代码兼容旧的配置) The upgrade process should not require a config change to run a new release. All config behavior is supposed to

第六节:指导原则和最佳实践

理解异常机制固然重要,但同等重要的是理解如何正确使用异常.我经常发现类库开发人员捕捉所有类型的异常,造成应用程序开发人员对问题不知情.本章就异常的使用提供一些指导原则. 重要提示    如果你是类库开发人员,要设计供其他开发人员使用的类型,那么一定要严谨按照这些指导原则行事.你的责任非常重大,要精心设计类库中的类型,使之适用于各种各样的应用程序.记住,你无法做到对自己要调用的代码了如指掌,也不知道哪些代码会调用你的代码.由于无法预知使用类型的每一种情形,所以不要做出任何策略抉择,换言之,你的代码

js函数设计原则

一般认为函数指具有返回值的子程序,过程指没有返回值的子程序.C++中把所有子程序成为函数,其实那些返回值为void的 函数在语义上也是过程.函数与过程的区别更多是语义上的区别,而不是语法的区别. 语言纯化论者认为一个函数应该只有一个返回值,这和数学函数一样.即函数只接受输入(参数),通过参数运算返回结果. 除此之外的效果被称为函数的副作用,比如修改全局变量. function sum1(x, y) { return x+y }function sum2(x, y) { alert(x+y) }s

JS代码的简单重构与优化

JS代码的简单重构与优化(适合新手) 原文  http://www.cnblogs.com/similar/p/5016424.html Demo . 1 //bad if (age > 20) { return true; } else { return false; } //good return age > 20; 这种一看就明白吧,没什么说的. Demo . 2 //bad for (var i = 0; i < arr.length; i++) { //do something

何时使用引用、指针、按值传递的一些指导原则

问题提出: 1.当一个类的对象作为实参数传递时,使用值传递和引用传递有什么区别?   比如: DateType ExampleFun(CString &strFileName,...)与         DateType ExampleFun(CString strFileName,...) 解答之前,我们先来看2个基本的概念:形参和实参. ->通俗的讲:形参是形式上的参数,实参是实际的参数;->详细的讲:形参只是对实参的一种抽象类型描述,只是声明一个函数(方法)能接受什么类型的实参,

14条最佳JS代码编写技巧

http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的,下面是来自Javascript Toolbox发布的14条最佳JS代码编写技巧,Sofish翻译(1,2). 1. 总是使用 ‘var’ 在javascript中,变量不是全局范围的就是函数范围的,使用”var”关键词将是保持变量简洁明了的关键.当声明一个或者是全局或者是函数级(function-

设计指导原则

设计指导原则 一. 性能相关: 避免在循环内部new一些没有必要每次都new的对象. 所有与IO相关的操作,都需要考虑性能问题,一般采取的措施是连接池,缓存,减少调用次数,合并请求. 每个业务都要分析整个请求链路,找到瓶颈,通过压测的方式确认问题及验证解决方案. 根据业务情况,使用异步化和最终一致性. CPU,内存,网络IO,磁盘IO这些瓶颈,需要知道在合适的场景牺牲什么换取什么.通俗的讲是空间换时间,还是时间换空间.不同业务场景下,要做合理的取舍.例如多线程并发查询后merge.这个就是利用C

1在html中添加js代码的三种方式

1.第一种方式:在时间句柄后太假js代码: 例如浏览器弹出对话框; 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 3 <html> 4 <head> 5 <meta http-equiv="Content-Type" content=&qu

20行js代码制作网页刮刮乐

分享一段用canvas和JS制作刮刮乐的代码,JS部分去掉注释不到20行代码效果如下 盖伦.jpg 刮刮乐.gif HTML部分 <body> ![](img/gailun.jpg) <canvas id="canvas" width="400" height="300"></canvas> </body> 没什么要特别注意的为了效果加了些CSS样式 CSS部分 <style type=&qu