jquery深造二....

一.什么是jQuery

jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方

法。它的作者是John Resig,于2006年创建的一个开源项目,随着越来越多开发者的加入,jQuery已经集成了JavaScript、CSS、DOM和Ajax于一体的强大功能。它可以用最少的代码,

二.jQuery的版本

2006年8月发布了jQuery1.0,第一个稳定版本,具有对CSS选择符、事件处理和Ajax交互的支持。

2007年1月发布了jQuery1.1,极大的简化API。合并了许多较少使用的方法。2007年7月发布了jQuery1.1.3,优化了jQuery选择符引擎执行的速度。2007年9月发布了jQuery1.2,去掉了XPath选择器,新增了命名空间事件。2008年5月发布了jQuery1.2.6,引入了Dimensions插件到核心库中。

2009年1月发布了jQuery1.3,使用了全新的选择符引擎Sizzle,性能进一步提升。

2010年1月发布了jQuery1.4,进行了一次大规模更新,提供了DOM操作,增加了很

多新的方法或是增强了原有的方法。

2010年2月发布了jQuery1.4.2,添加了.delegate()和.undelegate()两个新方法,提升

了灵活性和浏览器一致性,对事件系统进行了升级。

2011年1月发布了jQuery1.5,重写了AJAX组件,增强了扩展性和性能。

2011年5月发布了jQuery1.6,重写了Attribute组件,引入了新对象和方法。

2011年11月发布了jQuery1.7,引入了.on()和.off()简介的API解决事件绑定及委托容

易混淆的问题。

2012年3月发布了jQuery1.7.2,进行一些优化和升级。

2012年7月发布了jQuery1.8,8月发布了1.8.1,9月发布了1.8.2,重写了选择符引

擎,修复了一些问题。

2013年1月发布了jQuery1.9,CSS的多属性设置,增强了CSS3。2013年5月发布了jQuery1.10,增加了一些功能。

2013年4月发布了jQuery2.0,5月发布了jQuery2.0.2,一个重大更新版本,不在支

持IE6/7/8,体积更小,速度更快。

jquery是一个库,通过对原生js的函数得到整套完整的封装好的方法!避免了js有些不兼容!简化js繁琐的!

版本的内容升级主要也有三种:

第一种是核心库的升级,比如优化选择符、优化DOM或者AJAX等;这种升级不影响开发者的使用。

第二种是功能性的升级,比如剔除一些过时的方法、新增或增强一些方法等等;这种升级需要了解和学习。第三种就是BUG修复之类的升级,对开发者使用没有影响


其他JavaScript库

目前除了jQuery,还有5个库较为流行,他们分别是YUI、Prototype、Mootools、Dojo和ExtJS。

YUI,是雅虎公司开发的一套完备的、扩展性良好的富交互网页工具集。Prototype,是最早成型的JavaScript库之一,对JavaScript内置对象做了大量的扩展。Dojo,Dojo强大之处在于提供了其他库没有的功能。离线存储、图标组件等等。Mootools,轻量、简洁、模块化和面向对象的JavaScript框架。

ExtJS,简称Ext,原本是对YUI的一个扩展,主要创建前端用户界面。(付费的)


一.代码风格

$(function () {});

