案例研究:图片库改进版

我们在学校里学过一种理论,叫做结构化程序设计。其中有这样一条原则:函数应该只有一个入口和一个出口。从理论上讲,我很赞同这项原则;但在实际工作中,过分拘泥于这项原则往往会使代码变得非常难以阅读。如果为了避免留下多个出口点而去改写那些if语句的话,这个函数的核心代码就会被掩埋在一层又一层的花括号里,就像下面这样:

function prepareGallery(){

if (document.getElementsByTagName){

if (document.getElementById){

if(document.getElementById("imagegallery")){

statements go here...

}

}

}

}

我个人认为,如果一个函数有多个出口,只要这些出口集中出现在函数的开头部分,就是可以接受的。就像下面这样:

function prepareGallery(){

if (!document.getElementsByTagName) return false;

if(!document.getElementById) return false;

if(!document.getElementById("imagegallery")) return false;

statements go here...

}

注意:在为变量命名时一定要谨慎从事。有些单词在Javascript 语言里有特殊的含义和用途,这些统称为“保留字”的单词不能用做变量名。另外,现有Javascript 函数或方法的名字也不能用来命名变量。不要使用诸如alert、var或if之类的单词作为变量的名字。

共享onload事件

假设我有两个函数:firstFunction 和 secondFunction。如果想让它们俩都在页面加载时得到执行,我该怎么办?如果把它们逐一绑定到onload事件上,它们当中将只有最后那个才会被实际执行:

window.onload = firstFunction ;

window.onload = secondFunction;

secondFunction将取代firstFunction 。

有一种方法可以让我避过这一难题:可以先创建一个匿名函数来容纳这两个函数,然后把那个匿名函数绑定到onload事件上,如下所示:

window.onload = function(){

firstFunction ();

secondFunction();

}

它确实能很好地工作——在需要绑定的函数不是很多的场合,这应该是最简单的解决方案了。

这里还有一个弹性最佳的解决方案——不管你打算在页面加载完毕时执行多少个函数,它都可以应付自如。这个方案需要额外编写一些代码,但好处是一旦有了那些代码,把函数绑定到window.onload事件就非常容易了。

这个函数的名字是addLoadEvent,它是由Simon Willison编写的。它只有一个参数:打算在页面加载完毕时执行的函数的名字。

下面是addLoadEvent函数将要完成的操作:

1,把现有的window.onload事件处理函数的值存入变量oldonload。

2,如果这个处理函数上还没有绑定任何函数,就像平时那样把新函数添加给它。

3,如果这个处理函数上已经绑定了一些函数,就把新函数追加到现有指令的末尾。

下面是addLoadEvent函数的代码清单:

function addLoadEvent(func){

var oldonload = window.onload;

if(typeof window.onlaod != 'function'){

window.onload = func;

}else{

window.onload = functoin(){

oldonload();

func();

}

}

}

这将把那些在页面加载完毕时执行的函数创建为一个队列。如果想把刚才那两个函数添加到这个队列里去,只需写出以下代码就行了:

addLoadEvent(firstFunction);

addLoadEvent(secondFunction);

键盘访问

并不是所有用户都使用鼠标。比如说,有视力残疾的用户往往无法看清屏幕上四处移动的鼠标指针,他们往往更喜欢使用键盘。

有个名叫onkeypress的事件处理函数是专门用来处理键盘事件的。按下键盘上任何一个按键都会触发onkeypress事件。

如果想让onkeypress事件与onclick事件触发同样的行为,可以简单地把有关指令复制一份:

links[i].onclick = function(){

return showPic(this)?false:true;

}

links[i].onkeypress = function(){

return showPic(this)?false:true;

}

还有一种更简单的办法:

links[i].onkeypress = links[i].onclick;

但是onkeypress 函数很容易出问题。用户每按下一个按键都会触发它。在某些浏览器里,甚至包括Tab键!这意味着如果绑定在onkeypress 事件上的处理函数上返回的是false,那些只使用键盘访问的用户将永远无法离开当前链接。

那这些只使用键盘的人可怎么办?

幸运的是,onclick事件处理函数比我们想象的聪明。虽然它的名字"onclick"给人一种它只与鼠标点击动作相关联的印象,但事实却并非如此:在几乎所有的浏览器里,用Tab键移动到某个链接然后按下回车键的动作也会触发onclick事件。

最好不要使用onkeypress事件处理函数。onclick事件处理函数已经能够满足需要。虽然它叫”onclick“,但它对键盘访问的支持相当完美。

<!--

作者:纤锐
出处:http://www.cnblogs.com/beginner2014/p/4166582.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。谢谢合作。

-->

