最近在看JavaScript DOM 编程艺术,总结一下JavaScript编写Web脚本的规范与实现,对于实现有以下几点要求:

  • 平稳退化:确保网页在没有JavaScript下也能正常运行
  • 分离JavaScript:把网页内容与结构与JavaScript行为完全分离
  • 向后兼容:当JavaScript使用新的API时老版本的浏览器正常运行
  • 提升性能:让JavaScript执行的性能最优

平稳退化

JavaScript通过DOM(文本对象模型)来访问HTML页面的各个节点。但是有些网页被浏览器禁用了JavaScript的功能。这就使得JavaScript运行的脚本不能正常工作,此时我们应该确保就算脚本不能工作页面也要正常显示。这样就达到了平稳退化的目的。

对于某些行为比如点击某个链接需要触发某一个操作,此时我们一般通过JavaScript函数与onclick事件绑定来实现:

<a href="#" onclick="function_1(`http://www.ggghub.com`); return false;">GGGHub's Blog</a>

如果此时浏览器禁用了JavaScript功能那么这个链接就废掉了,我们想要做到平稳退化只要把代码改写成:

<a href="http://www.ggghub.com" onclick="function_1(`http://www.ggghub.com`); return false;">GGGHub's Blog</a>

此时就算JavaScript被禁止了这个链接还是生效的。虽然可能不会达到我们想要的预期但是总比一个这个链接毫无用处强。


分离JavaScript

对于上面写的例子扩展一下,如果此时有多个链接:

<ul>
<li>
<a href="http://www.ggghub.com" onclick="function_1(`http://www.ggghub.com`); return false;">GGGHub's Blog</a>
</li>
<li>
<a href="http://blog.csdn.net/ggghub" onclick="function_1(`http://blog.csdn.net/ggghub`); return false;">GGGHub's CSDN</a>
</li>
<li>
<a href="https://github.com/ggghub" onclick="function_1(`https://github.com/ggghub`); return false;">GGGHub's GitHub</a>
</li>
</ul>

可以看出来此时在页面里充斥着JavaScript代码。我们虽然知道在HTML中head标签引入js文件但这远远不够。

<head>
<script type="text/javascript" src = "example.js" />
</head>

这样写虽然把大部分的js代码写在一个单独的文件里,但上面一些事件还绑定着js函数,这样如果我此时想给这些事件更换js的函数或者参数那么就不得不挨个查找和替换。如果跟js相关的都放在单独的文件里那么修改起来就不是很麻烦。需要修改如下:

<ul>
<li>
<a href="http://www.ggghub.com">GGGHub's Blog</a>
</li>
<li>
<a href="http://blog.csdn.net/ggghub">GGGHub's CSDN</a>
</li>
<li>
<a href="https://github.com/ggghub">GGGHub's GitHub</a>
</li>
</ul>

相关js文件里面的修改

window.onload = function (){
var links = document.getElementsByTagName("a");
for (var i = 0; i < links.length; i++) {
links[i].onclick = function(){
function_1(this.getAttribute("href"));
return false;
};
links[i].onkeypress = links[i].onclick;
}
}

这样就把JavaScript相关的行为完全从页面中分离了出来。如果此时想要更改相关链接的行为,只要在js文件中修改一处即可。


向后兼容

不同的浏览器对JavaScript支持各不一样,大多数浏览器都支持DOM但是有些老版本的浏览器可能对DOM的支持不是很好所以我们再用JavaScript时要考虑到如果浏览器不支持DOM的某些方法怎么办。

如果考虑向后兼容我们就要判断我们所用的方法可不可以使用。然后如果方法不可用我们再处理不可用的情况。例如我们常用的一些DOM方法

  • getElementsByTagName
  • getElementById
  • getAttribute
  • createElement
  • createTextNode



    实现向后兼容很简单只要依次判断这些方法是否可用
function example(){
if (!document.getElementsByTagName) return false;
if (!document.getElementById) return false;
if (!document.getAttribute) return false;
if (!document.createElement) return false;
}

然后根据返回值来处理当这些方法不可用的情况


提升性能

提升JavaScript对Web的性能应该从下面几个方向去考虑

减少访问DOM减少标记

多次重复通过脚本访问DOM会对性能产生极大的影响例如:

    window.onload = function (){
for (var i = 0; i < document.getElementsByTagName("a").length; i++) {
document.getElementsByTagName("a")[i].onclick = function(){
function_1(this.getAttribute("href"));
return false;
};
document.getElementsByTagName("a")[i].onkeypress = document.getElementsByTagName("a")[i].onclick;
}
}

这样做每次一个循环都要多次搜索整个DOM来获取节点,极大的浪费了性能。最好的做法就是只搜索一次DOM然后把结果放在一个变量里。之后对变量进行操作对于前者极大的提升的性能。

还有一点就是减少标记这样DOM本身规模减少,加快搜索DOM的时间。


合并脚本