$(‘#box’);$(‘#box’).css(‘color’, ‘red’);

//执行一个匿名函数//进行执行的ID元素选择//执行功能函数

二.加载模式

我们在之前的代码一直在使用$(function () {});这段代码进行首尾包裹,那么为什么必须

要包裹这段代码呢?原因是我们jQuery库文件是在body元素之前加载的,我们必须等待所

有的DOM元素加载后,延迟支持DOM操作,否则就无法获取到。

在延迟等待加载,JavaScript提供了一个事件为load,方法如下:window.onload = function () {};//JavaScript等待加载$(document).ready(function () {});//jQuery等待加载

load和ready区别

1.执行时机  window.onload    必须等待网页全部加载完毕(包括图片等),然后再执行包裹代码,只能执行一次,如果第二次,那么第一次的执行会被覆盖

2.$(document).ready()只需要等待网页中的DOM结构加载完毕,就能执行包裹的代码,可以执行多次,第N次都不会被上

在实际应用中,我们都很少直接去使用window.onload,因为他需要等待图片之类的大型元素加载完毕后才能执行JS代码。所以,最头疼的就是网速较慢的情况下,页面已经全面展开,图片还在缓慢加载,这时页面上任何的JS交互功能全部处在假死状态。并且只能执行单次在多次开发和团队开发中会带来困难。

三.对象互换

jQuery对象虽然是jQuery库独有的对象,但它也是通过JavaScript进行封装而来的。我

们可以直接输出来得到它的信息。

alert($);//jQuery对象方法内部

alert($());//jQuery对象返回的对象,还是jQuery

alert($('#box'));//包裹ID元素返回对象,还是jQuery

从上面三组代码我们发现:只要使用了包裹后,最终返回的都是jQuery对象。这样的

好处显而易见,就是可以连缀处理。但有时,我们也需要返回原生的DOM对象,比如:

alert(document.getElementById('box'));//[object HTMLDivElement]

jQuery想要达到获取原生的DOM对象,可以这么处理:

alert($('#box').get(0));//ID元素的第一个原生DOM

四.多个库之间的冲突

当一个项目中引入多个第三方库的时候,由于没有命名空间的约束(命名空间就好比同

一个目录下的文件夹一样,名字相同就会产生冲突),库与库之间发生冲突在所难免。

1.将jQuery库在Base库之前引入,那么“$”的所有权就归Base库所有,而jQuery可

以直接用jQuery对象调用,或者创建一个“$$”符给jQuery使用。

var $$ = jQuery;

$(function () {

alert($('#box').ge(0));

alert($$('#box').width());

});

2.如果将jQuery库在Base库之后引入,那么“$”的所有权就归jQuery库所有,而Base库将会冲突而失去作用。这里,jQuery提供了一个方法:

jQuery.noConflict();

var $$ = jQuery;

$(function () {

alert($('#box').ge(0));

alert($$('#box').width());

});

//将$符所有权剔除

常规选择器

jQuery最核心的组成部分就是:选择器引擎。它继承了CSS的语法,可以对DOM元素的标签名、属性名、状态等进行快速准确的选择,并且不必担心浏览器的兼容性。jQuery选择器实现了CSS1~CSS3的大部分规则之外,还实现了一些自定义的选择器,用于各种特殊状态的选择


一.简单选择器

在使用jQuery选择器时,我们首先必须使用“$()”函数来包装我们的CSS规则。而CSS规则作为参数传递到jQuery对象内部后,再返回包含页面中对应元素的jQuery对象。

随后,我们就可以对这个获取到的DOM节点进行行为操作了。

#box {//使用ID选择器的CSS规则color:red;//将ID为box的元素字体颜色变红}

在jQuery选择器里,我们使用如下的方式获取同样的结果:

$('#box').css('color', 'red');//获取DOM节点对象,并添加行为

那么除了ID选择器之外,还有两种基本的选择器,分别为:元素标签名和类(class):

选择器

CSS模式

jQuery模式

描述

元素名div {}$('div')获取所有div元素的DOM对象

ID#box {}$('#box')获取一个ID为box元素的DOM对象

类(class).box{}$('.box')获取所有class为box的所有DOM对象$('div').css('color', 'red');

$('#box').css('color', 'red');

$('.box').css('color', 'red');

//元素选择器,返回多个元素//ID选择器,返回单个元素//类(class)选择器,返回多个元素

为了证明ID返回的是单个元素,而元素标签名和类(class)返回的是多个,我们可以采

用jQuery核心自带的一个属性length或size()方法来查看返回的元素个数。

alert($('div').size());

alert($('#box').size());alert($('.box').size());

//3个

//1个,后面两个失明了//3个

同理,你也可以直接使用jQuery核心属性来操作:alert($('#box').length);//1个,后面失明了

警告:有个问题特别要注意,ID在页面只允许出现一次,我们一般都是要求开发者要

遵守和保持这个规则。但如果你在页面中出现三次,并且在CSS使用样式,那么这三个元

素还会执行效果。但如果,你想在jQuery这么去做,那么就会遇到失明的问题。所以,开

发者必须养成良好的遵守习惯,在一个页面仅使用一个ID。

$('#box').css('color', 'red');//只有第一个ID变红,后面两个失明

jQuery选择器的写法与CSS选择器十分类似,只不过他们的功能不同。CSS找到元素

后添加的是单一的样式,而jQuery则添加的是动作行为。最重要的一点是:CSS在添加样

式的时候,高级选择器会对部分浏览器不兼容,而jQuery选择器在添加CSS样式的时候却

不必为此烦恼。

#box > p {//CSS子选择器,IE6不支持color:red;

}

$('#box > p').css('color','red');//jQuery子选择器,兼容了IE6

jQuery选择器支持CSS1、CSS2的全部规则,支持CSS3部分实用的规则,同时它还有

少量独有的规则。所以,对于已经掌握CSS的开发人员,学习jQuery选择器几乎是零成本。

而jQuery选择器在获取节点对象的时候不但简单,还内置了容错功能,这样避免像JavaScript那样每次对节点的获取需要进行有效判断。

$('#pox').css('color', 'red');//不存在ID为pox的元素,也不报错document.getElementById('pox').style.color = 'red';//报错了

因为jQuery内部进行了判断,而原生的DOM节点获取方法并没有进行判断,所以导

致了一个错误,原生方法可以这么判断解决这个问题:

if (document.getElementById('pox')) {//先判断是否存在这个对象document.getElementById('pox').style.color = 'red';

}

那么对于缺失不存在的元素,我们使用jQuery调用的话,怎么去判断是否存在呢?因

为本身返回的是jQuery对象,可能会导致不存在元素存在与否,都会返回true。

if ($('#pox').length > 0) {//判断元素包含数量即可$('#pox').css('color', 'red');

}

除了这种方式之外,还可以用转换为DOM对象的方式来判断,例如:

if ($('#pox').get(0)) {}或if ($('#pox')[0]) {}//通过数组下标也可以获取DOM对象

二.进阶选择器

