jQuery的前世今生

在WEB开发圈内,提起大名鼎鼎的jQuery,几乎无人不知,无人不晓。jQuery诞生于2006年1月,至今已经有16年头多了,其作者是美国大神John Resig,他当时发明jQuery的时候只有22岁。

image.png

那么,jQuery为什么会这么流行呢?这完全要归功于当年浏览器的混战。从1990年第一款浏览器WorldWideWeb的诞生,1994年网景公司的Netscape Navigator成就霸主,到2001年微软IE6的一统天下,再到最近几年chrome的迅速崛起等等,20多年的时间里,各个浏览器彼此混战不休。我们知道,JavaScript是运行在浏览器里的语言,但是各个浏览器对JavaScript的支持程度都是不一样的,甚至有的浏览器还自创语法,比如IE的ActiveXObject。所以这就苦了广大开发者,因为写一套代码,还要去适配各个厂家浏览器的独有语法,非常痛苦,于是在这种环境下,jQuery诞生了,它帮你把这些痛苦的事情全都做了。

jQuery到底有多火呢?据统计,截止到17年目前全世界已有 57.4% 的网站在使用jQuery,也就是说,每10个网站里面,有6个使用它。当下的百度首页、天猫首页、京东首页、腾讯首页、还有其它各路娄娄等首页统统使用了jQuery。好多前端小白,学JS从也是从jQuery学起的。

在技术日新月异的编程界,十年已经是很长的时间了。在这十年里,jQuery从最初的1.0版本已经发展到了现在的3.1.1版本,从2.0版本以后就不再兼容IE8浏览器了。那么在一年一个样的前端界,jQuery是否会过时呢?去年笔者在写jQuery语法的时候就曾经被某大神鄙视,大神翻着白眼道:什么年代了,还在用jQuery,LOW不LOW?

确实,2016年前端界发生了翻天覆地的变化,尤其是React,ES6等技术的流行,jQuery常用功能都有了原生的解决方案,如数据绑定代替了DOM操作,fetch代替了XMLHttpRequest等等,尤其是移动端,jQuery的用武之地越来越少。

或许在一些大型系统里,jQuery的作用已经在逐渐淡化。但在相当长的一段时间里,jQuery依然是无法代替的,毕竟,不是每个项目都有必要引入一大堆重量级框架的。

最后推荐两本书。
image.pngimage.png
https://item.jd.com/11019625.html

jQuery 概述

  • 它是一个轻量级JavaScript库
  • 兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera
  • 9.0+),也支持CSS 1,2,3选择器
  • 能将JavaScript代码和HTML代码完全分离,便于代码维护 和修改
  • 使用户能更方便地处理HTML文档、事件、实现动画效果, 并且方便地为网站提供Ajax交互
  • 容易扩展,插件丰富
  • ……

你将学到:

  • 核心函数
  • 选择网页元素
  • 改变结果集
  • 链式操作
  • 元素的操作:取值和赋值
  • 元素的操作:移动
  • 元素的操作:复制、删除和创建
  • 工具方法
  • 事件操作
  • 特殊效果
  • Ajax

从一个简单的功能开始

例子:为页面的某一区域中的每个链接添加一个单击(click)事件:

  1. window.onload =function(){
  2. var external_links = document.getElementById('external_links');
  3. var links = external_links.getElementsByTagName('a');
  4. for (var i=0;i < links.length;i++) {
  5. var link = links.item(i);
  6. link.onclick = function() {
  7. return confirm('You are going to visit: ' + this.href);
  8. };
  9. }
  10. }

使用 jQuery 实现:

  1. $(document).ready(function(){
  2. $('#external_links a').click(function() {
  3. return confirm('You are going to visit: ' + this.href);
  4. });
  5. });

jQuery核心函数

  • jQuery()简写为$(),通常 使用它从文档中选择元素。
  • $(document).ready(): 允许你绑定一个在DOM文档 载入完成后执行的函数。

    1. $(document).ready(function(){
    2. // 文档就绪
    3. })
    4. //简写为:
    5. $(function(){
    6. // 文档就绪
    7. });

    image.png

    jQuery选择网页元素

  • jQuery的基本设计:“选择某个网页元素,然后对其进行某种操作”

  • 选择表达式可以是CSS选择器:

    1. $(document) //选择整个文档对象
    2. $('#myId') //选择ID为myId的网页元素
    3. $('div.myClass') //选择class为myClass的div元素
    4. $('input[name=first]') //选择name属性等亍first的input元素
  • 也可以是jQuery特有的表达式:

    1. $('a:first') //选择网页中第一个a元素
    2. $('tr:odd') //选择表格的奇数行
    3. $('#myForm :input') //选择表单中的input元素 $('div:visible') //选择可见的div元素
    4. $('div:gt(2)') //选择所有的div元素,除了前三个 $('div:animated') //选择当前处亍动画状态的div元素

