5. 最佳实践
5.1 过去的错误
5.2 平稳退化
讨论在用户点击某个链接时弹出一个新窗口
(注意:应该只在绝对必要的情况下才使用弹出窗口,因为这牵涉到网页的可访问性问题)
JavaScript使用window对象的open()方法来创建新的浏览器窗口,该方法有三个参数
window.open(url,name,features)
这三个参数都是可选的
- 第一个参数是网页的URL地址,忽略后屏幕上将弹出一个空白的浏览器窗口
- 第二个参数是新窗口的名字
- 第三个参数是一个以逗号分割的字符串,其内容是新窗口的各种属性(少而精)
该方法是使用BOM的一个好案例,对文档的内容没有任何影响,只和浏览环境有关
下面这个函数是window.open()方法的一种典型应用:
function popUp(winURL){
window.open(winURL,"popup","width=320,height=480");
}
会影响到网页的只是:我将如何使用这个函数
调用popUp函数的一个办法就是使用伪协议
5.2.1 "javascript:"伪协议
"javascript:"伪协议让我们通过一个连接来调用JavaScript函数
具体做法:
<a href="javascript:popUp('http://www.example.com/')">Example</a>
5.2.2 内嵌的事件处理函数
5.3 向CSS学习
5.3.1 结构与样式的分离
5.3.2 渐进增强
5.4 分离JavaScript
//把调用popUp()函数的onclick事件添加到有关的链接
//var links = document.getElementsByTagName("a"); 在JavaScript文件被加载时立刻执行
//必须让这些代码在文档全部加载后马上开始执行
window.onload = prepareLinks;
function prepareLinks(){
var links = document.getElementsByTagName("a");
for(var i=0; i<links.length; i++){
if(links[i].getAttribute("class")=="popup"){
links[i].οnclick=function(){
popUp(this.getAttribute("href"));
return false;
}
}
}
}
function popUp(winURL){
window.open(winURL,"popup","width=320,height=480");
}
5.5 向后兼容
5.5.1 对象检测
if(!method){
return false;
}
插入一条if语句去检查浏览器是否理解所调用的方法
window.onload = function(){
if(!document.getElementsByTagName return false;
var links = document.getElementsByTagName("a");
for(var i=0; i<links.length; i++){
if(links[i].getAttribute("class")=="popup"){
links[i].onclick=function(){
popUp(this.getAttribute("href"));
return false;
}
}
}
}
5.5.3 浏览器嗅探技术
5.6 性能考虑
5.6.1 尽量少访问DOM和尽量减少标记
不管什么时候,只要是查询DOM中的某些元素,浏览器都会搜索整个DOM树,从中查找可能匹配的元素
尽量减少文档中的标记数量,过多不必要的元素只会增加DOM树的规模,进而增加遍历DOM树以查找特定元素的时间
5.6.2 合并和放置脚本
包含脚本的最佳方式就是使用外部文件,因为外部文件与标记能清晰地分离开,而且浏览器也能对站点中的多个页面重用缓存过的相同脚本
把所有script标签都放到文档的末尾,body标记之前,就可以让页面变得更快。
即使这样,在加载脚本时,window对象的load事件依然可以执行对文档进行的各种操作
5.6.3 压缩文本
即把脚本文件中不必要的字节,如空格和注释,统统删除
有很多程序可以做这件事
5.7 小结
本章介绍了一些与DOM脚本编程工作有关的概念和实践
- 平稳退化
- 分离JavaScript
- 向后兼容
- 性能考虑