大部分情况下,我们面临的背景是:
设计者高高在上,不食人间烟火,只是提供约束,不要这样,必须那样,而不是提供方法和可以复用的API。
开发者是处于解决问题的一线,饱尝重复造轮子的疾苦,他们最需要的是快速的解决问题,以更恰当的方式工作,寻找更容易构建系统的技术和方式。
Jquery给设计者上了很好的一课。
Jquery就像一个魔法师一样,$()就像魔法棒一样,随手一指,一个木偶变复活了,一瞬间具备了各种各样的复杂的能力。
1)分离和粘合
在jquery的身上得到淋漓的体现。不仅是分离结构(structure)和行为功能(behaviour),在强调分离的同事,提供了强大的连接、粘合的能力。
1.结构 <div id="div_portlet"></div>
2.功能 function tooltip(){}
3.粘合 $("#div_portlet" ).tooltip(); //对于开发者,一行代码就达到设计上的分层分离和功能实现两个目标了。
同样是使用传统的javacript library, 所谓OO的做法如下:
<script> var tootip = new Tooltip(); //创建OO对象</script>
<div id="div_portlet" onmouseover="tooltip.display();" onmouseout="tooltip.hide();" ></div>
两者对比,可以看出,Jquery非常非常的体贴开发者,通过强内聚的API的设计,封装,再封装,一个方法包办了onmouseover和onmouseout两个事件,擦屁股的事情也解决了。
想象以前,是怎么给一个table或DIV做圆角的,很多的方案是CSS+圆角图片,很麻烦,图片的背景还要符合页面环境的颜色。
jquery是怎么做的:$("#div_portlet" ).corner(); //搞定,不需要CSS,不需要图片。
2)封装,封装,再封装
Write less. Do more, 是Jquery的口号。
也应当是每个设计者设计API牢记的,API的设计宗旨就是要,苦了我一个,幸福无数人的精神。参见【好事要做到底,我们需要full stack的API设计 】。
有人说,Jquery的代码太乱,真是有闲工夫,我还在Javaeye论坛上,见过别人说Spring的代码乱,还有人说JBPM的代码像一托屎。这些伟大的框架,都是自己封装了复杂度,竭力把最简洁的API留给使用者,让你专注于自己该做的事情。换来的却是责难。
可惜的是,我们用别人的库是,总是要做一大堆的事情,才完成一个复杂的功能。
例如我们在显示Flash Object时,使用swfObject.js 需要完成的代码是:
<script type="text/javascript">
var so = new SWFObject("../open-flash-chart/open-flash-chart.swf", "ofc", "250", "200", "9", "#FFFFFF");
so.addVariable("data-file", "../data-files/data-60.txt");
so.addParam("allowScriptAccess", "always" );//"sameDomain");
so.write("my_chart");
</script>
同样使用JQuery jQuery Flash Plugin,一条代码就搞定了。
$('#hello').flash(
{ src: 'hello.swf' },
{ expressInstall: true }
);
3) 充分利用倒钩(hook)、回调(callback) 定制行为
在API的默认behaviour不能满足要求的前提下,使用hook、callback,可以让API的调用者,可以尽最大程度的定制自己、添加自己的特殊行为。Jquery的core、Plug-in,都大量的使用了这种技巧。
如:$("div_content").toggle(); // 默认是切换hide 和 dispaly 两者行为。
如果你想在切换时,做一点其他的事情。如通知另一个控件。
可以:$("div_content").toggle(function(){
//可以发送消息,或出发事件。
});
4) 减少代码的行数是降低复杂度的最有效方式
http://www.netvibes.com 是一个portal网站,它的portal使用了Mootool的javascript框架, javascript的总行数将近6万行。Mootool的OO确实做的很好,号称适合在大型、复杂的应用中使用,可惜在复杂的应用当中,过度的OO,并不能提供简洁的功能,继承的滥用反而增加了复杂度和维护的难度。
我down下来代码后,看了看,觉得 如果使用Jquery,代码最少能缩小一半。
如果你一定要坚持你的应用是大型的javascript应用(尽管没有标准衡量),你就喜欢Class,看不到这个单词,你就不爽。看看下面的文字。
5). OO和JQuery的结合
很多人并不了解OO,对于OO不过是叶公好龙吧了,以为OO,就是一定要出现个Class, 然后在不断的new 来new去,这就是OO的编程。本来一个Utility的方法,非要OO,结果先要new一个Object, 然后在调用Ojbect的方法。
OO是这样子吗?当然不是,封装、继承、多态,是OO的核心。
OO的编程虽然可以帮助用户开发高度有弹性、易扩展、以维护的程序,但前提是要理解OO。
如果我们不满足于使用Jquery的API、plug-in的功能,我们想用它来作为我们开发大型OO-based 项目的基础javascript框架时,我们仍然可以通过plug-in的方式,让JQuery具有OO编程的基础框架的功能。
Low Pro for jQuery 是一个模拟prototye OO 的Jquery plug in, 是你可以用Prototype的OO方式编程。
使用插件前的API的调用方式
$('#example4').draggable({ helper: 'clone', revert: true });
假设我们遇到了复杂的情况,想改变draggable的情况,这是只有修改源文件了。
使用插件后,我们可以通过类,继承类来改变对象的行为。
Draggable = $.klass({
initialize: function(options) { },
onmousedown: function() {}
});
通过继承来扩展对象的行为:
GhostedDraggable = $.klass(Draggable, {
onmousedown: function($super) {
$super();
//此处可以编写自定义的行为代码
}
});
然后通过attach的方法绑定到制定的DIV上:
$('div.product').attach(GhostedDraggable, { anOption: thing });
6).在应用中,尽可能的使用一个框架,便于技术积累。
Jquery可以满足你大部分的要求,不是做不到,是你不知道, 你不知道Jquery的有这样的能力罢了。
我做的最近一个Portal项目,javascript全部是基于Jquery的,参见下图。
使用的插件不多,但都实用。
JTab、Draggable、Selectable、Sortable、Jcorner、Jtip
那个chart也是基于Jquery, 不过是拿过来经过经过改进的。
至于我们基于jquery的编程风格就不用多说了。
相关推荐
It evolved out of my recent presentation, Building Single-Page Applications Using jQuery And ColdFusion, and will continue to evolve as I think more deeply about this type of application architecture...
JavaScript (and its frameworks such as jQuery) and HTML (along with its style sheet language CSS) have become a ubiquitous presence in software development. Due to their monopoly position in web ...
everything from the basics of generating lines and areas to using most of the layouts that come to mind when you think of data visualization. It also devotes some space to maps, networks, mobile, and ...
"Sumo-datepicker"是由Think Sumo Creative Media Inc开发的一个JavaScript日期选择器插件,特别针对Mythos 5设计。这个组件旨在为用户提供一个直观、易于使用的界面来选择日期,适用于网页上的各种日历功能需求,如...
这里我们探讨两种实现方式:原生JavaScript和jQuery。这两种方法都是为了达到以下效果: 1. **全选/全不选**:勾选全选框时,列表中的所有复选框被选中;反之,取消全选框则所有复选框被取消选中。 2. **自动更新...
在这个主题中,我们将深入探讨几个在Java API中常用的框架和库,如Spring、MyBatis、Hibernate、Spring MVC以及jQuery 1.8,同时也会提及《Think in Java》这本经典书籍中涉及的概念和本地测试接口的方法。...
In another sense, you can think of KO as a general way to make UIs for editing JSON data… whatever works for you :) OK, 如何使用它? 简单来说:声明你的数据作为一个JavaScript 模型对象(model object)...
$upload = new \Think\Upload(); $upload->maxSize = 3145728; // 设置附件上传大小 $upload->exts = array('jpg','jpeg','png','gif'); // 设置附件上传类型 $upload->rootPath = './Uploads/'; // 设置附件上传根...
接着,`new \Think\Upload()`实例化了一个上传类,通过设置`maxSize`属性限制了上传文件的最大大小。`$upload->save()`或`$upload->move()`方法通常会被用来保存上传的文件到服务器指定的目录。 在实际的开发中,你...
css参考手册.chm ...JavaScript参考手册中文版.chm java包(简例)中文版.chm ...Think In Java.chm Browser对象笔记.doc DHTML笔记.doc HTML DOM笔记.doc javascript笔记.doc JQuery笔记.doc XML笔记.doc
最近用thinkphp做项目,在测试环境时,存在接口的测试问题。在tp官网也没能找到相关的解决方法。自已看了一下源码,有如下的解决方案。...use think\Exception; use think\Response; class CronRun { publ
If you can think it in PHP, you can code it as a Drupal module. Dive into Drupal module development as we create the Philosopher Biographies website, developing new modules and themes to meet ...
Template7 + 自动完成演示将 Template7 用于自动完成列表截屏执照 "THE PIZZA-WARE LICENSE" (Revision 42):You ... If we meet some day, and you think this stuff is worth it, you can buy me a Pizza in return.
- **Think in Java**:深入理解Java语言精髓。 - **JDK帮助文档**:熟练查阅和利用官方文档解决问题。 - **Effective Java**:掌握最佳实践和编程技巧。 - **RUP和UML**:理解软件开发过程和建模语言。 - **IDE使用*...
巴士站测试webapp 使用jQuery , Backbone.js和Google Maps Javascript API构建。 ... ##执照 ...If we meet some day, and you think this stuff is worth it, you can buy me a beer in return.
使用`think.mkdir()`创建目标目录,接着使用`fs.renameSync()`移动文件到新路径。最后,可能需要解压文件并将其信息存储到数据库中,这里使用了JSZip库来处理压缩文件。 在总结中,这个实例展示了如何在ThinkJS中...