jQuery改变结果集

  • 如果选中多个元素,jQuery提供过滤器,可以缩小结果集:

    1. $('div').has('p'); //选择包含p元素的div元素
    2. $('div').not('.myClass'); //选择class丌等亍myClass的div元素
    3. $('div').filter('.myClass'); //选择class等亍myClass的div元素
    4. $('div').first(); //选择第1个div元素
    5. $('div').eq(5); //选择第6个div元素
  • 从结果集出发,移动到附近的相关元素的方法:

    1. $('div').next('p'); //选择div元素后面的第一个p元素
    2. $('div').parent(); //选择div元素的父元素
    3. $('div').closest('form'); //选择离div最近的那个form父元素
    4. $('div').children(); //选择div的所有子元素
    5. $('div').siblings(); //选择div的同级元素

jQuery链式操作

  • jQuery允许将所有操作连接在一起,以链条的形式写出来

    1. $('div').find('h3').eq(2).html('Hello');

    分解开来,就是下面返样:

    1. $('div') //找到div元素
    2. .find('h3') //选择其中的h3元素
    3. .eq(2) //选择第3个h3元素 .html('Hello'); //将它的内容改为Hello
  • jQuery还提供了.end()方法,使得结果集可以后退一步:

    1. $('div') //找到div元素
    2. .find('h3') //选择其中的h3元素
    3. .eq(2) //选择第3个h3元素
    4. .end() //退回到选中所有的h3元素的那一步 .html('Hello'); //将它的内容改为Hello

    jQuery取值和赋值

  • jQuery使用同一个函数,来完成取值(getter)和赋值(setter)。到底 是取值还是赋值,由函数的参数决定。

    1. $('h1').html(); //html()没有参数,表示取出h1的值
    2. $('h1').html('Hello'); //html()有参数Hello,表示对h1进行赋值
  • 常见的取值和赋值函数如下:

    1. .html() //取出或设置html内容
    2. .text() //取出或设置text内容
    3. .attr() //取出或设置某个属性的值
    4. .width() //取出或设置某个元素的宽度
    5. .height() //取出或设置某个元素的高度
    6. .val() //取出某个表单元素的值

    jQuery移动元素

  • 如果要移动选中的元素,有两种方法:

  • 一种是直接移动该元素,另一种是移动其他元素,使得目标元素达到我们想要的位置。
  • 假定我们选中了一个div元素,需要把它移动到p元素后面。

第一种方法是使用.insertAfter(),把div元素移动p元素后面:

  1. $('div').insertAfter('p');

第二种方法是使用.after(),把p元素加到div元素前面:

  1. $('p').after('div');

注:表面上看,返两种方法的效果是 一样的,唯一的不同似乎只是操作视角的不同。但是实际上,它们有一个 重大差别,那就是返回的元素不一样 。 第一种方法返回div元素,第二种方法返回p元素。你可以根据需要, 选择到底使用哪一种方法。

其他的移动函数如下:

  1. .insertAfter()和.after(): // 在现存元素的外部,从后面插入元素
  2. .insertBefore()和.before(): // 在现存元素的外部,从前面插入元素
  3. .appendTo()和.append(): // 在现存元素的内部,从后面追加元素
  4. .prependTo()和.prepend(): // 在现存元素的内部,从前面追加元素

jQuery复制,删除,创建元素

• 复制元素使用.clone()
• 删除元素使用.remove()和.detach():

两者的区别在于,前者不保留被删除元素的事件,后者保留,有利于重新 插入文档时使用

• 清空元素内容(但是不删除该元素)使用.empty()。
• 创建新元素的方法非常简单,只要把新元素直接传入jQuery的构造该函数就行了:

  1. $('<p>Hello</p>');
  2. $('<li class="new">new list item</li>');
  3. $('ul').append('<li>list item</li>');

jQuery事件操作(1)

  • jQuery可以对网页元素绑定事件。根据不同的事件,运行相应的函数: ```javascript $(‘p’).click(function(){ alert(‘Hello’); });

$(‘p’).bind(‘click’,function(){ alert(‘Hello’); });

  1. - jQuery支持的事件:
  2. ```javascript
  3. .blur() // 表单元素失去焦点。
  4. .change() // 表单元素的值发生变化
  5. .click() // 鼠标单击
  6. .dblclick() // 鼠标双击
  7. .focus() // 表单元素获得焦点 等等......

还可以使用.bind()来绑定事件,比如为多个事件绑定同一个函数:

  1. $(‘input’).bind(‘click change’, //同时绑定click和change事件
  2. function(){
  3. alert('Hello'); }
  4. );