在简单选择器中,我们了解了最基本的三种选择器:元素标签名、ID和类(class)。那么

在基础选择器外,还有一些进阶和高级的选择器方便我们更精准的选择元素。

选择器

CSS模式

jQuery模式

描述

群组选择器span,em,.box {}$('span,em,.box')获取多个选择器的DOM对象

后代选择器ul li a {}$('ul li a')获取追溯到的多个DOM对象

通配选择器* {}$('*')

获取所有元素标签的DOM对象

//群组选择器span, em, .box {color:red;}

$('span, em, .box').css('color', 'red');

//后代选择器ul li a {color:red;}

$('ul li a').css('color', 'red');

//通配选择器* {

color:red;

}

$('*').css('color', 'red');


目前介绍的六种选择器,在实际应用中,我们可以灵活的搭配,使得选择器更加的精准和快速:

$('#box p, ul li *').css('color', 'red');//组合了多种选择器

警告:在实际使用上,通配选择器一般用的并不多,尤其是在大通配上,比如:$('*'),

这种使用方法效率很低,影响性能,建议竟可能少用。

还有一种选择器,可以在ID和类(class)中指明元素前缀,比如:

$('div.box');//限定必须是.box元素获取必须是div$('p#box div.side');//同上

类(class)有一个特殊的模式,就是同一个DOM节点可以声明多个类(class)。那么对于这

种格式,我们有多class选择器可以使用,但要注意和class群组选择器的区别。

.box.pox {//双class选择器,IE6出现异常color:red;

}

$('.box.pox').css('color', 'red');//兼容IE6,解决了异常

多class选择器是必须一个DOM节点同时有多个class,用这多个class进行精确限定。

而群组class选择器,只不过是多个class进行选择而已。

$('.box, .pox').css('color', 'red');//加了逗号,体会区别

警告:在构造选择器时,有一个通用的优化原则:只追求必要的确定性。当选择器筛选

越复杂,jQuery内部的选择器引擎处理字符串的时间就越长。比如:

$('div#box ul li a#link');//让jQuery内部处理了不必要的字符串$('#link');//ID是唯一性的,准确度不变,性能提升

三.高级选择器

在前面我们学习六种最常规的选择器,一般来说通过这六种选择器基本上可以解决所有

DOM节点对象选择的问题。但在很多特殊的元素上,比如父子关系的元素,兄弟关系的元

素,特殊属性的元素等等。在早期CSS的使用上,由于IE6等低版本浏览器不支持,所以

这些高级选择器的使用也不具备普遍性,但随着jQuery兼容,这些选择器的使用频率也越

来越高。

描述

后代选择器ul li a {}$('ul li a')获取追溯到的多个DOM对象

子选择器div > p {}$('div p')只获取子类节点的多个DOM对象

next选择器div + p {}$('div + p')只获取某节点后一个同级DOM对象

nextAll选择器div ~ p {}$('div ~ p')获取某节点后面所有同级DOM对象

在层次选择器中,除了后代选择器之外,其他三种高级选择器是不支持IE6的,而jQuery却是兼容IE6的。

//后代选择器

$('#box p').css('color', 'red');//全兼容

jQuery为后代选择器提供了一个等价find()方法

$('#box').find('p').css('color', 'red');

//子选择器,孙子后失明#box > p {

color:red;

}

$('#box > p').css('color', 'red');

//和后代选择器等价

//IE6不支持

//兼容IE6

jQuery为子选择器提供了一个等价children()方法:$('#box').children('p').css('color', 'red');//和子选择器等价

//next选择器(下一个同级节点)

#box + p {//IE6不支持

color:red;

}

$('#box+p').css('color', 'red');//兼容IE6

jQuery为next选择器提供了一个等价的方法next():

$('#box').next('p').css('color', 'red');

//nextAll选择器(后面所有同级节点)#box ~ p {

color:red;

}

$('#box').nextAll('p').css('color', 'red');//和nextAll选择器等价

层次选择器对节点的层次都是有要求的,比如子选择器,只有子节点才可以被选择到,

孙子节点和重孙子节点都无法选择到。next和nextAll选择器,必须是同一个层次的后一个

和后N个,不在同一个层次就无法选取到了。

在find()、next()、nextAll()和children()这四个方法中,如果不传递参数,就相当于传递

了“*”,即任何节点,我们不建议这么做,不但影响性能,而且由于精准度不佳可能在复杂

的HTML结构时产生怪异的结果。

$('#box').next();//相当于$('#box').next('*');

为了补充高级选择器的这三种模式,jQuery还提供了更加丰富的方法来选择元素:$('#box').prev('p').css('color', 'red');//同级上一个元素$('#box').prevAll('p').css('color', 'red');//同级所有上面的元素

推荐阅读更多精彩内容

  • 原文链接 http://blog.poetries.top/2016/10/20/review-jQuery 关注...
    poetries阅读 13,798评论 16 493
  • 一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.co...
    凛0_0阅读 2,217评论 0 43
  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    袁俊亮技术博客阅读 3,762评论 0 73
  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 2,003评论 1 18
  • 暖啊暖阅读 25评论 0 0