JavaScript DOM 编程艺术(第2版)读书笔记(6)的更多相关文章

  1. Javascript DOM 编程艺术(第二版)读书笔记——基本语法

    Javascript DOM 编程艺术(第二版),英Jeremy Keith.加Jeffrey Sambells著,杨涛.王建桥等译,人民邮电出版社. 学到这的时候,我发现一个问题:学习过程中,相当一 ...

  2. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  3. 《JavaScript DOM编程艺术(第二版)》读书总结

    这本书是一本很基础的书,但对于刚入前端不久的我来说是一本不错的书,收获还是很大的,对一些基础的东西理解得更加透彻了. 1.DOM即document object model的缩写,文档对象模型,Jav ...

  4. 【读书笔记】读《JavaScript DOM 编程艺术-第2版》

    1.DHTML DHTML曾被认为是HTML/XHTML.CSS和JavaScript相结合的产物,就像今天的HTML5那样,但把这些东西真正凝聚在一起的是DOM.如果真的需要来描述这一过程的话,“D ...

  5. Javascript DOM 编程艺术(第二版)读书笔记——DOM基础

    1.DOM是什么 D=document(文档) O=object(对象) M=Model(模型) DOM又称节点树 一些术语: parent(父)   child(子)   sibling(兄弟)   ...

  6. JavaScript -- JavaScript DOM 编程艺术(第2版)

    /* 渐进增强 平稳退化 网页 结构层(structural layer): HTML 表示层(presentation layer): CSS <link rel="styleshe ...

  7. 《JavaScript DOM 编程艺术 第 2 版》

    第 5 章 最佳实践 平稳退化:现在基本所有带交互的网站都使用 Ajax,SAP 也火起来了,平稳退化真是很难实现了(看到第七章发现我之前的观点是错了) 分离 JS 向下兼容 性能考虑 第 6 章 案 ...

  8. JavaScript DOM编程艺术读后感(1)—— 平稳退化

    最近,在读<JavaScript DOM编程艺术(第二版)>这本书,想着将自己的读后感记录下来,作为记忆吧. 其实我并不是最近才刚开始读这本书的,我读了有一段时间了.我是一名web前端开发 ...

  9. JavaScript DOM编程艺术(第2版)的简单总结

    介绍 JavaScript DOM编程艺术(第2版)主要讲述了 JavaScript.DOM 和 HTML5 的基础知识,着重讲述了 DOM 编程,并通过几个实例演示了具有专业水准的网页开发. 下面介 ...

  10. 《JavaScript Dom 编程艺术》读书笔记-第4章

    我的前端入门第一本书是<JavaScript Dom 编程艺术>,网上查找资料发现前端的入门推荐书籍最受好评的就是这本和<JavaScript 高级程序设计>了.之所以先选这本 ...

随机推荐

  1. swift 同步加载图片

    import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...

  2. ios理解 -- Pro Mutlithreading and Memory Management for iOS and OS X with ARC, Grand Central Dispatch, and Blocks

    Capturing automatic variables Next, you need to learn what the “together with automatic (local) vari ...

  3. UILabel详解

    // ----------------------UILabel--------------------------- UILabel *label = [[UILabel alloc] initWi ...

  4. mysql之innodb_buffer_pool

    1>.mysqld重启之后,innodb_buffer_pool几乎是空的,没有任何的缓存数据.随着sql语句的执行,table中的数据以及index 逐渐被填充到buffer pool里面,之 ...

  5. 2.Spring Web MVC的优势

    清晰的角色划分:前端控制器(DispatcherServlet).请求到处理器映射(HandlerMapping).处理器适配器(HandlerAdapter).视图解析器(ViewResolver) ...

  6. 链表操作,空间复杂度要求为O(1)

    对于O(1)的空间复杂度要求,不能对链表进行复制等操作,双指针法对处理该类问题比较有效. 同时由于链表头结点的特殊性,可以考虑引入一个空的头结点来辅助操作.

  7. C++Primer 第六章

    //1.我们通过调用运算符来执行函数.调用运算符的形式是一对圆括号,他作用于一个表达式,该表达式是一个函数或者指向函数的指针.圆括号之内是用逗号分隔的实参列表,用于初始化函数形参.调用表达式的类型就是 ...

  8. 转:python webdriver API 之分页处理

    对于 web 页面上的分页功能,我们一般做做以下操作:  获取总页数  翻页操作(上一页,下一页) 对于有些分页功能提供上一页,下一页按钮,以及可以输入具体页面数跳转功能不在本例的讨论范围. .. ...

  9. Geek version acm pc^2 direction for user

    gogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogogo ...

  10. [原创]java WEB学习笔记57:Struts2学习之路---ActionSupport类的说明

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...