jQuery事件操作(2)

  • 有时,你只想让事件运行一次,这时可以使用.one()方法:

    1. $("p").one("click" function(){
    2. alert("Hello"); //只运行一次,以后的点击不会运行
    3. });
  • 解除事件绑定可以用.unbind() 方法:

    1. $('p').unbind('click');
  • 所有的事件处理函数,都可以接受一个事件对象(event object)作为参数,比如:

    1. $("p").click(function(event){
    2. alert(event.type); //"click"
    3. });

    注:这个事件对象有一些很有用的属性和方法:

    1. event.pageX //事件发生时,鼠标距离网页左上角的水平距离
    2. event.pageY //事件发生时,鼠标距离网页左上角的垂直距离
    3. event.type // 事件的类型(比如click)
    4. event.which //按下了哪一个键
    5. event.data //在事件对象上绑定数据,然后传入事件处理函数
    6. event.target // 事件针对的网页元素
    7. event.preventDefault() //阻止事件的默认行为(比如点击链接,会自动打开新页面)
    8. event.stopPropagation() //停止事件向上层元素冒泡

    jQuery事件操作(3)

  • 在事件处理函数中,可以用this关键字,返回事件针对的DOM元素:

    1. $('a').click(function(){
    2. if ($(this).attr('href').match('evil')){ //如果确认为有害链接
    3. e .preventDefault(); //阻止打开
    4. $(this).addClass('evil'); //加上表示有害的class
    5. }
    6. });
  • 自动触发一个事件。一种是直接使用事件函数,另一种是使用.trigger() 或.triggerHandler()。

    1. $('a').click();
    2. $('a').trigger('click');

    jQuery特殊效果

  • 常用的特殊效果如下

    1. .fadeIn() // 淡入
    2. .fadeOut() // 淡出
    3. .fadeTo() // 调整透明度
    4. .hide() // 隐藏元素
    5. .show() // 显示元素
    6. .slideDown() // 向下展开
    7. .slideUp() // 向上卷起
    8. .slideToggle() // 依次展开或卷起某个元素
    9. .toggle() // 依次展示或隐藏某个元素

    • 设置执行时间:

    1. $('h1').fadeIn(300); // 300毫秒内淡入
    2. $('h1').fadeOut('slow'); //缓慢地淡出
  • 在特效结束后,可以指定执行某个函数:

    1. $('p').fadeOut(300, function(){
    2. $(this).remove();
    3. });
  • 更复杂的特效,可以用.animate()自定义: ```javascript $(‘div’).animate({ left : “+=50”,//不断右移 opacity : 0.25 //指定透明度 }, 300, // 持续时间 function(){ alert(‘done!’); }//回调函数 );

  1. - .stop()和.delay()用来停止或延缓特效的执行。
  2. - $.fx.off如果设置为true,则关闭所有网页特效。
  3. <a name="K4sCK"></a>
  4. ### jQuery Ajax
  5. - 把一块 HTML 代码加载到页面的某个区域中去:
  6. ```javascript
  7. $('#stats').load('stats.html');
  • 通过GET或POST方式加载数据

    1. $.post('save.do',
    2. { text: 'my string', number: 23
    3. }, function() {
    4. alert('Your data has been saved.');
    5. });
  • 更复杂的Ajax:

    1. $.ajax({
    2. url: 'document.xml',
    3. type: 'GET',
    4. dataType: 'xml',
    5. timeout: 1000,
    6. error: function(){
    7. alert('Error loading XML document');
    8. },
    9. success: function(xml){
    10. $(xml).find('item').each(function(){
    11. var item_text = $(this).text();
    12. $('<li></li>').html(item_text).appendTo('ol');
    13. });
    14. }

    jQuery工具方法

  • 除了对选中的元素进行操作以外,jQuery还提供一些工具方法,不必选中元素,就可以直接使用。

它是定义在jQuery构造函数上的方法,即jQuery.method(),所以可以直接使用。 而那些操作元素的方法,是定义在构造函数的prototype对象上的方法,即 jQuery.prototype.method(),所以必须生成实例(即选中元素)后使用。

  • 常用的工具方法有以下几种: ```javascript $.trim() // 去除字符串两端的空格。 $.each() // 遍历一个数组还对象。 $.inArray() // 返回一个值在数组中的索引位置。如果该值不在数组中,则返回-1。 $.grep() // 返回数组中符合某种标准的元素。 $.extend() // 将多个对象,合并到第一个对象。 $.makeArray() // 将对象转化为数组。 $.type() // 判断对象的类别(函数对象、日期对象、数组对象、正则对象等等)。 $.isArray() // 判断某个参数是否为数组。 $.isEmptyObject() // 判断某个对象是否为空(不含有任何属性)。 $.isFunction() //判断某个参数是否为函数。 $.isPlainObject() // 判断某个参数是否为用”{}”还”new Object”建立的对象。 $.support() //判断浏览器是否支持某个特性。

```

jQuery常用地址