技术观点:jQuery仅仅是一个浏览器API(上)
来源:互联网 发布:discuz json api接口 编辑:程序博客网 时间:2024/05/15 05:36
以往开发者只能用JavaScript开发一些相对简单的DOM和XHR,但是随着JavaScript功能的不断丰富,开发者采用的技术正在逐渐发生改变。其中一个明显的表现就是:现在使用jQuery和一些嵌套绑定事件就可以构建一个系统了。jQuery是一个非常高效的浏览器API,它能够有效隐藏代码本身的复杂度,同时可以将常见的错误处理封装起来,开发者需要将自己的代码有效组织起来并充分利用已有的代码。
嵌套函数
即使只是实现一些简单的功能,也应该在代码中尽量使用绑定的事件。原因主要有以下几点:首先,程序内部的状态通常是难以跟踪的,但是绑定事件的状态通常是很容易查询到的。
如果开发者想要使用click回调函数,那么他必须了解当前环境和上层环境的有关信息,同时还需要处理一些意外操作(如再次调用了jQuery对象);其二,每个回调函数都包含了一些状态信息,这表明函数的所有信息将会从回调函数的返回值中带出。如果合理利用这些状态信息,那么这将是使用函数编程的优势,但是通常这种方式只会增加程序的复杂度和造成无谓的内存开销;第三点,也是最重要的一点,函数内部的代码和回调函数只能在当前环境中使用,在其他环境中将无法复用。
基于对象而非基于过程
当然,开发者也可以使用JavaScript编写函数功能模块,但是在这方面,JavaScript缺乏其他面向过程编程语言的简洁性和优雅性。局部应用、模式匹配、尾部调用优化以及简单组织这些特点都是JavaScript所不具备的。对于大多数的开发者而言,还不习惯使用JavaScript编写传统的功能函数。而JavaScript目前更多地还是作为一种面向对象的编程语言。
许多JavaScript库提供了一种模拟其他编程语言的机制。MooTools就是一个典型的例子:MooTools中的Class构造函数支持继承、混合等功能。对于没有丰富的JavaScript开发经验的开发者来说,可以利用这一工具熟悉JavaScript的开发方式;而如果你想在jQuery中使用DOM,那么你甚至可以不用调用MooTools DOM API而是直接下载一个生成器。
此外,许多客户端的软件涉及到JavaScript对象和DOM间的状态管理。Backbone和Sproutcore这类库提供了一种类替换模型。Yehuda Katz在他的“Getting Truth Out of the DOM”讲话中表示:最好利用现成的方法管理DOM和JavaScript间的复杂状态。将现有的各种库组织起来,将为应用程序提供足够丰富的功能。
最后,你也可以使用JavaScript提供的(gasp)原型系统。但是对于不熟悉JavaScript的基于对象模型的开发者来说,这可能是万不得已时的一个选择。但是你可以创建一个构造函数,并在在上面定义自己的方法,以后你就能在其他函数里面复用这些方法了。即使你并没有用到JavaScript的原型系统,对JavaScript的构造函数有所了解也是非常有必要的。
jQuery保留了与DOM交互的主要方法。当你在一个往一个更高级的方法中传入一个对象方法参数时,你必须为它绑定一个环境(如:this)。
jQuery 和Function.prototype.bind
jQuery中可以使用$.proxy方法完成环境绑定工作。也就是说,在调用一个方法时,可以使用$.proxy指定this的值。this的功能是非常强大的,下面是我们构建的一个模糊类型的库。
在这个例子中,当调用jQuery封装的DOM对象的构造函数时,如果这个对象包含了一个文本框,那么这个文本框将显示出来。它将一个onCloseClick方法绑定到一个单击动作上,当用户单击与div.close匹配的子元素时,就会触发这个onCloseClick方法。但现在的问题是:当点击事件被触发但该事件上的DOM元素没有触发时,onCloseClick对象中的this的值并不是AlertArea对象。为了保证this值是AlertArea对象,必须在调用时为它绑定相应的方法。
这个方法中有两个参数:一个环境参数(newThis)以及一个方法参数(fn)。它创建了一个新方法,通过apply方法就可以在新的环境中调用一个已有的方法了。通常这类函数是在prototype中定义的。
有了这个定义,改变click的绑定后,onCloseClick方法中的this的值也会相应地改变。
(未完待续)
文章来源:
文章来源:jQuery is just a browser API
- 技术观点:jQuery仅仅是一个浏览器API(上)
- 技术观点:jQuery仅仅是一个浏览器API(下)
- 技术仅仅是一个工具
- 仅仅是一个开始
- 仅仅是一个测试而已!
- 头脑仅仅是一个实验室
- 仅仅是一个开始
- 基本概念 上(C API 级别的使用观点)
- 观点:如何做一个好的技术型领导
- 一个开端,也仅仅是一个开端
- DBus 入门与应用--基本概念 上(C API 级别的使用观点)
- DBus 入门与应用--基本概念 上(C API 级别的使用观点)
- 火狐浏览器 上运行的一个bug
- 为什么Google会显得如此成功仅仅是技术吗?(ZT)
- 《金融时报》为什么Google会显得如此成功仅仅是技术吗?
- 对opera手机浏览器的一些观点
- 404观点丨技术好情商一般,和情商高技术一般,在提高工作效率上哪个更占优势?
- 难道Chrome OS仅仅是Linux的另外一个版本?
- asp.net通过反射获取类中定义的枚举
- JS。某static方法之类。
- Android内存泄露利器(RSS内存统计篇)
- MFC中CListCtrl控件的用法
- mysql 利用mysqlbinlog通过binlog增量备份,还原实例
- 技术观点:jQuery仅仅是一个浏览器API(上)
- 空
- response.setHeader("Cache-Control","no-cache"); 作用
- 采用SmtpClient方式发送邮件,如果服务器的名字中有中文,会报"在邮件标头中找到无效的字符”"错误
- java reflect机制
- Hibernate的工作过程
- 技术观点:jQuery仅仅是一个浏览器API(下)
- 自己写的链表
- 动漫达人之模型 (更新完毕)