㈠ jQuery toggle()事件在1.9版本退出历史舞台后,如何用新方法实现一样的功能呢
下面这个jQuery插件能够还原1.8的toggle的功能,如果你需要,可以直接把下面这段代码拷贝到你的jQuery里面,然后跟平时一样使用toggle的功能即可。//toggle plugin from caibaojian.com$.fn.toggler = function( fn, fn2 ) { var args = arguments,guid = fn.guid || $.guid++,i=0, toggler = function( event ) { var lastToggle = ( $._data( this, "lastToggle" + fn.guid ) || 0 ) % i; $._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); event.preventDefault(); return args[ lastToggle ].apply( this, arguments ) || false; }; toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler );
㈡ DOM对象与jquery对象有什么不同
jQuery对象和DOM对象使用说明,需要的朋友可以参考下。1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象,哪些是 DOM对象,因此需要重点了解jQuery对象和DOM对象以及它们之间的关系.DOM对象,即是我们用传统的方法(javascript)获得的对象,jQuery对象即是用jQuery类库的选择器获得的对象;复制代码 代码如下:var domObj = document.getElementById("id"); //DOM对象var $obj = $("#id"); //jQuery对象;jQuery对象就是通过jQuery包装DOM对象后产生的对象,它是jQuery独有的。如果一个对象是jQuery对象,那么就可以使用jQuery里的方法,例:$("#foo").html(); //获取id为foo的元素内的html代码,html()是jQuery特有的方法;上面的那段代码等同于:document.getElementById("foo").innerHTML;注意:在jQuery对象中无法使用DOM对象的任何方法。例如$("#id").innerHTML 和$("#id").checked之类的写法都是错误的,可以用$("#id").html()和$("#id").attr ("checked")之类的 jQuery方法来代替。同样,DOM对象也不能使用jQuery方法。学习jQuery开始就应当树立正确的观念,分清jQuery对象和DOM对象之间的区别,之后学习 jQuery就会轻松很多的。2.jQuery对象和DOM对象的互相转换在上面第一点说了,jquery对象和dom对象是不一样的!比如jquery对象不能使用dom的方法,dom对象不能使用jquery方法,那假如我 jquery没有封装我要的方法,那能怎么办呢?这时我们可以将jquer对象转换成dom对象jquery对象转换成 dom对象jquery提供了两种方法将一个jquery对象转换成一个dom对象,即[index]和get(index)。可能有人会觉得奇怪,怎么是用下标呢,没错,jquery对象就是一个数组对象.下面代码将演示一个jquery对象转换成dom对象,再使用dom对象的方法复制代码 代码如下:var $cr=$("#cr"); //jquery对象var cr = $cr[0]; //dom对象 也可写成 var cr=$cr.get(0);alert(cr.checked); //检测这个checkbox是否给选中dom对象转换成jquery对象对于一个dom对象,只需要用$()把dom对象包装起来,就可以获得一个jquery对象了,方法为$(dom对象);复制代码 代码如下:var cr=document.getElementById("cr"); //dom对象var $cr = $(cr); //转换成jquery对象转换后可以任意使用jquery中的方法了.通过以上的方法,可以任意的相互转换jquery对象和dom对象.最后再次强调,dom对象才能使用dom中的方法,jquery对象不可以使用dom中的方法,但 jquery对象提供了一套更加完善的工具用于操作dom,关于jquery的dom操作将在后面的文章进行详细讲解.ps: 平时用到的jquery对象都是通过$()函数制造出来的,$()函数就是一个jquery对象的制造工厂.建议:如果获取的对象是 jquery对象,那么在变量前面加上$,这样方便容易识别出哪些是jquery对象,例如:var $variable = jquery对象;如果获取的是dom对象,则定义如下:var variable = dom对象
㈢ jQuery $(window).scroll事件出现问题
web前端开发 20 年变迁史,让我们来看看这20年里,web前端究竟经历了哪些变革,web前端在这20年里又有哪些突破和成就,怎么样看待这20年的web前端开发!
1990年,第一个Web浏览器诞生,而WWW的诞生直接拉开前端史的序幕。
从静态页面到Java,从依赖后端到自主开发,前端开发者从不被重视的“页面仔”逆袭为如今很多前端工程师的薪资比后端还高,从前端技术由国外开发者主导到如今国内自主产生的小程序技术,我们走了20年。
了解web前端:http://www.cnite.cn/qianan/
作者 | 司徒正美
责编 | 伍杏玲
1990 年,第一个Web浏览器的诞生;1991 年,WWW诞生,这标志着前端技术的开始。
在这将近20年的前端发展史中,我们经历了从最早的纯静态页面,到Java跨时代的诞生;从PC端到移动端;从依赖后端到前端可自由打包开发;从早期的网景Navigator浏览器到现在各家浏览器百花齐放……
我们经历了前端的洪荒时代、Prototype时代、jQuery时代 、后jQuery时期、三大框架割据时代,这其中均是由国外开发者主导,直到如今的小程序时代,才是中国开发者独创的。
这是漫长的技术储备下的成果,最终促成了良好的技术成长收获。期间的前端发展之路,崎岖艰难:
洪荒时代(1990~1994年)
在1990~1994年期间,前端界发生的大事有:WWW(World Wide Web)的诞生、浏览器的诞生、Java的诞生,没有专业的前端,页面全是由后端开发的。
1990年,万维网之父蒂姆·伯纳斯-李(Tim Berners-Lee)在NeXT电脑上发明了第一个Web浏览器。
1991年8月6日,Tim在alt.hypertext新闻组贴出了一份关于World Wide Web的简单摘要,这标志了Web页面在Internet上的首次登场。
最早的Web主要被一帮科学家们用来共享和传递信息,全世界的Web服务器也就几十台。由于仅是用来传递信息,从可视化方式或从传递数量上看,仅比电报强一点点。
当时还没有Java,用的是纯静态的页面。
1993年,CGI(Common Gateway Interface)出现了,人们可以在后端动态生成页面。
Perl由于跨操作系统和易于修改的特性成为CGI的主要编写语言。当然,CGI也支持其他支持标准输入输出和环境变量的语言编写,比如Shell脚本、C/C++语言,只要符合接口标准即可。
但显然,页面的内容更新完全由后端生成,这带来一个明显的缺憾:每次更新都要整页刷新,加上早期的网速情况,这个操作是非常慢的。因此针对这情况,人们从多方面着手改进:编写语言的升级、浏览器的升级、HTML的升级。
1994年,网景公司成立,发布了第一款商业浏览器Navigator。自从这款浏览器面世后,微软推出IE浏览器。虽说有竞争才有发展,但这也埋下了Java分裂的种子。
(1994 年,网景浏览器的截图)
同年,PHP诞生。PHP能将动态的内容嵌入到HTML中,提升了编写页面的效率与可读性,其性能也比一般的CGI高。PHP的界定符、循环语句等的发明,深刻影响了后来的ASP、jsP,乃致后来的Java前端模板引擎。
1994年10月,W3C小组也成立了,他们负责HTML的发展路径,其宗旨是通过促进通用协议的发展。
待这一切就绪后, Java于1995年诞生了。
传闻,网景工程师布兰登·艾克(Brendan Eich)只花了10天时间设计出 Java 语言,近乎上帝七日创造世界那么高效。但也因为工期太短的缘故,导致许多瑕疵,因此一直被正统传序员所嫌弃,直到Ajax的出世,才让人们找到理由忍受它的畸形。早期的浏览器都配有一个选项,用来禁止Java语言运行。
Java主要语言特征[1]:
借鉴C语言的基本语法;
借鉴Java语言的数据类型和内存管理;
借鉴Scheme语言,将函数提升到"第一等公民"(first-class citizen)的地位;
借鉴Self语言,使用基于原型(Prototype)的继承机制。
时下,静态语言大行其道,类与接口被证明是构建大工程的最佳实践,人们想不出没有类的语言如何编写业务。因此当时的微软也打造了另一门运行于浏览器的语言——VB。
如果继续细探Java的能力,你会发现它早期真的非常空洞,一门没有灵魂的语言,没有包管理机制,也没有像Java与C++那样的打辅助用的SDK,内置的方法也屈指可数。比如说数组方法,早期只有push、pop、shift、unshift、splice、slice、sort、reverse、concat、join等操作。动态调用方面,Function的apply、call操作还没有出现!
早年的偷懒,导致后来不得不补课:到了2019年,数组上的原型方法,是原来3倍。
除了方法缺乏,还有性能问题,大家讨论用eval还是Function,用哪种循环方式,用parseInit还是~~,就是为了那一点点的性能提升。例如jsperf.com,就是一个专门研究Java性能的网站。
因此Java诞生后,其两大任务就是完善语言特性与提高性能。这两座大山分别由着名的prototype.js与jQuery来搬掉。
在搬掉之前,前端界还有一个曲折实践——第一次浏览器战争,并由其发展而来UA嗅深技术。
浏览器战争(1994~2005年)
浏览器战争一共打了三场,IE浏览器vs网景浏览器、IE浏览vs火狐浏览器、IE浏览器vs谷歌浏览器。
第一场浏览器之战打得尤其激烈。
微软的IE浏览器发布于1994年,但此时的网景已经占领绝对优势。微软在落后的情况,反编译Netscape的源码,推出IE与J。但是由于Bug非常多,大家不愿意为IE开发网站,因此发掘出UA,专门过滤掉IE浏览器。
UA即Navigator.userAgent ,是用一个字符串来记录用户当前运行在什么操作系统与浏览器中。当前IE3的UA是这样的:
Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)
程序判断UA信息,假如发现当前运行的环境是IE浏览器的话,就提示用户用网景浏览器打开。因此微软不得不让自己的UA尽量伪装成网景的UA,欺骗用于检测UA的脚本,达到IE浏览器可以跑这些网站的目的。
最终,第一次浏览器之战以微软胜利,Netscape被美国在线收购,而落下帷幕。
第一次浏览器战争年代非常久远了,但其结局告诉我们,其实技术强弱并不重要。那时技术保护并没有这么重视,否则微软的行为可能会被告(谷歌的openSDK仅抄袭几十行代码,被Oracle公司诉讼赔88亿)。
第一次浏览器战争带来了一个问题:尽管当时有ECMA-262(Java规范文档)与W3C(HTML与CSS的规范文档),微软却没有照规范来实现Java、HTML与CSS,导致前端兼容问题的诞生。所以CSS Hack、浏览器判定、特性侦测,这些技术就应运而生。
这个时代最着名的人物是Dean Edwrad,他是最早的近乎完美解决事件绑定的兼容性大神,其addEvent()内置于jQuery最早的版本中。jQuery的作者John Resig看到其超强的技艺,最后放弃推出大而全的框架,专攻选择器引擎。
Dean Edwrad的IE7.js、IE8.js是早期处理浏览器兼容的良药,可以说是一切Polyfill[2]的起源。他写了大量的Hack, 比如在IE如何测量元素的宽高,许多操作DOM的兼容。
这时期太早,中国基本没有参与这次浏览器战争。
Prototype时期(2005~2009年)
Prototype是Sam Stephenson写的一个非常优雅的Java基础类库。他是Ruby的大牛,因此Prototype的许多方法名都是来自Ruby界。
Sam Stephenson最大的贡献是发掘了Prototype与创造了Function.prototype.bind,在数组上也写了一大堆方法,其中许多被标准化了。
同期的MooTools也是Prototype的方法,当时,大家还在前端论坛为这个争吵。还有前端工程师喜欢在当时很出名的前端聚集地——蓝色理想(现沦为设计师网站)上,讨论如何扒脚本、分享弹层、日历等小组件的技术,这在当时已经是非常了不起的事。
Prototype当时还解决两大问题:动画特效与Ajax请求。动画特效是由aculous提供,我们现在所熟知的各种缓动函数,各种特效的命名与大致的运行形态,都是由aculous确定下来的。
在早期,谷歌就开始使用iframe实现页面刷新。
2005 年2月,杰西·詹姆士·贾瑞特(JesseJamesGarrett)发表了一篇名为《Ajax:一种Web应用程序开发的新方法》的文章后,Ajax被挖掘出,大家才开始重视起这技术的应用。
例如IE下的ActiveXObject("Microsoft.XMLHTTP"),这是IE创建Ajax引擎的。假如当时有工程师开发出一个核心库,如果不包含Ajax的封装,便不好意思发布出来。
一些Ajax书藉
当时前端开发模式是选择一个核心库,找一些组件,或者扒别人的脚本进行开发
Prototype的源码挺好理解的,代码量也少,只有5000多行,里面的每个方法也很易扒出来,因此一些大公司总有高手能创造自己的Prototype。
但前端开发还是离不开后端,因为前端没有模块机制,当时我们需要用PHP进行打包。打包是雅虎34条军规之一,可以减少请求数。打包的同时也可以进行混淆,防止代码小偷来窥探。
N年前,前端面试必问的题目:
模块化的雏型, 在注释中标注它的依赖
这个时期,还没有前后端分离,可国内一些带着深厚后端背景的高手已经入场。
jQuery 时期(2009~2012年)
2006年,jQuery发布,它当时的竞争对手很多:Dojo、Prototype、ExtJS、MooTools。
所以那时jQuery的宣传口号仅能说是它的性能上升了100%、200%、300%。直到2009年,Sizzle选择器引擎研发成功,jQuery才取得压倒性的优势。
当时前端界首要面对的是浏览器兼容性问题,jQuery在处理DOM兼容上真是知微见着, 发掘出大量的DOM/BOM兼容方案(例如Dean Edwrad的addEvent(), IE的px转换方案,domReady的doScroll方案,globalEval的兼容方案等)
jQuery也打破了前端开发者的编程思维,之前是按照后端的开发思路来的:做一个业务就先封装一个类,有了这个类后,再想办法传入一个DOM,然后再通过类方法操作DOM。而jQuery是DOM为中心,开发者可以选一个或多个DOM,变成jQuery对象,然后进行链式操作。当时为了改变用户的思维,国内的高手写了不少文章来引导大家。
其次,开发者们已开始注重前后端分离,并要求不能污染Object原型对象,不能污染window全局变量。这样,jQuery只占用两个全局变量。
再次,jQuery非常轻量级,采用Dean Edwards编写的Packer压缩后, 大小不到30KB。并且里面实现得非常精妙,以令人瞠目的手段解决各种兼容痼疾。
为了学习这些技巧,高手们翻了一遍遍jQuery的源码,所以网上有大量关于其源码详解的书藉。甚至前端工程师在面试时也会被考到jQuery的源码实现,这样,jQuery在国内更加流行。
jQuery的流行间接带来以下的发展:
促使人们对CSS1~CSS3选择器的学习
促进了浏览器原生选择器引擎document.querySelectorAll、Element.matches的诞生
提高人们对domReady(DOMContentLoaded事件)的认识
促进了Promise与requestAnimateFrame 的诞生
最重要的是降低前端门槛,让更多人进入这行业,前端工程师的队伍越来越壮大。
这样的话,不断涌现出优秀的工程师,他们创造了大量jQuery插件与UI库。为后jQuery时代,人们研发前端模块加载、统一异步机制、 打造大型MVC框架, 甚至伸向后端,接管打包脚本而发明Node.js,来腾出大量时间。
这个时期涌现了大量jQuery-like的库,其中最着名的是Zepto.js。Zepto的出现也标志着我们进入移动互联网时代。那时配套出的着名库还有iScroll、fastclick、Lazy Load、Modernizr、fullPage。
jQuery的链式操作风麾一时,也带来许多问题,当Ajax出现依赖时,就不可避免就出现回调地狱。因此针对这方面的讨论,诞生Deffered与Promise。有关回调地狱的讨论,在后来讲Node.js异步处理时,将会再一次热烈地讨论。因此太阳下没有新事,我们总是遇到相似的问题。
jQuery如此多的选择器也法维护,随着越来越多人涌现这行业,页面的交互也越来越复杂,从Web Page向Web App进化,新的趋势带来新的开发方式。
后jQuery时期(2012~2016年)
这时期以RequireJS的诞生为起点,以RN的出现结束。同时解决了前端的模块定义问题,模块打包问题(通过Node.js),Java不依靠其他语言创造了一套自己的工具链。
jQuery的出现让前端工程师开发更加轻松,假如工程师想实现一个功能,现搜索出一个jQuery插件来实现。那时候大家在前端网站就整天介绍jQuery插件,很少讨论一些底层的实现。
前端工程师通常编写一个页面,会引入十多个乃至几十个jQuery插件,页面上塞满了标签。众所周知,浏览器是单线程,的加载,会影响到页面的解析与呈现,导致着名的白屏问题(当时前端用力过勐,body中的所有东西都是动态生成的)。
jQuery另一个问题是全局污染,由于插件的质量问题,或者开发的素质问题,这已经是IIEF模块或命名空间等传统手段无法解决了。
于是一些优秀的前端工程师们决定从取经后端,引入模块机制。早期,这种模块机制在Dojo、EXT这些框架中都是内置的,但是显然说服不了另一个框架的用户用对方的模块机制,于是有人立志要统一这种模块定义方式,成立了CommonJS。
但不料,CommonJS内部也有派系,谁也说不服对方。终于有一个人忍不住自己独立开发出RequireJS,其模块规范即为AMD。 AMD最大的优势是它支持各种插件,且简单明了,并且提供shim机制加载以非AMD规范编写的Java代码。
但在CommonJS诞生很久一段时间后,在后端的Node.js出现时才有用武之地。而国内,则流行另一种规范风格,背靠阿里的大旗,有人推出了SeaJS,号称其规范为CMD。其实无论国内还是国外,都产生许多模块加载器,但最后还是被淘汰了,规范一个就够了,不宜过多。
但是前端工程师的创造力就是这么惊人,从无到有,再到泛滥成灾,一年足矣。这可能与前端代码是开源的原因。最后有人统一了前两种规范(AMD、Node.js模块),同时还支持老式的“全局”变量规范。
自此,Java开发模式焕然一身了,大家只要在代码外面包一层就可以全世界通用,不用提心全局污染的问题。
其次,jQuery开发者需要解决大段HTML的生成问题,之前jQuery有$.html, $.append, $before等方法,可以将一大段符合HTML结构的字符串转换成DOM再插入到页面上。
但现在我们想分离出来,让HTML独立到不同的文件中,然后插数据,这就是前端模板。前端模板的情况与模板规范一样,从没有到多如芝麻的境地。这时筛选一个好用且性能高的模板是一件让前端工程师头疼的问题,那时网上有许多评测文章来介绍它们。
前端模板技术可以用一个公式来描述:
HTML = template(vars)
有了前端模板后,又诞生了前端路由,基于它们,人们发明一个新词汇SPA。作为这个时代的尾声,来自Ruby界的高手Ryan Dahl发明了Node.js。 前端工程师们欢唿:可以不用传统的后端就能自己写一个网站了!
Node.js的发展就不详述上,很快它就冒出海量模块、路由、状态管理、数据库、MVC框架都有了。这时,前端就缺自己的MVC框架了。Node.js转眼就十岁生日了。
着名的MEAN架构,是Java全栈开发的先锋。当时涌现了大量的MVC与MVVM框架。最先火起来的是Backbone.js,使用纯正的MVC模型, Backbone.js是jQuery最后的支持者,它强依赖于jQuery。
Backbone.js的作者还搞了另一套编译语言Coffee, 里面的箭头函数、类机制、 解构赋值等语法糖都深深影响了后来的ES6。
接着下来是谷歌的Angular,微软的Knockout.js,苹果的Ember.js这三个MVVM框架,MVVM就是比MVC多一个数据绑定功能,但这数据绑定功能是非常难实现。Knockout是使用函数代替属性的技巧实现,它的设计影响到后来的Mobx;Ember.js是基于Object.defineProperty;Angular是将函数体转译成setter()、getter()函数。
大公司的介入,对个人开发者影响是很大,毕竟大家都爱迷信大公司,因此局面一下子就稳定下来。大公司还带来了全新的开发模式,早期都是找一个核心库,再搜刮一大堆插件,然后自己写业务代码,最后后端打包。
大公司将后端开发经验挪用过来,用Node.js开发了一套CLI,里面包含了脚手架生成, 打包脚本、语法风格检测、环境变量插入,代码复杂度检测,代码提交时自动跑单元测试, 图片与JS压缩等功能。ESLint、JSLint、JSHint、CSS Lint、 htmllint等就是那时期出现的。
但CLI的出现导致了前端的分裂,以前大家都使用jQuery,但自CLI帮你建好项目的那一刻起,就将你划归某一子阵营,你是Angular?Ember.js?还是jQuery?对了,jQuery没有大公司支撑的阵营被快速边缘化。
对于个人开发者,他们是没有能力开发这么功能完备的CLI,于是出现了Code Climate、Travis CI、CircleCI这样的平台。它们的出现标志着jQuery小作坊时代的终结了。
CircleCI官网
前端开发者也出现分化:有些人转向后端,出现了CNode的门户网站。另外一些人开始搞工程化。一时间出现上百种构建工具,出名的有Grunt、Gulp、FIS3、webpack、 Rollup、npm-。
你方唱罢我登场,这些构建工具均会经历时代的考验,如大浪淘沙般,最后存活得仅为寥寥。
因此在这场工程化得盛宴中,注定把许多低层次的jQueryer淘汰掉。jQueryer在空闲之余培育出的前端模板、前端路由、MVC框架、模块加载器、Node.js构建工具,却不料最终成为它自己的挖墓人。
jQuery的时代一去不返了,再没有人关心拖堂拖了N年的Bootstrap 4终于发布了,没有人知道jQuery3.5的瘦身计划,也没有人问jQuery的源码,渐渐地,大家不关注jQuery的工具链了。
三大框架割据时代(2016~至今)
React是突然爆发的,虽然它是与Angular是同时期发布,但因为JSX怪异的语法让人们远离它。此时已经进入移动互联网的中期,大公司都有自己的App,或者基于原生,或者基于Hybird。
Hybird是用WebView加载一个网站或一个SPA。
由于原生成本太贵,需要招两套班子,一套安卓的,一套iOS的;而Hybird则一直存在性能问题。于是在2017年,Facebook推出了React Native(RN)。
RN的性能不比原生差多少,比Hybird能好些, 其次使用JSX开发界面比原生的快; RN 只需要低成本的前端开发人员就能上手了。中国国内经过瀑布流(图片导购)、团购、P2P、区块链等全新商业模式的开发浪潮后,前端人员数量大增。现在,他们只要稍微培训就可以转型为App开发。
在开发RN的过程中,人们开始了解React一系列的优胜之处。比如JSX背后的虚拟DOM技术,虽然事实证明虚拟DOM不会带来性能的巨大优势,但保证了你怎么写其性能不会太差。
React为了引入JSX,必须需要引入编译,这又间接促成Babel与webpack的壮大。尤其是Babel, 让我们在很旧的浏览器中使用非常新的语法,甚至一些还没有定案的语法。React从14升级到React 15,强制使用class语法,让这个推了好久的语法糖终于大规模落地。
之前如果Java想使用类,只能自己模拟类,由于没有官方的实现,只能任由各优秀工程师发挥。而普通人想用好类,需要了解很复杂的Prototype机制。
现在只用几个新关键字就可以得到这一切。
如果对比Python 2与Python 3间的升级,Java实在太辛运了!针对CSS逻辑功能过弱的问题,我们也有了新的解决方案:Less、Sass、PostCSS与CSS Moles!
谷歌在发布Angular的同时,也发布了一个叫Polymer的框架,那时它想推广一种叫Web Components的浏览器自定义组件技术。这其实是微软在IE5就玩剩的HTC技术的升级版。虽然它没有火起来,但它将、Style、Template三种内容混在一个文件的设计,启发一个留美华人,再结合当时的Backbone.js、Angular等设计,Vue.js横空出世。目前,这是国人最成功的前端框架了。
除此之外,国人也弄了好几套迷你React框架与迷你Vue框架。这有点像jQuery时代,大家疯狂做迷你jQuery框架一样。
总的来说,最有创造力的是React团队,做出状态管理器、CSS-in-JS、Flow静态类型检查、devTool、Fetch、前后端同构、Fiber、suspend、并发渲染等名词层出不穷。其中,状态管理器拥有上百套, CSS-in-JS也拥有上百套,Flow则让前端尝鲜到接口编程的好处,间接推动发Type发展。这三大框架无法比拼个一二出来:Vue.js有国人的拥趸,React与Angular有大公司光环。
三大框架的缠斗从PC领域扩展到移动端:React有RN, Vue.js有Weex,Angular有ionic。想当年我们为了兼容浏览器,攒了一大堆浏览器侦探的Hack,全部贬值为垃圾了。
在这时期,一种全新的后端渲染崛起,称之为前后同构,既拥有早期SEO的功效,又能复用大量的业务逻辑。随着国内移动互联网的发展,获客成本提高,各种有效的商业模式都进入红海,但只有头部用户能赚到钱,马太效应越来越严重,纯粹的技术解决方案已经无法满足商业诉求了。
小程序时代(2017~至今)
小程序时代与三大框架的时代几乎重合,但是出自不同一批人,决战的平台也不一样。
一直以来前端技术都是由国外开发者主导的,即便是Vue.js也是由美国的华人创造的。但是国内外的技术更新是存在代差,国内通常延期两三年,这个时间差可以让一些模仿者得以生存(如SeaJS、FIS、avalon)。但随着封闭的时间越来越长,国内肯会也会诞生自己的转有物种。小程序就是其中之一。
小程序的出现有着明显的商业诉求,因为马太效应,一些超大流量的App诞生了。这些大流量App集成了许多功能,但显然公司再多员工,也无法所有功能全是自己弄,于是产生小程序这种“外包”的手段。
小程序是国内前端技术的一次厚积薄发:底层运行的迷你React的虚拟DOM, 内置组件是使用Web Component,API来源于Hybird的桥方法,打包使用webpack,调试台是Chrome console的简化版, WXML、WXSS的语法高亮也应该是webpack或VS Code的插件, 模块机制是Node.js的CommonJS……其中最值得一提的是微信开发者工具,以后开发者工具成了各种小程序/快应用的标配。
但微信小程序一开始的复用能力非常弱,没有类继承,不能使用npm, 不支持Less、Sass, 因此基于它的转译框架就应运而生。第一代译转框架是wept、WePY、mpvue,它们无一例外是Vue风格的。因为WXML的模板指令与Vue非常相似,只是改一下就能兼容。当时也出现了一个MINA的框架,听说是微信团队开发的,可以单独架起Node.js后端,让小程序运于浏览器中,方便做单元测试。
第一代转译框架主要是基于Template标签实现组件机制,自定义组件机制是很后的事了。这就造成了利用第一代转译框架编写的小程序项目很难升级。那时候是个人开发者的天堂,这些框架都是某一大牛独力开发的。
第二代转译框架是大公司主导的,因为需要兼容的小程序越来越多,网络、支付宝、字节跳动、小米、华为等公司都推出自己的小程序和快应用。个人开发者很难凭个人力量去开发转译框架,这时候各大团队纷纷推出自己的轮子:如京东的Taro、滴滴的Chameleon网易的Megalo、去哪儿网的nanachi、网络的Okam等。
在这个时期,Angular显然落伍了,一是Angular升级太快,国内的高手还没有消化好,新一版的Angular又发布了。二是国内缺乏迷你Angular的轮子,导致庞大的Angular无法塞进小程序中。
国外谷歌发布了Flutter跨平台转译框架,但是它的编写语言是Dart,它也无法跨界到小程序中。
未来不仅国内一线巨头争夺小程序,二三线的巨头也可能会加入小程序的混战中,例如有人称360也在打造自己的小程序平台。小程序这种新的流量变现模式深刻地影响了国内的互联网布局。
结语
当初Java被误解为最糟糕的语言,时至今日它是最流行的语言:GitHub 60%的开源项目都是与Java有关。
以前,从事这行业的人被称为页面仔,现在他们的起薪有的比PHP、JAVA、C++等后端还高。甚至有人说,“任何可以使用Java来编写的应用,最终会由Java编写。”
我们前端开发者触及的领域不仅仅是浏览器,还可以做后端,做桌面端,做手机端,做小程序端,前端开发者的性价比越来越高,越来越重要。可谓是时代造英雄。
笔者有幸成为前端开发者大队伍中的一员,也坚信我们前端开发者以后的路会越来越宽,越来越好走。
资料:
[1]:计算机和编程语言的发展历史
[2]:Polyfill是一块代码(通常是 Web 上的 Java),用来为旧浏览器提供它没有原生支持的较新的功能。
作者简介:司徒正美,拥有十年纯前端经验,着有《Java框架设计》一书,去哪儿网公共技术部前端架构师。爱好开源,拥有mass、Avalon、nanachi等前端框架。目前在主导公司的小程序、快应用的研发项目。
本文链接:http://www.cnite.cn/qianan/share/20198308.html
㈣ jquery click 多次绑定,多次触发,怎么清除历史绑定事件
$("p").off("click");
定义和用法
off() 方法通常用于移除通过on()方法添加的事件处理程序。
自 jQuery 版本 1.7 起,off() 方法是 unbind()、die() 和 undelegate() 方法的新的替代品。该方法给 API 带来很多便利,我们推荐使用该方法,它简化了 jQuery 代码库。
注意:如需移除指定的事件处理程序,当事件处理程序被添加时,选择器字符串必须匹配 on() 方法传递的参数。
提示:如需添加只运行一次的事件然后移除,请使用one()方法。
语法
$(selector).off(event,selector,function(eventObj),map)
㈤ jQuery的历史版本
2006年8月,jQuery的第一个稳定版本,并且已经支持选择符、事件处理和AJAX交互2007年7月,jQuery 1.1.3版发布,这次小版本的变化包含了对jQuery选择符引擎执行速度的显著提升。2008年5月,jQuery 1.2.6版发布,这版主要是将Brandon Aaron开发的流行的Dimensions插件的功能移植到了核心库中,同时也修改了许多BUG,而且有不少的性能得到提高。2009年1月,jQuery 1.3版发布,它使用了全新的选择符引擎Sizzle,在各个浏览器下全面超越其他同类型JavaScript框架的查询速度,程序库的性能也因此有了极大提升。2010年1月,也是jQuery的四周年生日,jQuery 1.4版发布,为了庆祝jQuery四周岁生日,jQuery团队特别创建了jQuery14.com站点,带来了连续14天的新版本专题介绍。2010年2月,jQuery 1.4.2版发布,它新增了有关事件委托的两个方法:delegate()和undelegate()。2011年1月,jQuery 1.5版发布。2011年5月,jQuery 1.6版发布。该版本重写了Attribute模块和大量的性能改进。2011年,11月,jQuery 1.7版发布。总结:目前jQuery有1.x和2.x还有3.x三个主要版本,区别在于2.x移除了对古老的IE 6、7、8的支持,因此2.x的代码更精简。选择哪个版本主要取决于你是否想支持IE 6~8
㈥ js除了有JQuery框架以外,还有哪些强大点的框架,或者比较实用的也可以。。 谁能给我介绍一下
目前来看,JS框架以及一些开发包和库类有如下几个,Dojo 、Scriptaculous 、Prototype 、yui-ext 、Jquery 、Mochikit、mootools 、moo.fxDojo (JS library and UI component ):Dojo是目前最为强大的j s框架,它在自己的Wiki上给自己下了一个定义,dojo是一个用JavaScript编写的开源的DHTML工具箱。dojo很想做一个“大一统”的 工具箱,不仅仅是浏览器层面的,野心还是很大的。Dojo包括ajax, browser, event, widget等跨浏览器API,包括了JS本身的语言扩展,以及各个方面的工具类库,和比较完善的UI组件库,也被广泛 应用在很多项目中,他的UI组件的特点是通过给html标签增加tag的方式进行扩展,而不是通过写JS来生成,dojo的API模仿Java类库的组织 方式。 用dojo写Web OS可谓非常方便。dojo现在已经4.0了,dojo强大的地方在于界面和特效的封装,可以让开发者快速构建一些兼容标准的界面。优点:库相当完善,发展时间也比较长,功能强大,据说利用dojo的io.bind()可以实现comet,看见其功能强大非一般,得到IBM和SUN的支持缺点:文件体积比较大,200多KB,初次下载相当慢,此外,dojo的类库使用显得不是那么易用,j s语法增强方面不如prototype。Prototype (JS OO library):是一个非常优雅的JS库,定义了JS的面向对象扩展,DOM操作API,事件等等,以prototype为核心,形成了一个外围的各种各样 的JS扩展库,是相当有前途的JS底层框架,值得推荐,感觉也是现实中应用最广的库类(RoR集成的AJAX JS库),之上还有 Scriptaculous 实现一些JS组件功能和效果。优点:基本底层,易学易用,甚至是其他一些js特效开发包的底层,体积算是最小的了。缺点:如果说缺点,可能就是功能是他的弱项Scriptaculous (JS UI component based on prototype):Scriptaculous是基于prototype.js框架的JS效果。包含了6个js文件,不同的文件对应不同的js效果,所以说,如果底层用 prototype的话,做js效果用Scriptaculous那是再合适不过的了,连大名鼎鼎的digg都在用他,可见不一般优点:基于prototype是最大的优点,由于使用prototype的广泛性,无疑对用户书锦上添花,并且在《ajax in action》中就拿Scriptaculous来讲述js效果缺点:刚刚兴起,需要时间的磨练yui-ext (JS UI component):基于Yahoo UI的扩展包yui-ext是具有CS风格的Web用户界面组件 能实现复杂的Layout布局,界面效果可以和backbase媲美,而且使用纯javascript代码开发。真正的可编辑的表格Edit Grid,支持XML和Json数据类型,直接可以迁入grid。许多组件实现了对数据源的支持,例如动态的布局,可编辑的表格控件,动态加载的Tree 控件、动态拖拽效果等等。1.0 beta版开始同Jquery合作,推出基于jQuery的Ext 1.0,提供了更多有趣的功能。优点:结构化,类似于java的结构,清晰明了,底层用到了Jquery的一些函数,使整合使用有了选择,最重要的一点是界面太让让人震撼了。缺点:太过复杂,整个界面的构造过于复杂。Jquery :jQuery是一款同prototype一样优秀js开发库类,特别是对css和XPath的支持,使我们写js变得更加方便!如果你不是个js高手又想写出优 秀的js效果,jQuery可以帮你达到目的!并且简介的语法和高的效率一直是jQuery追求的目标,优点:注重简介和高效,js效果有yui-ext的选择,因为yui-ext 重用了很多jQuery的函数缺点:据说太嫩,历史不悠久。Mochikit :MochiKit自称为一个轻量级的js框架。MochiKit 主要受到 Python 和 Python 标准库提供的很多便利之处的启发,另外还缓解了浏览器版本之间的不一致性。其中的 MochiKit.DOM 尤其方便,能够以比原始 JavaScript 更友好的方式处理 DOM 对象。MochiKit.DOM 大部分都是针对 XHTML 文档定制的,如果与 MochiKit 和 Ajax 结合在一起,使用 XHTML 包装的微格式尤其方便。Mochikit可以直接对字符串或者数字格式化输出,比较实用和方便。它还有自己的 js 代码解释器优点:MochiKit.DOM这部分很实用,简介也是很突出的缺点:轻量级的缺点mootools :MooTools是一个简洁,模块化,面向对象的JavaScript框架。它能够帮助你更快,更简单地编写可扩展和兼容性强的JavaScript代码。Mootools跟prototypejs相类似,语法几乎一样。但它提供的功能要比prototypejs多,而且更强大。比如增加了动画特效、拖放操作等等。优点:可以定制自己所需要的功能,可以说是prototypejs的增强版。缺点:不大不小,具体应用具体分析moo.fx :moo.fx是一个超级轻量级的javascript特效库(7k),能够与prototype.js或mootools框架一起使用。它非常快、易于使用、跨浏览器、符合标准,提供控制和修改任何HTML元素的CSS属性,包括颜色。它内置检查器能够防止用户通过多次或疯狂点击来破坏效果。moo.fx整体采用模块化设计,所以可以在它的基础上开发你需要的任何特效。优点:小块头有大能耐缺点:这么小了,已经不错了
㈦ html 鼠标停在表格行上面,那一行就换一个背景色。用 jquery / js 怎么做
IE历史版本对于hover这个CSS伪类的解析只能识别在a:href标签上面,其它的一概不认识。jQuery做过兼容了,直接jQuery("tr").hover(function(){jQuery(this).css({'background':'#ccc'});},function(){jQuery(this).css({'background':'none'});});hover中两个function参数分别对应: mouseover和mouseout,jQuery已经做了包装。
㈧ jquery 3.2 有哪些新东西
我们先来讨论 jQuery 3 中最重要的几个新增特性。for…of Loopfor…of 循环在 jQuery 3 中,我们可以用 for…of 循环语句来迭代一个 jQuery 集合中的所有 DOM 元素。这种新的迭代方法是 ECMAScript 2015(即 ES6)规范中的一部分。这个方法可以对 “可迭代对象”(比如Array、Map、Set 等)进行循环。当使用这种新的迭代方法时,你在循环体内每次拿到的值并不是一个 jQuery 对象,而是一个 DOM 元素(译注:这一点跟 .each() 方法类似)。当你在对一个 jQuery 集合进行操作时,这个新的迭代方法可以少许改善你的代码。为了搞清楚这种迭代方法到底是怎么工作的,我们来假设一个场景——你需要给页面中的每个 input 元素分配一个 ID。在 jQuery 3 之前,你可能会这样写:var $inputs = $('input');for(var i = 0; i < $inputs.length; i++) {$inputs[i].id = 'input-' + i;}而在 jQuery 3 中,你就可以这样写了:var $inputs = $('input');var i = 0; for(var input of $inputs) { input.id = 'input-' + i++;}(译注:其实 jQuery 自己是有个 .each() 方法的,可读性也不赖。)New signature for $.get() and $.post()$.get() 和 $.post() 函数的新签名jQuery 3 为 $.get() 和 $.post() 这两个工具函数增加了新签名,从而使得它们和 $.ajax() 的接口风格保持一致。新签名是这样的:$.get([settings])$.post([settings])settings 是一个对象,它包含多个属性。它的格式和你以前传给 $.ajax() 的参数格式是一样的。如果你想更清楚地了解这个参数对象,请参考 $.ajax() 页面 中的相关描述。$.get() 和 $.post() 的参数对象与传给 $.ajax() 的参数相比,唯一的区别就是前者的 method 属性总是会被忽略。原因其实也很简单,$.get() 和 $.post() 本身就已经预设了发起 Ajax 请求的 HTTP 方法了(显然 $.get() 就是 GET,而 $.post() 就是 POST)。也就是说,正常人类应该是不会想用 $.get() 方法来发送一个 POST 请求的。假设有以下一段代码:$.get({url: 'https://funteas.com',method: 'POST' // 这个属性将被忽略});不管我们把 method 属性写成什么,这个请求总是会以 GET 的方式发出去的。Use of requestAnimationFrame() for Animations采用 requestAnimationFrame() 来实现动画所有现代浏览器(包括 IE10 及以上)都是支持 requestAnimationFrame 的。jQuery 3 将会在内部采用这个 API 来实现动画,以便达到更流畅、更省资源的动画效果。unwrap()unwrap() 方法jQuery 3 为 unwrap() 方法增加了一个可选的 selector 参数。这个方法的新签名是这样的:unwrap([selector])有了这个特性,你就可以给这个方法传入一个包含选择符表达式的字符串,用它来在父元素内进行匹配。如果存在匹配的子元素,则这个子元素的父层将被解除;如果没有匹配,则不进行操作。Features Changed有变更的特性jQuery 3 还修改了一些特性的行为。:visible and :hidden:visible 和 :hiddenjQuery 3 将会修改 :visible 和 :hidden 过滤器的含义。只要元素具有任何布局盒,哪怕宽高为零,也会被认为是 :visible。举个例子,br 元素和不包含内容的行内元素现在都会被 :visible 这个过滤器选中。因此,如果你的页面中包含如下的结构:<div></div><br />然后运行以下语句:console.log($('body :visible').length);在 jQuery 1.x 和 2.x 中,你得到的结果会是 0;但在 jQuery 3 中,你会得到 2。data()data() 方法另一个重要的变化是跟 data() 方法有关的。现在它的行为已经变得跟 Dataset API 规范 一致了。jQuery 3 将会把所有属性键名转换成驼峰形式。我们来详细看一下,以如下元素为例:<div id="container"></div>当我们在用 jQuery 3 以前的版本时,如果运行如下代码:var $elem = $('#container');$elem.data({ 'my-property': 'hello'});console.log($elem.data());将会在控制台得到如下结果:{my-property: "hello"}而在 jQuery 3 中,我们将会得到如下结果:{myProperty: "hello"}请注意,在 jQuery 3 中,属性名已经变成了驼峰形式,横杠已经被去除了;而在以前的版本中,属性名会保持全小写,并原样保留横杠。The Deferred ObjectDeferred 对象jQuery 3 还改变了 Deferred 对象的行为。Deferred 对象可以说是 Promise 对象的前身之一,它实现了对Promise/A+ 协议 的兼容。这个对象以及它的历史都相当有意思。如果想要深入了解,你可以去阅读 jQuery 官方文档,也可以去看我写的书《jQuery 实战(第三版)》——这本书也涵盖了 jQuery 3。在 jQuery 1.x 和 2.x 中,传给 Deferred 的回调函数内如果出现未捕获的异常,会立即中断程序的执行(译注:即静默失败,其实 jQuery 绝大多数回调函数的行为都是这样的)。而原生的 Promise 对象并非如此,它会抛出异常,并不断向上冒泡,直至到达 window.onerror(通常冒泡的终点是这里)。如果你没有定义一个函数来处理这个错误事件的话(通常我们都不会这么做),那这个异常的信息将会被显示出来,此时程序的执行才会停止。jQuery 3 将会遵循原生 Promise 对象的模式。因此,回调内产生的异常将会导致失败状态(rejection),并触发失败回调。一旦失败回调执行完毕,整个进程就将继续推进,后续的成功回调将被执行。为了让你更好地理解这个差异,让我们来看一个小例子。比如我们有如下代码:var deferred = $.Deferred();deferred.then(function() {throw new Error('An error');}).then(function() {console.log('Success 1');},function() {console.log('Failure 1');}).then(function() {console.log('Success 2');},function() {console.log('Failure 2');});deferred.resolve();在 jQuery 1.x 和 2.x 中,只有第一个函数(也就是抛出错误的那个函数)会被执行到。此外,由于我们没有为 window.onerror 定义任何事件处理函数,控制台将会输出 “Uncaught Error: An error”,而且程序的执行将中止。而在 jQuery 3 中,整个行为是完全不同的。你将在控制台中看到 “Failure 1” 和 “Success 2” 两条消息。那个异常将会被第一个失败回调处理,并且,一旦异常得到处理,那么后续的成功回调将被调用。SVG DocumentsSVG 文档没有哪一个 jQuery 版本(包括 jQuery 3)曾官方宣称支持 SVG 文档。不过事实上有很多方法是可以奏效的,此外还有一些方法在以前是不行的(比如操作类名的那些方法),但它们在 jQuery 3 中也得到了更新。因此,在 jQuery 3 中,你应该可以放心使用诸如 addClass() 和 hasClass() 这样的方法来操作 SVG 文档了。Methods and Properties Deprecated or Removed已废弃、已移除的方法和属性在增加了上述改进的同时,jQuery 也移除、废弃了一些特性。Deprecation of bind(), unbind(), delegate() and undelegate()废弃 bind()、unbind()、delegate() 和 undelegate() 方法jQuery 在很久以前就引入了 on() 方法,它提供了一个统一的接口,用以取代 bind()、delegate() 和live() 等方法。与此同时,jQuery 还引入了 off() 这个方法来取代 unbind()、undelegated() 和die() 等方法。从那时起,bind()、delegate()、unbind() 和 undelegate() 就已经不再推荐使用了,但它们还是一直存在着。jQuery 3 终于开始将这些方法标记为 “废弃” 了,并计划在未来的某个版本(很可能是 jQuery 4)中将它们彻底移除。因此,请在你的项目中统一使用 on() 和 off() 方法,这样你就不用担心未来版本的变更了。Removal of the load(), unload() and error() Methods移除 load()、unload() 和 error() 方法jQuery 3 彻底抛弃了 load()、unload() 和 error() 等已经标记为废弃的方法。这些方法在很早以前(从 jQuery 1.8 开始)就已经被标记为废弃了,但一直没有去掉。如果你正在使用的某款插件仍然依赖这些方法,那么升级到 jQuery 3 会把你的代码搞挂。因此,在升级过程中请务必留意。Removal of context, support and selector移除 context、support 和 selector 属性jQuery 3 彻底抛弃了 context、support 和 selector 等已经标记为废弃的属性。同上,在升级到 jQuery 3 时,请留意你正使用的插件。Bugs fixed已修复的 BugjQuery 3 修复了以往版本中的一些非常重要的 bug。在本节中,我将着重介绍其中两处,因为这两者应该会对你写代码的习惯带来显著影响。No More Rounding for width() and height()width() 和 height() 的返回值将不再取整jQuery 3 修复了 width()、height() 和其它相关方法的一个 bug。这些方法的返回值将不再舍入取整,因为这种取整行为在某些情况下不便于对元素进行定位。我们来详细看一看。假设你一个宽度为 100px 的容器元素,它包含了三个子元素,宽度均为三分之一(即 33.333333%):<div class="container"><div>My name</div><div>is</div><div>Aurelio De Rosa</div></div>在 jQuery 3 以前的版本中,如果你尝试通过以下代码来获取子元素的宽度……$('.container div').width();……那么你得到结果将是 33。原因在于 jQuery 会把 33.33333 这个值取整。而在 jQuery 3 中,这个 bug 已经被修复了,因此你将会得到更加精确的结果(即一个浮点数)。wrapAll()wrapAll() 方法jQuery 3 还修复了 wrapAll() 方法中的一个 bug,这个 bug 出现在把一个函数作为参数传给它的情况下。在 jQuery 3 以前的版本中,当一个函数被传给 wrapAll() 方法时,它会把 jQuery 集合中的每个元素单独包裹起来。换句话说,这种行为和把一个函数传给 wrap() 时的行为是完全一样的。在修复这个问题的同时,还引入了另外一个变更:由于在 jQuery 3 中,这个函数只会调用一次了,那就无法把 jQuery 集合中每个元素都传给它。因此,这个函数的执行上下文(this)将只能指向当前 jQuery 集合中的第一个元素。
㈨ jquery方面的技术材料等。
《jQuery开发技术详解》是由季国飞编著的计算机应用技术类书籍;该书由电子工业出版社于2010年出版发行。全书共分三篇:第一篇介绍Web开发必备的基础知识,如JavaScript语言基本语法、DOM文档对象模型以及在Web开发中经常用到的工具等;第二篇介绍jQuery中的选择器、DOM操作、事件、动画效果以及AJAX等的使用;第三篇通过若干比较完整的实例来讲解jQuery在具体项目中的使用,如增强用户体验、AJAX跨域操作、与PHP配合构建动态网站、键盘操作以及将数据以可视化形式显示等。目录图书信息宣传语内容简介前言目录展开编辑本段图书信息书名:jQuery开发技术详解 作者:季国飞 编著出 版 社: 电子工业出版社ISBN 978-7-121-10417-6出版时间: 2010-3-1页数:472页开本: 16开定价:59.00元(含CD光盘1张)编辑本段宣传语一线人员,为您讲述jQuery那独特的魅力!编辑本段内容简介jQuery是目前在Web开发领域最流行的JavaScript库之一。本书通过理论与实践相结合的方式,由浅入深、循序渐进地介绍jQuery库的使用;同时又辅以大量真实开发案例,可以让用户很轻松地就能使用jQuery来增强网页的互动性,做出更好的Web前端产品以及各种更炫更酷的效果。本书是一本注重jQuery理论与Web开发实践相结合的基础教程,适合各层次的Web开发人员阅读和参考。章与章之间的内容相对独立,读者可以根据自己的情况选择阅读。阅读本书的读者最好对XHTML/HTML /CSS有一定的了解。编辑本段前言jQuery是一个优秀的开源JavaScript库。它的体积很小,代码风格独特而又优雅,改变了JavaScript程序员编写程序的方式和思路。jQuery库有一条设计理念,那就是“写的少,做的多”(write less, do more)。其独特的选择器、链式的DOM操作方式、事件绑定机制、封装完善的AJAX使其在众多优秀的JavaScript库中脱颖而出,独树一帜,赢得了众多使用者的拥护和信赖。jQuery的语法简单易学,而且具有很强大的跨平台性,可以兼容多种核心的浏览器。目前,已经有一百多个插件来扩充jQuery的功能,使得jQuery能满足几乎所有客户端的脚本开发。但是,目前来说专门介绍jQuery的书籍还很少,中文的书籍更是少之又少,这就给国内一些想要学习jQuery的Web开发爱好者制造了不小的障碍。为了方便广大读者学习,本人花费将近一年的时间写作这本书。本书通过理论与实践相结合的方式,由浅入深、循序渐进地介绍jQuery库的使用;同时又辅以大量真实的开发案例,可以让用户很轻松地就能使用jQuery来增强网页的互动性,做出更好的Web前端产品以及各种更炫更酷的效果。本书的特点1.循序渐进,由浅入深阅读本书不需要对jQuery有所了解,甚至对JavaScript也不需要有很深的了解。为了方便读者学习,本书在第一篇首先介绍Web开发的基础知识,如JavaScript的基础语法等,以期读者可以在不参考其他资料的情况下顺利过渡到jQuery的学习和使用。2.技术全面,内容充实本书是一本关于jQuery的初级入门读物。书中详细介绍了jQuery 1.3.2几乎所有的特性和属性,并对每个模块均有很翔实的实例讲解。以期读者对jQuery有个很好的整体把握,同时以后需要用到一些特性的时候,可以进行查阅。另外,本书还在开始介绍了Web开发的基础知识,如Web开发中比较常用的工具等,可以让读者从一个完全的门外汉很快变成业内人士。3.图文结合,理解深刻讲解技术类的知识,最好的方式就是面对面的讲授,但是图书却不太容易做到这一点。为了弥补这个缺憾,本书在讲解具体实例的时候,除了大量的注释、讲解之外,还辅以一些简洁明了的图片,以期让读者对实例以及jQuery效果有更直观的理解。4.真实案例,随学随用本书是一本注重实践的书。因此,有大量的篇幅用在了真实的Web开发案例中。本书第三篇通过若干比较完整的实例来讲解jQuery在具体项目中的使用,如增强用户体验、AJAX跨域操作、与PHP配合构建动态网站、键盘操作以及将数据以可视化形式显示等。读者可以通过这些实例对jQuery的理论知识有更加深刻的理解,同时,这些实例稍作修改,就可以用在读者正在开发的项目中去,来实现各种精彩的效果。5.配有源代码光盘,加速学习为了让初学者快速入门,本书配套光盘中附赠了本书中的所有源代码。读者可以参考阅读。但是,笔者依然强烈建议,在学习本书的时候应该边学边练。即便不能不看书直接写代码,最好也要对着书上的代码手工敲入一边,以加深印象以及自己对知识本身的理解。篇 名 章 名 内容介绍第一篇 jQuery预备基础篇 第1章 Web开发的发展与趋势 本章主要介绍当前Web开发的现状、Web的标准概念、Web 2.0与Web 1.0的区别与联系,并通过当前的一些使用jQuery构建的大型网站,对jQuery能实现的效果进行简单介绍,以期读者对jQuery的强大有个更加直观的了解。第2章 JavaScript基础 本章主要介绍JavaScript的基础知识,包括JavaScript中的变量、数据类型、操作符的使用、流程控制的方法,以及JavaScript数组以及函数的创建和使用。第3章 文档对象模型(DOM) 本章主要介绍DOM的基本概念,如DOM的树结构以及节点的概念等。同时,也将介绍JavaScript中访问以及操作DOM节点的方法,包括获取元素、获取元素内的文本和元素内的HTML内容、创建一个新的DOM节点、插入或者删除一个DOM节点元素等。通过本章的介绍,读者可以对DOM的操作方式有所了解,为后续章节使用jQuery操作DOM元素做好铺垫。第4章 工欲善其事,必先利其器——开发工具 本章将介绍网页设计过程中经常使用的工具,如SciTE、Notepad++等代码编辑工具,使用Blackbird、Firebug以及Venkman对JavaScript代码进行调试,以及Web Developer Toolbar工具栏的使用、JavaScript代码的压缩及混淆工具等。这些工具可以有效地提高编写代码及设计网站的效率,有必要熟练掌握其使用方法。第二篇 jQuery基础篇 第5章 jQuery快速上手 本章将介绍了jQuery的由来和优势,并对目前几个流行的JavaScript库进行了介绍和对比。另外还将演示一个最简单的jQuery程序,通过这个示例,让读者对jQuery的$(document).ready()函数有一个基本的认识,并对jQuery选择器的使用以及click()函数也有初步的概念。第6章 使用选择器获得要操作的元素 本章将介绍jQuery选择器中的基本选择器、层次选择器以及滤镜选择器,滤镜选择器中又对基本滤镜选择器、子元素滤镜选择器、表单滤镜选择器以及属性滤镜选择器分别结合具体实例展开详细的介绍。第7章 操作得到的元素 本章介绍jQuery中操作得到的元素以及元素集的方法,包括对属性、样式类、CSS以及内容的操作,对元素集查找以及筛选的函数,以及jQuery中的链式操作等。通过使用这些函数,可以很方便地操作页面上的任意元素。续表篇 名 章 名 内容介绍第二篇 jQuery基础篇 第8章 使用jQuery进行DOM操作 本章介绍jQuery中比较常用的对页面上DOM元素的操作方式,包括在元素内部以及外部插入元素,对页面上的DOM元素进行包裹、替换、删除以及克隆等操作。通过熟练使用这些DOM元素操作函数,可以很方便地对页面内容进行操控,再结合其他效果函数的使用,将可以为用户提供更加强大且有很好用户体验的应用。第9章 jQuery中的事件处理 本章介绍jQuery中的事件处理机制。jQuery在JavaScript基本的事件处理机制的基础上,对其进行了增强和扩展,使得jQuery事件处理不但有优雅的语法,而且功能也更加强大。本章首先介绍了$(document).ready()事件的概念、jQuery事件的绑定与反绑定、触发器等,并对jQuery中众多的内置事件类型作了简单的分类和介绍。第10章 jQuery中的动画与效果 本章介绍jQuery中的动画与效果,包括隐藏与显示、滑动效果以及淡入淡出效果等。本章将结合实例讨论这些效果的实现和应用,并将介绍jQuery中使用animate自定义动画的方法,以及jQuery中动画队列的概念及其使用方法。第11章 jQuery 与AJAX 本章将介绍jQuery中AJAX的使用方法。首先介绍AJAX的实现原理及其最核心的组成部分XMLHttpRequest对象的概念和使用方式;然后介绍jQuery中用来支持AJAX的几个核心函数,包括load、get、post、getScript以及getJSON等,并对最核心的AJAX函数作了较为详细的介绍;同时,还将介绍jQuery中在使用AJAX时支持的几种服务器端数据类型返回方式,以及jQuery在实现AJAX完整请求过程中的各个步骤以及各个阶段的主要功能。第12章 回头重看jQuery——核心及工具 本章将对jQuery的核心方法进行回顾,主要介绍jQuery中对象访问的通用函数、jQuery中的数据缓存机制和插件机制,以及jQuery中的常用工具类。使用这些工具类,可以更方便地完成对浏览器检测、获得及处理数组与对象等操作。第三篇 jQuery应用篇 第13章 jQuery增强用户体验 本章将介绍目前在Web设计领域比较流行的网站内容的动态加载技术的jQuery实现,如“高亮菜单”、“加载提示”等,并将通过一个动态切换样式的例子进一步展示如何满足用户多元化、个性化的需求,对jQuery的cookie插件也将有所介绍。第14章 jQuery中使用AJAX跨域操作 本章将介绍使用jQuery中的AJAX技术进行跨域操作的方法,并通过对flickr、delicious以及Google AJAX Search等网站API调用的实例,演示Script方式以及JSONP方式在跨域操作中的应用。使用该特性,可以很容易地做出新颖有趣的混搭应用。第15章 jQuery+ PHP动态网站实践 本章将介绍jQuery在PHP动态网站建站中的使用,通过两个实例来具体讲解:一个是构建网站的标签云功能;一个是构建简单的微博客系统。通过这些实例,读者可以了解,使用jQuery并结合一种动态脚本语言,可以实现很多很丰富的内容。第16章 jQuery键盘操作 本章将介绍使用jQuery实现与键盘操作相关的功能,例如:如何在网页上使用快捷键进行页面内容的切换,或者使用jQuery来实现软键盘的操作等。续表篇 名 章 名 内容介绍第三篇 jQuery应用篇 第17章 jQuery可视化数据显示 本章将介绍数据的可视化显示对用户的理解以及阅读带来的优越性,以及使用jQuery插件对数据进行可视化的方法。在本章的实例中,将使用jQuery为其添加更加丰富的功能,例如Tooltip提示等,进一步增强了用户体验。读者可以在本文基础上对flot插件进行深入研究,实现出更加复杂与实用的图表。适合的读者本书是一本注重jQuery理论与Web开发实践相结合的基础教程,章与章之间的内容相对独立,读者可以根据自己的情况选择阅读。适合各层次的Web开发人员阅读和参考,主要适合于:Web前端开发人员Web后台设计人员Web设计爱好者大中专院校学生本书作者本书由季国飞编写,参与编写的人员有昊燃、方振宇、陈冠佐、傅奎、陈勤、梁洋洋、毕梦飞、陈庆、柴相花、陈非凡、陈华、陈嵩、承卓、陈先在,在此表示感谢!季国飞2010年1月编辑本段目录第一篇 jQuery预备基础篇第1章 Web开发的发展与趋势 21.1 Web标准 21.1.1 XML 31.1.2 XHTML 31.1.3 CSS 41.1.4 DOM 41.1.5 ECMAScript 51.2 传统互联网与Web 2.0 51.2.1 传统网络Web 1.0 51.2.2 最近的新宠Web 2.0 61.3 jQuery能做什么 111.3.1 更加丰富的导航菜单 111.3.2 Tab内容的切换 131.3.3 人性化的提示信息 131.3.4 可定制的用户内容 141.3.5 动态的图片展示效果 151.3.6 AJAX实时局部刷新 161.3.7 数据的可视化显示 171.4 jQuery知识体系及学习建议 171.4.1 jQuery知识体系 171.4.2 学习建议 191.5 小结 19第2章 JavaScript基础 202.1 什么是JavaScript 202.2 语法规则 212.2.1 大小写敏感 212.2.2 空格、换行与可选的分号 232.2.3 注释 252.2.4 关键字和保留字 262.2.5 在页面上插入JavaScript代码 282.3 变量 292.3.1 变量的命名 292.3.2 变量的声明 302.3.3 变量的使用 322.3.4 全局变量和局部变量 332.4 JavaScript中的数据类型 352.4.1 字符串类型 362.4.2 数值类型 372.4.3 布尔类型 372.4.4 undefined类型 382.4.5 null类型 402.4.6 NaN类型 402.5 数据类型间转换 412.5.1 使用toString()转换为字符串 412.5.2 使用parseInt()转换为整型数 432.5.3 使用parseFloat()转换为浮点数 452.6 JavaScript操作符 472.6.1 比较操作符 472.6.2 逻辑操作符 482.6.3 JavaScript操作符优先级 492.7 流程控制 502.7.1 条件语句 502.7.2 循环语句 542.8 数组 562.8.1 创建一个数组 572.8.2 使用数组元素 582.8.3 使用多维数组 582.9 函数 592.9.1 函数的定义 592.9.2 函数的参数及返回值 602.10 小结 61第3章 文档对象模型(DOM) 623.1 什么是DOM 623.2 DOM的结构和节点 633.2.1 DOM的树结构 633.2.2 DOM中的节点 653.3 访问DOM节点 673.3.1 按id取元素:getElementById() 673.3.2 按标签名取元素集:getElementsByTagName() 683.4 操作元素内的文本 703.5 操作元素内的HTML 723.6 修改DOM节点 733.6.1 创建DOM节点 743.6.2 插入DOM节点 763.6.3 删除DOM节点 783.7 小结 80第4章 工欲善其事,必先利其器——开发工具 814.1 代码编辑工具 814.1.1 SciTE 814.1.2 Notepad++ 824.1.3 Dreamweaver 834.2 调试工具 844.2.1 使用Blackbird进行调试 844.2.2 使用Firebug进行调试 854.2.3 使用Venkman进行调试 914.3 其他工具 924.3.1 Web Developer Toolbar 924.3.2 JavaScript压缩混淆工具 994.4 小结 100第二篇 jQuery基础篇第5章 jQuery快速上手 1025.1 什么是jQuery 1025.2 为什么选择jQuery 1025.2.1 当前流行JavaScript库比较 1035.2.2 jQuery的优势 1065.3 配置jQuery开发环境 1075.3.1 获取jQuery最新版本 1075.3.2 jQuery库类型说明 1085.3.3 在页面中引用jQuery库 1085.3.4 jQuery 1.2.6新特性及主要改变 1105.3.5 jQuery 1.3.2新特性及主要改变 1125.4 准备HTML和CSS代码 1145.4.1 演示框架目录结构 1155.4.2 HTML代码 1155.4.3 CSS代码 1175.5 编写jQuery代码 1195.6 小结 122第6章 使用选择器获得要操作的元素 1236.1 CSS选择器 1236.1.1 使用CSS选择器 1236.1.2 通配选择器 1246.1.3 标签选择器 1246.1.4 ID选择器 1256.1.5 类选择器 1256.1.6 后代选择器 1266.1.7 子元素选择器 1276.1.8 相邻兄弟选择器 1276.1.9 属性选择器 1286.2 jQuery选择器 1306.2.1 基本选择器 1306.2.2 层次选择器 1356.2.3 基本滤镜选择器 1396.2.4 子元素滤镜选择器 1516.2.5 表单滤镜选择器 1566.2.6 属性滤镜选择器 1646.3 小结 167第7章 操作得到的元素 1687.1 操作属性 1687.1.1 读取属性 1687.1.2 修改属性 1707.1.3 删除属性 1737.2 操作样式类 1747.2.1 添加样式类 1747.2.2 去除样式类 1767.2.3 交替样式类 1777.3 操作CSS 1787.3.1 读取CSS样式 1787.3.2 设置CSS样式 1807.3.3 获得元素偏移信息 1827.3.4 获得和设置高度 1837.3.5 获得和设置宽度 1857.4 操作内容 1867.4.1 操作HTML代码 1867.4.2 操作文本 1887.4.3 操作值 1907.5 查找与筛选元素 1937.5.1 过滤元素集 1937.5.2 在元素集中查找 1977.6 链式操作 2027.6.1 使用链式操作 2037.6.2 结束当前操作对象 2057.6.3 添加当前操作对象到先前对象 2077.7 小结 208第8章 使用jQuery进行DOM操作 2098.1 在元素内部插入DOM元素 2098.2 在元素外部插入DOM元素 2148.3 包裹DOM元素 2178.3.1 使用指定的元素标记进行包裹 2178.3.2 使用HTML标记进行包裹 2208.3.3 包裹内部元素 2228.4 替换DOM元素 2238.5 删除DOM元素 2258.6 克隆DOM元素 2278.7 小结 229第9章 jQuery中的事件处理 2309.1 页面载入完毕响应事件 2309.1.1 jQuery中的$(document).ready()事件 2309.1.2 window.onload()事件和$(document).ready()事件的比较 2319.2 绑定与反绑定事件监听器 2339.2.1 绑定事件 2339.2.2 反绑定事件 2389.2.3 一次性的事件绑定 2399.3 事件触发器 2419.3.1 trigger触发事件 2419.3.2 triggerHandler触发事件 2449.4 事件的交互处理 2459.4.1 hover:模仿鼠标悬停 2469.4.2 toggle:多次单击的循环响应 2479.5 jQuery内置事件类型 2489.5.1 jQuery内置事件函数的两种声明方式 2499.5.2 jQuery内置事件类型分类 2509.6 小结 253第10章 jQuery中的动画与效果 25410.1 基本效果 25410.1.1 隐藏元素 25410.1.2 显示元素 25810.1.3 交替显示隐藏 25910.2 滑动效果 26010.2.1 向上收缩效果 26010.2.2 向下展开 26210.2.3 交替伸缩样式 26210.3 淡入淡出效果 26310.3.1 淡入效果 26310.3.2 淡出效果 26510.3.3 自定义不透明度 26510.4 自定义动画效果 26610.4.1 自定义动画 26610.4.2 jQuery动画队列 27010.5 小结 273第11章 jQuery与AJAX 27411.1 AJAX的应用 27411.1.1 AJAX的历史 27411.1.2 AJAX经典应用 27511.2 AJAX原理与XMLHttpRequest对象 27811.2.1 AJAX的原理 27911.2.2 XMLHttpRequest对象 28111.3 jQuery中的AJAX 28411.3.1 load()、get()和post()函数 28411.3.2 ajax函数 29411.3.3 getScript及getJSON函数 30011.4 jQuery中的AJAX服务器端返回方式 30411.4.1 html方式 30511.4.2 text方式 30711.4.3 xml方式 30811.4.4 script方式 31611.4.5 json方式 31611.5 jQuery中的AJAX事件 31811.5.1 AJAX局部事件 31811.5.2 AJAX全局事件 32011.6 小结 323第12章 回头重看jQuery——核心及工具 32412.1 核心函数 32412.1.1 核心函数形式 32412.1.2 使用核心函数 32612.2 jQuery对象访问 32912.2.1 获得长度 32912.2.2 获得其中某个对象 32912.2.3 遍历对象集 33212.3 数据缓存 33312.3.1 隐藏数据 33312.3.2 设置和获取元素的缓存数据 33412.3.3 删除缓存数据 33612.4 jQuery常用工具类 33712.4.1 浏览器相关 33712.4.2 数组与对象相关 34012.4.3 其他功能性函数 34812.5 jQuery插件机制 34912.5.1 jQuery.extend(object) 35012.5.2 jQuery.fn.extend(object) 35112.6 小结 352第三篇 jQuery应用篇第13章 jQuery增强用户体验 35413.1 动态加载显示内容 35413.1.1 设计网站外观及显示 35413.1.2 jQuery 动态加载内容 35613.2 改进:增强用户体验 35813.2.1 高亮当前选中菜单 35813.2.2 加载时提示“正在加载…” 35913.3 动态切换样式 36113.3.1 jQuery样式切换简单实现 36113.3.2 使用Cookie保存用户选项 36313.3.3 使用jQuery.cookie插件 36613.4 小结 368第14章 jQuery中使用AJAX跨域操作 36914.1 跨域操作的实现方式 36914.1.1 Script方式实现跨域操作 36914.1.2 JSONP方式实现跨域操作 37114.2 跨域操作flickr网站API 37414.3 跨域操作delicious网站API 37814.4 跨域操作Google AJAX Search API 38214.5 小结 388第15章 jQuery+PHP动态网站实践 38915.1 标签云(Tag Cloud) 38915.1.1 标签云的概念与使用 38915.1.2 标签云显示样式设计 39015.1.3 设计MySQL数据库 39415.1.4 构建PHP代码 39515.1.5 构建jQuery代码 39815.2 类twitter微博客系统 39915.2.1 微博客系统 40015.2.2 设计MySQL数据库 40315.2.3 构建PHP代码及jQuery代码 40415.2.4 功能改进:增加字数统计功能 40815.3 小结 410第16章 jQuery键盘操作 41116.1 键盘快捷键动态切换页面 41116.1.1 需求与最终效果 41116.1.2 HTML及CSS代码 41216.1.3 jQuery代码 41616.2 使用插件进行改进 42016.2.1 存在的问题 42016.2.2 js-hotkeys插件的使用 42116.2.3 使用js-hotkeys插件改进本章示例 42316.3 软键盘的实现 42516.3.1 软键盘的使用 42516.3.2 准备HTML及CSS代码 42516.3.3 构建jQuery代码 43016.3.4 最终效果 43316.4 小结 435第17章 jQuery可视化数据显示 43617.1 数据的可视化显示 43617.2 使用flot插件可视化数据显示 43817.2.1 flot插件介绍 43817.2.2 准备HTML及CSS代码 43917.2.3 构建jQuery代码 44217.2.4 实现折点上的Tooltip显示 44817.3 小结 451