对于HTML引用脚本文件可能存在多个脚本文件要一起使用例如

<script type="text/javascript" src="example1.js"></script>
<script type="text/javascript" src="example2.js"></script>
<script type="text/javascript" src="example3.js"></script>
<script type="text/javascript" src="example4.js"></script>

这样HTML要多次请求加载js文件。如果把这些文件合并成一个那么只需要请求加载一次即可。

关于script标签放置

script标签有多种放置方法。放在标签中或者标签中

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src=""></script>
</head>
<body>
<script type="text/javascript" src=""></script>
</body>
</html>

如果放在中那么浏览器在加载页面时会先加载js文件,如果js文件加载不出来那么页面其它内容也不会显示。但是如果放在页面最后之前就会优先加载页面。

压缩代码

将代码中不必要的字节去掉,例如空格,注释,换行符等来压缩文件大小,也用专门的工具来进行代码压缩。

JavaScript编写Web脚本最佳实现的更多相关文章

  1. ECMAScript进化史(1):​话说Web脚本语言王者JavaScript的加冕历史

    互联网起火-Web时代的来临 在行文之前,反手就安利一下<浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战>. 浏览器始祖NCSA Mosaic在1993年1月发布(于1992 ...

  2. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  3. 编写Shell脚本的最佳实践

    编写Shell脚本的最佳实践 http://kb.cnblogs.com/page/574767/ 需要记住的 代码有注释 #!/bin/bash # Written by steven # Name ...

  4. 4.3.6 对象的界定通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。 注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。

    如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则.例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction ...

  5. JavaScript Web 应用最佳实践分析

    [编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ...

  6. Selenium(十七):unittest单元测试框架(三) 脚本分析、编写Web用例

    1. 带unittest的脚本分析 也许你现在心里还有疑问,unittest框架与我们前面所编写的Web自动化测试之间有什么必然联系吗?当然有,既然unittest可以组织.运行测试用例,那么为什么不 ...

  7. 《Professional JavaScript for Web Developers》day02

    <Professional JavaScript for Web Developers>day02 1.在HTML中使用JavaScript 1.1 <script>元素 HT ...

  8. When Colon Scripting is comming (脚本最佳体验)

    当冒号脚本来临-- 脚本最佳体验 冒号指派 说明; 冒号替代等号指派赋值,当命名声明指派时指定.相当于声明当前作用域的一个名字指派. 当对指定对象的属性赋值时候,依旧请使用等号.即不废弃等号赋值功用, ...

  9. 学习 Linux,101: 自定义或编写简单脚本【转】

    转自:http://www.ibm.com/developerworks/cn/linux/l-lpic1-105-2/index.html 学习如何使用标准的 shell 语法.循环和控制结构,以及 ...

随机推荐

  1. MyBatis学习总结(8)——Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

  2. SQL SERVER-主键的建立和删除

    PRIMARY KEY 约束唯一标识数据库表中的每条记录.主键必须包含唯一的值.主键列不能包含 NULL 值.每个表都应该有一个主键,并且每个表只能有一个主键.主键约束操作包含了添加约束和删除约束,修 ...

  3. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER

    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER ...

  4. 初识Dubbo 系列之5-Dubbo 成熟度

    成熟度 功能成熟度 Feature特征 Maturity成熟度 Strength强度 Problem问题 Advise建议 User用户 并发控制 Tested 并发控制   试用   连接控制 Te ...

  5. linux openssl加密文件

    openssl 支持的加密算法 -aes-128-cbc -aes-128-cfb -aes-128-cfb1 -aes-128-cfb8 -aes-128-ecb -aes-128-ofb -aes ...

  6. nova shelve 的使用

    对于云中的资源我们常有例如以下需求 1,用户对临时不使用的VM进行停止操作.以节省费用. 2.对于长时间未使用的VM.管理员想要从hypervisor层面上清除它们从而节省主机资源. 3.但之前的停止 ...

  7. jmeter脚本编写之五类常见请求编写

    1.普通post请求 2.普通json请求 3.带query參数的json请求 4.xml请求 5.上传请求 starting (Windows系统 点击 F12 调出开发人员工具,选择Network ...

  8. JavaScript事件驱动机制&amp;定时器机制

    在浏览器中,事件作为一个极为重要的机制,给予JavaScript响应用户操作与DOM变化的能力.在NodeJS中.异步事件驱动模型则是提高并发能力的基础. 一.程序怎样响应事件 程序响应外部的事件有两 ...

  9. ElasticSearch Shard——本质上是做分布式扩展,副本对于集群的稳定性有很强的影响

    什么是一个Shard? Shard就是一个Lucene Index,参照文章(深入理解Shard和Lucene Index). Index需要多少个Shard? 回答这个问题,我们需要先谈谈节点,一个 ...

  10. 发送HTTP请求 -- HttpUtil

    1. package com.step.utils; import java.io.IOException; import java.net.URLDecoder; import java.util. ...