美文网首页我爱编程
jquery深造二....

jquery深造二....

作者: love2013 | 来源:发表于2016-10-16 23:22 被阅读78次

    一.什么是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');//同级所有上面的元素

    相关文章

      网友评论

        本文标题:jquery深造二....

        本文链接:https://www.haomeiwen.com/subject/kyqayttx.html