以前的微信历史头像如何找回头像,现在想找回来

别再用JavaScript框架了 - WEB前端 - 伯乐在线
& 别再用JavaScript框架了
JS框架看上去就像死亡和纳税,必然发生,无法避免。如果我能变成一只苍蝇趴在墙上,我就能确定每次启动一个新项目的时候,他们讨论的第一个问题肯定是:我们要用哪个JS框架?这种场景反映了当今JS框架的角色在行业里是多么根深蒂固不可动摇。但其实这种形势并非是必需的,而且实际上,这种做法需要制止。
让我们先回顾一下我们是怎么一路走来的。
Angular 和 Backbone 还有 Ember,我滴个天哪。
长期以来,用最简洁的 HTML+CSS+JS 方式表述的,从技术栈的角度看是一场灾难。谁能忘记IE的盒子模型或者layer标签?我知道,那些例子会引出web开发中一些令你不堪回首的往事。
很长时间里,浏览器之间存在大量的不一致,而我们作为一个行业,只能靠编写框架来糊裱一番。问题在于当时在不同浏览器之间对于一些基本问题都存在争议,例如事件如何传播或支持哪些标签,导致每个框架不仅糊裱了缺陷,而且还设计了他们对于浏览器功能的模型。实际上他们自己的模型都是多个,因为你要发明事件传播的模型,还有与DOM交互的模型,等等。这里边有很多新发明。随之出现了一些框架,然后聚沙成塔集腋成裘,就产生了大量诸如jQuery 、Dojo、MochiKit 、ExtJS 、AngularJS 、Backbone 、Ember 和React 等等玩意儿。在过去的十年里,我们不停地折腾出了成堆的框架。
但是过去的十年里还发生了其他一些事:浏览器越来越好了。它们改善了对标准的支持,现在出现了自动更新的常青浏览器,它们的每个版本都比旧版本更适应和符合标准。这些新标准比如:
我认为现在是时候重新思考JS框架的模型了。做Web 开发没必要再发明其他的方法,只要使用 HTML+CSS+JS 就行了。
那么,为啥我们还在编写 JS 框架呢?我觉得这很大程度上是因为惯性,它成了一个习惯了。不过,有人要说,这种习惯有那么糟糕么?框架看起来也并不是有害的,对不?嗯,让我们先从我说的框架定义开始分析。实际上这些代码是有个增强的梯度,从代码小片段开始,例如Gist,逐渐扩大到越来越大的代码集,形成了库,最终产生了框架:
gist -& library -& framework
量变引起质变,框架已经不再仅仅是大型的库,它们有自己的一套与事件、DOM等交互的模型。那么,为啥要避免用框架呢?
抽象 框架的一个问题往往也是它们的卖点,那就是它们把平台抽象了,这样你就能集中精力写你自己的软件。问题是,现在你需要学习两套开发系统,HTML+CSS+JS 和框架。当然了,假如某个框架能做到把web平台完全抽象化,那你就永远不需要涉足到框架之外,但是你猜怎么着? 。所以你需要了解 HTML+CSS+JS ,因为某些情况下你的程序不会按你所期望的方式工作,你需要深入框架内部的各个层直到 HTML+CSS+JS,才能找到出错的原因。
绘制冰山图
一套框架就像一座冰山,浮在水面上的10%看起来并不危险,最终让你船毁人亡的是隐藏在下面的那90%。实际上更合适的一个比喻是,学习一套框架就像对一座冰山绘图,也就是说,为了使用框架你必须学会框架里所有的内容,花精力去把所有的内容对应到传统的 HTML+CSS+JS,从长期来看这个过程毫无意义,因为冰山最终都会融化。
小组件 框架的另一个卖点是你可以获得一个小组件的库。可实际上,你并不是非要运用一套框架才能得到它们,它们应该是和框架无关的独立功能。这方面的一个好例子是 ,这是一个用Javascript 编写的语法标记代码编辑器。你可以在任何地方使用它,无需任何框架。
给某个框架编写小组件也是吃力不讨好的事。还记得你在MochiKit 框架下编写的那些小组件吗?现在你转移到 Ember或者 Angular后,它们还好用不?
数据绑定 老实说,我从来用不着它。不过如果你需要的话,它也应该以库的形式出现,而不是框架。
框架带来的更长期的问题是它们最后变成一个一个地窖,把整个版图分割成片,给A框架编写的小组件无法在B框架下使用。这就是事倍功半。
那么问题就来了:后框架时代的世界是什么样的呢?
HTML+CSS+JS 就是我的框架。
基本思路就是不再需要框架,使用 HTML+CSS+JS 中已经包含的能力去编写你的小组件就行了。把一块块巨石打散成独立的、可以任意组合的组件。按这个原则最终划分出的各块组件都成为中的一部分。
HTML 引入, HTML 模板, 定制元素, 以及 Shadow DOM 都是有助于我们砍断框架束缚的有力技术,使我们能够产生可重用的元素和功能。要想更详细地了解这些技术的情况,请参阅以下文章和库:
那么,是不是说我们都可以创建 然后就万事大吉了呢?
不,并不是这样。运用 Web组件 需要做的第一件事是填补那些功能,例如 X-Tag 和 Polymer。不过随着浏览器逐渐填补对于这些规范的实现,这些工作的必要性会逐渐减少。
在这里需要强调的一点是这些补丁并不是指那些自创一套 Web 开发模型的框架,它们只需要应用HTML 5模型就行了。但是那并不是真正唯一的需求,在Web平台上仍然有微小的缺口,每个浏览器都在一些细节上偏离当前的标准,这才是我们需要填补的地方。 看起来已经有很多所需的代码了,因为其中的文档经常包含了。
那么,一个巨大的 HTML 5 补丁库也许不错,但是更好的办法是我称之为 html-5-polyfill-o-matic 的一套工具,它让我能通过标准HTML+JS 来编写Web组件,然后分析我的代码 — 通过静态分析或者运行时的 Object.observe ,使它可以精准地从完整HTML 5补丁中产生我的项目所需的一套子集。
如果我开始尝试混合和匹配来自多个来源的Web组件 — 例如来自 X-Tag 的 &x-foo& 和来自Polymer 的 &core-bar& ,这种功能会变得更加重要。是不是这就意味着我必须引入它们两者的补丁库呢? (。) 我又要如何获取这些定制元素呢? X-Tag 和 Brick 两者都有定制绑定生成器:
如果我开始生成定制元素,我是否需要生成我自己的定制绑定器呢?我不认为那是个可扩展的思路,我相信我们需要能更好处理这类问题的惯例和工具。这实际上可能意味着改变我们进行开源项目的方式,一个小工具并不是一个项目,所有我们处理这类问题的方法需要改变。当然了,还是要把代码放到Git里,但是你是否需要一个GitHub项目的整体开销呢?可能更好的办法是更轻量级、接近Gist的方式。我如何才能把 里所有这些代码压缩成合适的形式用到我的项目里去?类似于
的例子也许是个合适的起点。
那么,我们现在需要的是什么?
编写可重用组件的惯例和指南。
在这些惯例下用来编译和压缩的工具。所有都是 HTML, CSS, 和 JS。
可扩展的 HTML 5 补丁,根据实际需要来确定用完整的还是精简版。
这就是我们在未来构建Web应用时所需要的一切。在那时,我们不再需要学习最新框架的最新模型,而是直接针对Web 平台工作,引入定制元素和库来满足特定需求,把时间花在编写应用上,而不是去绘制冰山图。
Q: 你为啥憎恨框架作者呢?
A: 我不憎恨他们。我有些最好的朋友就是框架作者。我承认从搞笑文章
中得到了一点灵感,不过我要再次说明,我无意嘲笑框架作者。
Q: 你可以用HTML 5实现 ____ 功能,但为了这么做你需要一套框架
A: 首先,那不是一个问题。其次,感谢指出这一点。现在让我们一起努力增强HTML 5的能力,让____ 功能可以不用框架就能实现。
Q: 但是 ___ 并不是框架,它是一个库!
A: 是的,正如我所说,它是从gist 渐进到框架的,可能你的划分方式和我稍有区别。没关系,这篇文章的重点不是对特定软件的分类,而是远离框架。
Q: 我这么干活已经很多年了,用了 ___ 和 ___ 还有 ___。
A: 这也不是一个问题。不过无论如何,这对你是有好处的,你应该处在了帮助其他人的有利位置。
Q: 这么说每个人都需要重写下拉菜单、标签页、滑动条,并自己实现切换功能?
A: 绝对不是这样,关键是应该用一种不限定在某个框架的方式来创建这些元素。
Q: 伙计,所有这些 HTML 引入会把我网站的性能搞死的。
A: 是的,如果你在本地实现所有这些功能的话,这也是我前面
Q: 那么我就不要用 任何 库喽?
A: 不,那不是我表达的意思。我在区分库和框架这方面非常谨慎。库提供的是可以配合其他库使用的独立功能块。库很好啊,我希望看到大家一致赞同远离的是 框架。
Q: 可是我喜欢数据绑定!
A: 很多人都喜欢,我只是表达个人喜好罢了。我也没有说 你 不应该使用数据绑定,我只是说你不需要为了实现数据绑定而运用一整个框架而已,有一些独立的库就可以做到了。
打赏支持我翻译更多好文章,谢谢!
打赏支持我翻译更多好文章,谢谢!
任选一种支付方式
关于作者:
可能感兴趣的话题
比较认同作者的大部分思想(但不是全部),同样的,包括插件的滥用也是日益严重!我依旧觉得原生的javascript、jquery、jquery插件、JS框架这多者之间应该分析权衡,各有所长及所短,取一个平衡点来调和这些技术,使其更好的为项目服务,而不是像愤青一样,只认同一个或者只弄死一个~
下面把我在知乎上对别人对《别再用JS框架了》问题讨论的评论,复制过来:
貌似jquery不是框架,而是库(至少W3C是这么说的),根据译文,原作者是很推崇库的,而是不推荐库继续扩大变成的框架(不过不知道作者为什么把 JQ当作框架);我感觉,组件及库就像一个个小组(是服务于基本的 html+css+javascript),A组和B组可以组建成X团,A组和C组可以组建成Y团(不是框架又胜似框架)来解决一些比较大的问 题,现在的框架有些军阀的气息了,难拆开却又有实力(可以解决一些大的目标而且有时候真的很需要他)但又有大隐患(必需被动从于他,包括文中所分析的)等,不过即使将来所有浏览器完全实现了标准的统 一(离开框架的依赖),框架在国内依旧会存在很长时间。(一个即将入行前端的小白,个人的观点仅供娱乐,如有不妥之处还望见谅)
o 136 回复
o 123 回复
关于伯乐前端
伯乐前端分享Web前端开发,包括JavaScript,CSS和HTML5开发技术,前端相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线developerWorks 社区
现代 Web 站点和 Web 应用程序倾向于依赖大量客户端 JavaScript 来提供丰富的交互功能,尤其是异步 HTTP 请求的出现使得不刷新页面就可以从服务器端脚本或数据库系统返回数据或响应。在本文中,您将了解如何通过 JavaScript 框架更轻松、更快速地创建具有高度交互性和响应性的 Web 站点和 Web 应用程序。
, 软件开发人员, 自由职业者
Joe Lennon 是一位来自爱尔兰科克市的软件开发人员,他今年 24 岁。Joe 是 Apress 即将发行的
一书的作者,并且为 IBM developerWorks 撰写了许多技术文章和教程。在业余时间里,Joe 喜欢踢足球,改进一些小玩意以及玩他的 Xbox 360 游戏机。
简介JavaScript 是面向对象的脚本语言,长期以来用作 Web 浏览器应用程序的客户端脚本接口。JavaScript 让 Web 开发人员能以编程方式处理 Web 页面上的对象,并提供了一个能够动态操作这些对象的平台。在最初引入 JavaScript 时,通常只用于提供 Web 页面上的一些不重要的特性,如时钟功能和浏览器状态栏中的滚动文本等。另一个常见的特性是 “rollover link”,就是当用户将鼠标移到图片或文本链接上时,图片或文本链接的颜色会改变。然而,近年来,随着 Asynchronous JavaScript and XML (Ajax) 概念将基于 Web 的编程的交互性提升到一个新高度,JavaScript 也变得越来越重要。在出现 Ajax 之前,所有服务器端处理或数据库访问都需要 “刷新” 整个页面或通过浏览器呈现一个新页面。这不仅减慢了速度并使用户感到沮丧,而且还浪费带宽和资源。
Ajax 表示 Asynchronous JavaScript and XML,但是将其称为 XML 已不再合适,因为 Ajax 请求可以返回多种格式的响应,而不限于 XML,例如 JSON (JavaScript Object Notation)。Ajax 的工作方式是允许 JavaScript 异步提交 HTTP 请求到 Web 服务器,并且在不刷新或呈现新页面的情况下呈现响应。相反,开发人员通常使用 DOM (Document Object Model) 操作来修改部分 Web 页面,显示其变化或由 HTTP 响应返回的数据。
什么是 JavaScript 框架?JavaScript 本身就是一种功能强大的语言,您不需要额外的框架就可创建富互联网应用程序(RIA)。然而使用 JavaScript 并不是件容易的事,主要是由于支持多个 Web 浏览器产生的复杂性。与 HTML 和 CSS一样,不同的浏览器有不同的 JavaScript 实现。让 JavaScript 代码实现跨浏览器兼容简直是个噩梦。
JavaScript 框架或库是一组能轻松生成跨浏览器兼容的 JavaScript 代码的工具和函数。每一个库都在众多流行的 Web 浏览器的现代版本上进行了可靠的测试,因此,您可以放心地使用这些框架,您的基于 JavaScript 的 RIA 将会在不同浏览器和平台上以类似的方式工作。
除了解决跨浏览器问题,使用 JavaScript 框架可以更容易地编写检索、遍历、操作 DOM 元素的代码。它们不仅提供获取 DOM 元素引用的快捷函数,而且还允许 DOM 遍历函数以菊花链(daisy-chaining)方式查找任意深度的父元素、子元素、兄弟元素。最后,框架还提供一系列函数来更轻松地操作这些对象,可以改变、添加或删除内容本身;或者使用 CSS 样式类来改变元素的外观。
框架的另一重要特性是其改进的事件处理支持。由于不同浏览器的实现方式各不相同,跨浏览器事件处理将会非常艰难。因此 JavaScript 框架通常封装浏览器事件,并提供一组有用的跨浏览器兼容的函数来进行处理。有些框架还会提供一组标准键盘代码来表示基于键盘的事件(如按下 Escape 键、Return 键、光标键,等等)。
所有这些特性都非常有用,但 JavaScript 框架有一个特性对于它最近的流行非常重要 — 支持 Ajax。与 JavaScript 的其他许多方面一样,每个 Web 浏览器往往以不同方式支持 Ajax,这使得以一种在所有 Web 浏览器中都受支持的方式处理 Ajax 变得十分复杂。几乎所有 JavaScript 框架都包含某种形式的 Ajax 库支持,通常提供 Ajax 请求和响应对象,以及用于评价响应、更新 DOM 元素、查询特定请求的帮助函数(helper)。
JavaScript 框架的典型特性现在,让我们看一看大多数 JavaScript 框架都具备的有用特性。包括:选择器(Selector)DOM 遍历DOM 操作实用(Utility)函数事件处理Ajax在解释每个特性时,我将会用以下的一个或几个 JavaScript 框架举例说明:Prototype、jQuery、YUI、ExtJS 和 MooTools。尽管每个框架的实现和语法都各不相同,但概念都是相同的。每个框架都有一个详细的 API 参考,可帮助您理解如何使用该特定库中的特性。
选择器大多数可用的 JavaScript 框架都会实现某种形式的对快速元素选取的支持。通常来说,这些选择器会使获得 HTML 元素引用的过程快很多,并允许通过 ID、类名、元素类型甚至使用一组伪选择器(pseudo-selector)来查找元素。
例如,使用常规 JavaScript,您也许会用以下代码通过 ID 来选择 DOM 元素:
var theElement = document.getElementById('the_element');与其他框架一样,MooTools 提供了执行此操作的快捷方法。除了选取该元素,MooTools 还可通过一系列实用函数扩展此元素。其语法如下:
var theElement = $('the_element');如上所示的单美元符号(dollar)函数,在很多(但不是所有)流行的 JavaScript 框架中都可用,而且语法也大体一致。Prototype 库则更进一步,允许通过 ID 一次选取多个元素,并返回元素数组。和 MooTools 一样,可用 Prototype 实用函数扩展这些元素。用 Prototype 一次选取多个元素的语法是:
var elementArray = $('element_one', 'element_two', 'element_three');在
一节中,您将会学到更多 JavaScript 框架所提供的简化集合迭代的函数。
在前面的例子中,必须提供需要选取的元素的 ID。然而,如果要选取多个元素(例如,所有图片)或是具有特定 CSS 类名的所有表行,那又怎么办呢?MooTools(还有其他库)提供了一个简单的方法来实现此功能 — 双美元符号(dollar-dollar)函数。它的工作方式与单美元符号函数相同,不同之处在于它接受 CSS 元素名、类名、伪选择器作为参数,而不是接受元素 ID 作为参数。例如,要使用 MooTools 选取 Web 页面上的所有图片,将用以下代码:
var allImages = $$('img');这将返回一个包含文档中的所有图片的数组,其中每一个图片都使用单美元符号函数进行扩展,以包含 MooTools 实用函数。根据标记名选取元素非常有用,但如果只是想根据 CSS 类选择一个元素子集,该怎么办呢?这也很简单。在下面的例子中,MooTools 将会选择 CSS 类名为 “odd” 的所有表行。这在实现表行条状化(在表行之间交替变化背景色)时将非常有用:
var allOddRows = $$('tr.odd');实际上,MooTools 提供了实现表行条状化(row striping)的更好方法。在上面的例子中,假设表中的所有奇数行的 CSS 类名为 “odd”。以下代码不要求对表行定义任何 CSS 类名:var allOddRows = $$('tbody:odd');这是一个伪选择器的例子,将会返回所有符合条件的对象,在本例中为页面中的 tbody(表主体)的所有奇数子元素。MooTools 伪选择器的其他例子包括:
checked— 选取所有选中的元素(例如,选中的复选框)enabled— 选取所有启用的元素contains— 选取所有包含作为参数传递给选择器的文本的元素(例如,contains('this text'))如前所述,并非所有 JavaScript 框架都使用单美元符号函数选取 DOM 元素。在 YUI (Yahoo! User Interface) 库第 3 版中,用以下代码根据 ID 选取元素(请注意 YUI 3 要求在 ID 前传递 ID 选择器符号 #):
var theElement = Y.one('#the_element');同样,与使用双美元符号函数根据标记或类名检索元素不同的是,YUI 使用了 Y.all 函数:
var allOddRows = Y.all('tr.odd');ExtJS 使用类似的方式,用以下语法根据 ID 选取元素:var theElement = Ext.get('the_element');以下语法用于根据标记和类名选取元素:var allOddRows = Ext.select('tr.odd');在下一节中,您将看到 JavaScript 框架如何轻松遍历 DOM,换句话说,就是查找选定元素的父元素、子元素、兄弟元素。您还会学到如何使用库操作 DOM 以修改元素。
DOM 遍历根据 ID、元素类型或 CSS 类名查找元素非常有用,但如何根据元素在 DOM 树中的位置执行查找呢?换而言之,根据一个给定的元素查找其父元素、子元素、前一个或后一个兄弟元素。例如,看一下清单 1 的 HTML 片段。
清单 1. HTML 片段(一个 HTML 表)&table&
&th&Name&/th&
&th&Email Address&/th&
&th&Actions&/th&
&tr id="row-001"&
&td&Joe Lennon&/td&
&td&joe@joelennon.ie&/td&
&td&&a href="#"&Edit&/a&&
&a href="#"&Delete&/a&&/td&
&tr id="row-002"&
&td&Jill Mac Sweeney&/td&
&td&&a href="#"&Edit&/a&&
&a href="#"&Delete&/a&&/td&
&/table&清单 1 用缩进表示每个元素在 DOM 节点树中的位置。在该例中,table 元素是根元素,它有两个子节点,thead 和 tbody。thead 元素只有一个子节点 tr,后者有三个子节点 — 所有 th 元素。tbody 元素有两个子节点,均为 tr 元素,每个 tr 元素又有三个子元素。每行的第三个子元素又有两个子节点,都是 a (锚点)标记。
如您所知,可以使用 JavaScript 框架的 Selector 函数根据 ID 轻松选取元素。在该例中,有两个元素具有 ID — 均为 tr(表行)元素,ID 分别为 row-001 和 row-002。要使用 Prototype 选取第一个 tr 元素,需要用到以下代码:
var theRow = $('row-001');在前面的小节中,您学会了如何使用选择器根据类型或 CSS 类检索元素。在本例中,可以使用以下语法选取所有 td 元素。var allCells = $$('td');这段代码的问题是它将返回 DOM 中的所有 td 元素。但是,如果只希望获取 ID 为 row-001 的行中的 td 元素,怎么办呢?这时就该使用 DOM 遍历函数了。首先,使用 Prototype 选取 ID 为 row-001 的 tr 元素的所有子节点:
var firstRowCells = theRow.childElements();这将返回 theRow 变量(之前已设为 ID 为 row-001 的元素)的所有子元素的数组。下一步,假设只希望取得该行的第一个子节点,在本例中,是内容为 “Joe Lennon” 的 td 元素。应使用以下语句:
var firstRowFirstCell = theRow.down();很简单吧?这种特别的用法等价于:
var firstRowFirstCell = theRow.childElements()[0];也可以表示为:
var firstRowFirstCell = theRow.down(0);JavaScript 索引值从零(0)开始,所以以上语句实际上是告诉 JavaScript 选取第一个子元素。要选取第二个子元素(包含 joe@joelennon.ie 邮件地址的单元格),可以使用下面的语句:
var firstRowSecondCell = theRow.down(1);或者,可以在 DOM 兄弟节点间导航。本例中,第二个单元格是第一个单元格的下一个兄弟节点,因此可以使用以下语句:
var firstRowSecondCell = firstRowFirstCell.next();这与 down() 函数使用了相同的方式,因此可以使用下面的语句选择第三个单元格:
var firstRowThirdCell = firstRowFirstCell.next(1);除了使用索引查找特定节点外,Prototype 还允许使用 CSS 选择器语法。考虑
的例子,找到包含 Jill Mac Sweeney 的明细的行的第二个链接(“Delete” 链接):
var secondRowSecondLink = $('row-002').down('a', 1);在本例中,可以使用美元符号函数找到 ID 为 row-002 的元素,然后向下遍历 DOM,直到找到下一个后代 a(锚点)元素。
有些框架可以使用 “菊花链” 遍历函数,表示可以将遍历命令互相连接。在 Prototype 中实现前一个例子的另一种方法是:
var secondRowSecondLink = $('row-002').down('a').next();考虑下面的例子:
var domTraversal = $('row-001').down().up().next().previous();如您所见,菊花链方式可以将几个 DOM 遍历语句连接起来。实际上,上例实际上选择 tr 元素 row-001,因此菊花链刚好回到了起点!
DOM 操作上文中,您已经看到如何使用 JavaScript 框架的选择器和 DOM 遍历来简化特定元素的选取。然而,要想改变 Web 页面中的特定元素的外观或内容,需要操作 DOM 并应用改变。如果使用纯 JavaScript 将会非常繁琐,幸运的是,大多数 JavaScript 框架提供了有用的函数,简化了这些操作。
假设您有一个 div 元素,其 id 是 the-box:&div id="the-box"&Message goes here&/div&如果要用 jQuery 改变 “Message goes here” 文本,方法如下:
$('the-box').html('This is the new message!');实际上,可以在函数内部使用 HTML 代码,它将由浏览器解析。例如:
$('the-box').html('This is the &strong&new&/strong& message!');在本例中,div 元素的内容在 DOM 中呈现为:&div id="the-box"&This is the &strong&new&/strong& message!&/div&当然,在一些情况下您需要使用特殊字符,如大于号或小于号。可以不指定专门的 HTML 实体代码,而是使用 jQuery 的 text 函数:$('the-box').text('300 & 200');这将把 div 元素更新为以下代码:&div id="the-box"&300 & 200&/div&在上面的例子中,原有内容被新内容取代。如果只是想把消息添加到文本的后面,该怎么做呢?幸好,jQuery 提供了专门的 append 函数:
$('the-box').append(', here goes message');将这个函数应用到初始的 div 元素,div 元素的内容就变成下面这样:
&div id="the-box"&Message goes here, here goes message&/div&除了附加以外,您还可以 “前置” 内容,即在已有内容的前面而不是末尾插入新内容。另外,jQuery 提供了在给定元素之外插入内容的函数,不管是在开头还是在末尾。这类函数可以替换内容、清空内容、从 DOM 移除所有元素、克隆元素等等。
除了 DOM 操作函数,JavaScript 框架还包含一些用于以编程方式处理元素样式和 CSS 类的函数。例如,假设您有一个表,您想要在鼠标移到某一行时高亮显示该行。您创建了一个特定的名叫 hover 的 CSS 类,并且您想要将这个类动态添加到行中。在 YUI 中,可以使用以下代码检查行中是否已经具有 hover 类,如果已经有的话,则删除它,如果没有的话,则添加它:
if(row.hasClass('hover')) row.removeClass('hover'); else row.addClass('hover');而且,大多数 JavaScript 框架都有内置的 CSS 操作函数。
实用函数很多 JavaScript 框架提供了大量实用函数,可使 JavaScript 开发变得很容易。由于这些函数非常多,因此本文无法一一介绍。我将只讨论大多数框架都具备的一些比较重要的函数。
如果您曾经使用 JavaScript 处理过数组,你应该熟悉使用 for 循环来遍历数组以处理数组值。例如,看一下清单 2 的代码:
清单 2. 遍历 JavaScript 数组的传统方法var fruit = ['apple', 'banana', 'orange'];
for(var i = 0; i & fruit. i++) {
alert(fruit[i]);
}清单 2 中的代码没有问题,但有些冗长。大多数 JavaScript 框架包含 each 函数,它会对数据组的每个元素调用一个指定的函数。使用 MooTools,可以用清单 3 的代码执行与清单 2 相同的操作。
清单 3. 使用 MooTools 中的 each 函数['apple', 'banana', 'orange'].each(function(item) {
alert(item);
});清单 3 中的语法与 Prototype 和 jQuery 中的语法相同,而与 YUI 和 ExtJS 中的语法有细微差异。然而,当用于 hash 映射或对象而不是数组时,各框架的语法都不一样。例如在 MooTools 中,将用到清单 4 的代码:
清单 4. 在 MooTools 中对基于键/值对的对象使用 eachvar hash = new Hash({name: "Joe Lennon", email: "joe@joelennon.ie"});
hash.each(function(value, key) {
alert(key + ": " + value);
});在 Prototype 中,将用到清单 5 中的代码。
清单 5. 在 Prototype 中对基于键/值对的对象使用 eachvar hash = $H({name: "Joe Lennon", email: "joe@joelennon.ie"});
hash.each(function(pair) {
alert(pair.key + ": " + pair.value);
});每个框架都包含很多有用的函数,通常划分为 String 函数、Number 函数、Array 函数、Hash 函数、Date 函数等等。更多信息,请查阅相关 JavaScript 框架的 API 参考资料。
事件处理每个 JavaScript 框架都实现了跨浏览器事件处理支持,鼓励您从旧式的内联事件连接转向一种流线化方法。看一下清单 6 中的 jQuery 示例,其中在 hover 事件中高亮显示 div 元素。清单 6. 使用 jQuery 连接 hover Event$('the-box').hover(function() {
$(this).addClass('highlight');
}, function() {
$(this).removeClass('highlight');
});这是一个由 jQuery 实现的特殊事件,请注意它有两个函数,触发 onMouseOver 事件时调用第一个,触发 onMouseOut 事件时调用第二个。这是因为 hover 没有标准的 DOM 事件。让我们查看一个更典型的事件,例如 click(查看清单 7)。
清单 7. 使用 jQuery 连接 click Event$('the-button').click(function() {
alert('You pushed the button!');
});如您所见,本例中只有一个函数参数。jQuery 使用这种方式处理大多数 JavaScript 事件。在 jQuery 中使用事件处理函数时,上下文变量是指触发事件的元素。有些框架并不使用这种处理方式。以 Prototype 为例,清单 8 显示了用 Prototype 实现的与清单 7 等价的代码。
清单 8. 使用 Prototype 连接 click Event$('the-button').observe('click', function(e) {
alert('You pushed the button!');
});您首先将注意到没有 click 函数,而是使用了 observe 函数,该函数在引用它自身之前将事件作为参数。您还可能注意到该函数的参数 e。这就是指向触发事件的元素的上下文变量。为了探究其工作原理,让我们针对 Prototype 重写
的代码(请看清单 9)。
清单 9. 使用 Prototype 连接 hover Event$('the-box').observe('mouseover', function(e) {
var el = Event.element(e);
el.addClassName('highlight');
$('the-box').observe('mouseout', function(e) {
var el = Event.element(e);
el.removeClassName('highlight');
});与 jQuery 中使用美元符号函数获取上下文变量不同的是,在 Prototype 中需要使用 Event.element() 函数。并且,您需要对 mouseover 和 mouseout 使用不同的函数。
在阅读本文的过程中,您也许会注意到函数使用内联方式创建且都没有命名。这意味着它们无法被重用。Prototype 的 hover 例子展示了如何使用已命名的函数作为替代方法。如清单 10 所示。
清单 10. Prototype 中改进的 hover 例子function toggleClass(e) {
var el = Event.element(e);
if(el.hasClassName('highlight'))
row.removeClassName('highlight');
row.addClassName('highlight');
$('the-box').observe('mouseover', toggleClass);
$('the-box').observe('mouseout', toggleClass);您会注意到,这次只定义了一个函数供 mouseover 和 mouseout 事件调用。该函数会判断元素是否已经高亮显示了类名,并根据查找结果执行添加或删除。您也许会注意到 e 参数是隐式传递的。换句话说,不需要在 observe 函数中以参数形式显式传递事件。
Ajax使用 JavaScript 框架的另一个有说服力的理由是标准化的跨浏览器 Ajax 请求。Ajax 请求是一个异步 HTTP 请求,通常发送给服务器端脚本,后者返回 XML、JSON、HTML 或普通文本格式的响应。大多数 JavaScript 框架都有某种形式的 Ajax 对象,以及一个以参数形式接受一组选项的请求方法。这些选项通常包含 callback 函数,当脚本一接收到来自 Web 服务器的响应时,就会调用此函数。让我们看一下 ExtJS、MooTools 和 Prototype 中的 Ajax 请求的样子。
首先,看一下典型的 ExtJS Ajax 请求(请看清单 11)。清单 11. 一个 ExtJS Ajax 请求Ext.Ajax.request({
url: 'server_script.php',
name1: 'value1',
name2: 'value2'
method: 'POST',
success: function(transport) {
alert(transport.responseText);
});ExtJS 中的 request 方法只有一个参数,这是一个包含 url、params、method 和 success 等不同字段的对象。url 字段包含服务器端脚本的 URL,该脚本将被 Ajax 请求调用。params 字段本身就是一个对象,包含有将被传递给服务器端脚本的键/值对。method 字段可以取两个值:GET 或 POST。它的默认值为未定义,但如果请求中有 params,将会默认作为 POST 处理。最后一个字段 success 是 Web 服务器返回成功响应时调用的函数。在本例中,假设服务器端脚本返回普通文本,并且文本会通过警告框显示给用户。
下一步,我们看看同样的请求在 MooTools 中是什么样子(请看清单 12)。
清单 12. 一个 MooTools Ajax 请求new Request({
url: 'server-script.php',
name1: 'value1',
name2: 'value2'
method: 'post',
onComplete: function(response) {
alert(response);
}).send();如您所见,MooTools 与 ExtJS 非常相似。你也许注意到,与使用 params 不同,这里使用 data 字段传递变量,而且必须使用小写指定方法。还有,没有使用 success callback 函数,MooTools 使用了一个 onComplete 函数。最后,与 ExtJS 不同的是,在 MooTools 中,您需要使用 Request 对象的 send() 函数发送请求。
最后,让我们看看 Prototype 中的请求是否具有显著的不同(请看清单 13)。清单 13. 一个 Prototype Ajax 请求new Ajax.Request('server-script.php', {
name1: 'value1',
name2: 'value2'
method: 'post',
onSuccess: function(transport) {
alert(transport.responseText);
});同样,Prototype 的工作方式基本一致,只是有些句法上的小差别。首先,Prototype 的 Request 对象为其构造函数获取两个参数。第一个参数是请求将被发送到的 URL,第二个参数是一个具有典型 Ajax 选项的对象,如前两个例子所见。当然,由于 URL 现在作为单独的参数传递,它没有出现在选项列表中。同样需要注意,与 MooTools 不同,Prototype Ajax Request 对象构造函数隐式地发送请求,因此不需要调用任何方法来实际发起 HTTP 请求。
大多数 JavaScript 框架中的 Ajax 支持要比此处演示的内容更加深入。重要的增强功能包括使用接收到的响应自动更新元素,而不需要任何特殊的 onSuccess 函数。一些库甚至包含预建的自动完成功能,如您在 Google 搜索引擎中所看到的,在输入时会出现常见搜索项。
在下一节中,您将学习 JavaScript 框架为 Web 开发人员提供的用户体验(UX)增强功能。
UX 增强功能到目前为止,本文全部关注的是使用 JavaScript 框架的编程优势以及它们如何简化交互式应用程序的编写。然而,对于大多数框架,还有另外一个更吸引人的方面:用户界面(UI)组件以及用户体验增强,这些在以前需要付出很大努力构建的工作现在可以轻松完成。
本节将分别介绍以下框架的 UX 增强功能:Prototype、jQuery、YUI、ExtJS 和 MooTools。PrototypePrototype 是少数几个不提供开箱即用 UI 组件和 UX 增强功能的 JavaScript 框架之一。它将这些内容转移到其姊妹库 script.aculo.us(最新版本是 Scripty2)中。Script.aculo.us 还添加了对 Prototype 中的各种效果和行为的支持。包括 highlighting、morphing、folding、shaking、sliding、puffing 等等。Script.aculo.us 还提供拖放支持,例如滑块、in-place Ajax 编辑器和 autocompleters。与其他框架不同,Script.aculo.us 将所有控件(例如滑块和 autocompleters)的设计留给开发人员,并且未提供标准界面。
jQuery与 Prototype 不同,jQuery 核心库中包含一些基本的 UX 增强。这些增强与 script.aculo.us 中的一些基本效果类似。例如 sliding 和 fading。然而,要获得更高级的 UX 特性,就需要下载 jQuery UI 库,它包含比 jQuery 核心库更多的效果,以及交互特性,如拖放、调整大小和排序。与 script.aculo.us 不同的是,jQuery UI 还包含一些小部件或组件,它们使开发具有吸引力的界面变得更加容易。目前,这些组件包括 Accordion、Datepicker、Dialog、Progressbar、Slider 和 Tabs。这些小部件都可以划分主题,并且 jQuery UI 包含各种各样的主题,可以适合您自己的特定 Web 站点或 Web 应用程序的组件。图 1 演示了 jQuery UI Datepicker 小部件的例子,该小部件的主题为 Cupertino。
图 1. jQuery UI Datepicker WidgetYUIPrototype 和 jQuery 不包含开箱即用的 UI 小部件,但是 Yahoo! User Interface 库 (YUI) 包含一个 bucketload。除了支持拖放和调整大小外,YUI 第二版还包含 autocompleters、calendar 控件、carousel 组件、绘图、对话框、进度条、富文本编辑器(所见即所得文本区)、滑块、选项卡、树等等。在撰写本文时,上述小部件都没有包含在 YUI 第三版中。图 2 是结合使用这些组件的一个例子。
图 2. 复杂的 YUI 应用程序示例ExtJS和 YUI 一样,ExtJS 包含大量开箱即用的组件,其中有很多功能强大的网格控件,支持内联编辑、分页、筛选、分组、汇总、缓冲和数据绑定。ExtJS 组件具有非常专业的外观,并且分门别类。其他小部件包括选项卡、图表、窗口(对话框)、树、布局管理器、增强的表单控件、工具栏和菜单、拖放操作和直接远程功能(direct remoting)。这仅仅是 ExtJS 所提供的一小部分,如果要查找更多 RIA 组件,请登录 ExtJS 网站。图 3 是用 ExtJS 开发的 Web 桌面程序示例,展示了这个库的丰富特性。
图 3. ExtJS 桌面应用程序示例 MooToolsMooTools 和 Prototype、jQuery 一样,也不包含开箱即用的 UI 控件和小部件。与 jQuery 一样,它包含一组有限的效果。其更高级的 UX 增强包含在 MooTools.More.js 扩展中。这个扩展不仅仅是简单的 UX/UI 插件,而是包含对 Array、Date、Hash 和 String 类以及额外的 Element 扩展的一些有趣的附加功能。至于 UX 增强功能,MooTools.More.js 包含拖放支持以及一些其他效果。这些附加功能还包括一些 UI 控件,如 accordion、可排序的 HTML 表、scroller、工具提示和 Ajax spinner overlays。然而,与 script.aculo.us 一样,您需要自己设计这些控件。
Framework 比较表 1 是本文介绍的五个框架所含特性的详细比较。表 1. 框架特性比较PrototypejQueryYUIExtJSMooTools最新版本1.6.11.3.23.003.11.2.4许可证MITMIT & GPLBSDCommercial & GPL v3MIT浏览器兼容性支持 IE6.0+6.0+6.0+6.0+6.0+支持 Firefox1.5+2.0+3.0+1.5+2.0+支持 Safari2.0.4+3.0+4.0+3.0+2.0+支持 Opera9.25+9.0+10.0+9.0+9.0+支持 Chrome1.0+1.0+未验证未验证未验证核心特性支持 Ajax是是是是是DOM 操作是是是是是DOM 遍历是是是是是事件处理是是是是是JSON是是是是是选择器是是是是是UX/UI 增强功能Accordion否jQuery UI否是MooTools More动画scriptaculous是是是是自动完成scriptaculous否是否否浏览器历史scriptaculous否是是否日历否jQuery UI是是否绘图否否是是否拖拽scriptaculousjQuery UI是是MooTools More网格否否是是MooTools More进度条否jQuery UI是是否重新调整大小否jQuery UI是是否富文本编辑器否否是是否滑块scriptaculousjQuery UI是是MooTools More选项卡否jQuery UI是是否主题否jQuery UI是是MooTools More树视图否否是是否其他重要框架限于篇幅,本文只介绍了五个比较常见的 JavaScript 框架。这并不表示它们是最流行的、最好的或是功能最多的框架。
其他一些 JavaScript 框架也值得注意,包括:CappuccinoDojoGlowGWTMochiKitQooxdooRialtoRicoSproutCoreSpryUIZE结束语本文向您介绍了 JavaScript 框架的概念以及它为什么会给 Web 网站和 Web 应用程序开发带来好处。本文对这些框架的常见功能作了简要描述,并举例说明在较常见的库中如何实现这些特性。本文还分别讲解了作为这五个框架的一部分或作为单独的附加功能的 UI 和 UX 增强。最后,还提供了一个直观的特性对比图表,其中列出了各个框架各自具备和缺乏的选项。有了这些知识,您应该就可以进行更深入的研究,然后明智地选择适合您及您的开发团队的框架。
参考资料 “”(developerWorks,2005 年 11 月)讲解了如何构造基于 Ajax 的 Web 应用程序。
参阅 “”(developerWorks,2005 年 10 月)学习如何使用 Ajax 设计模式实现基于 Web 浏览器的 SOAP Web 服务客户端。
“”(developerWorks,2007 年 6 月)讨论了与 Ajax
技术有关的威胁以及避免发生这些威胁的最佳实践。
“”(developerWorks,2005 年 12 月)讲解如何联合使用 HTML、JavaScript、DHTML 和 DOM,提高 Web 开发的效率。
“”(developerWorks,2007 年 4 月)分析 jQuery 原理,讲解它的特性和功能,并给出一些常见 Ajax 任务。
“”(developerWorks,2007 年 8 月)描述的是 IBM Information on Demand 2006 Conference Personal Planner 如何结合使用 Ajax 和 DB2®。
要收听针对软件开发人员的有趣访谈和讨论,请查看 。
:随时关注 developerWorks 技术活动和网络广播。
Javascript 框架。
获取 。 提供底层交互和动画的抽象,高级效果和可分类的小部件,这些都基于 jQuery JavaScript Library。
下载并学习 Yahoo! 。
下载 ,开始使用来自 DB2、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
免费下载、试用软件产品,构建应用并提升技能。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Web developmentArticleID=487048ArticleTitle=JavaScript 框架比较publish-date=}

我要回帖

更多关于 微信头像都在哪找的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信