jQuery的前世今生
在WEB开发圈内,提起大名鼎鼎的jQuery,几乎无人不知,无人不晓。jQuery诞生于2006年1月,至今已经有16年头多了,其作者是美国大神John Resig,他当时发明jQuery的时候只有22岁。
那么,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依然是无法代替的,毕竟,不是每个项目都有必要引入一大堆重量级框架的。
最后推荐两本书。
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)事件:
window.onload =function(){
var external_links = document.getElementById('external_links');
var links = external_links.getElementsByTagName('a');
for (var i=0;i < links.length;i++) {
var link = links.item(i);
link.onclick = function() {
return confirm('You are going to visit: ' + this.href);
};
}
}
使用 jQuery 实现:
$(document).ready(function(){
$('#external_links a').click(function() {
return confirm('You are going to visit: ' + this.href);
});
});
jQuery核心函数
- jQuery()简写为$(),通常 使用它从文档中选择元素。
$(document).ready(): 允许你绑定一个在DOM文档 载入完成后执行的函数。
$(document).ready(function(){
// 文档就绪
})
//简写为:
$(function(){
// 文档就绪
});
jQuery选择网页元素
jQuery的基本设计:“选择某个网页元素,然后对其进行某种操作”
选择表达式可以是CSS选择器:
$(document) //选择整个文档对象
$('#myId') //选择ID为myId的网页元素
$('div.myClass') //选择class为myClass的div元素
$('input[name=first]') //选择name属性等亍first的input元素
也可以是jQuery特有的表达式:
$('a:first') //选择网页中第一个a元素
$('tr:odd') //选择表格的奇数行
$('#myForm :input') //选择表单中的input元素 $('div:visible') //选择可见的div元素
$('div:gt(2)') //选择所有的div元素,除了前三个 $('div:animated') //选择当前处亍动画状态的div元素
jQuery改变结果集
如果选中多个元素,jQuery提供过滤器,可以缩小结果集:
$('div').has('p'); //选择包含p元素的div元素
$('div').not('.myClass'); //选择class丌等亍myClass的div元素
$('div').filter('.myClass'); //选择class等亍myClass的div元素
$('div').first(); //选择第1个div元素
$('div').eq(5); //选择第6个div元素
从结果集出发,移动到附近的相关元素的方法:
$('div').next('p'); //选择div元素后面的第一个p元素
$('div').parent(); //选择div元素的父元素
$('div').closest('form'); //选择离div最近的那个form父元素
$('div').children(); //选择div的所有子元素
$('div').siblings(); //选择div的同级元素
jQuery链式操作
jQuery允许将所有操作连接在一起,以链条的形式写出来
$('div').find('h3').eq(2).html('Hello');
分解开来,就是下面返样:
$('div') //找到div元素
.find('h3') //选择其中的h3元素
.eq(2) //选择第3个h3元素 .html('Hello'); //将它的内容改为Hello
jQuery还提供了.end()方法,使得结果集可以后退一步:
$('div') //找到div元素
.find('h3') //选择其中的h3元素
.eq(2) //选择第3个h3元素
.end() //退回到选中所有的h3元素的那一步 .html('Hello'); //将它的内容改为Hello
jQuery取值和赋值
jQuery使用同一个函数,来完成取值(getter)和赋值(setter)。到底 是取值还是赋值,由函数的参数决定。
$('h1').html(); //html()没有参数,表示取出h1的值
$('h1').html('Hello'); //html()有参数Hello,表示对h1进行赋值
常见的取值和赋值函数如下:
.html() //取出或设置html内容
.text() //取出或设置text内容
.attr() //取出或设置某个属性的值
.width() //取出或设置某个元素的宽度
.height() //取出或设置某个元素的高度
.val() //取出某个表单元素的值
jQuery移动元素
如果要移动选中的元素,有两种方法:
- 一种是直接移动该元素,另一种是移动其他元素,使得目标元素达到我们想要的位置。
- 假定我们选中了一个div元素,需要把它移动到p元素后面。
第一种方法是使用.insertAfter(),把div元素移动p元素后面:
$('div').insertAfter('p');
第二种方法是使用.after(),把p元素加到div元素前面:
$('p').after('div');
注:表面上看,返两种方法的效果是 一样的,唯一的不同似乎只是操作视角的不同。但是实际上,它们有一个 重大差别,那就是返回的元素不一样 。 第一种方法返回div元素,第二种方法返回p元素。你可以根据需要, 选择到底使用哪一种方法。
其他的移动函数如下:
.insertAfter()和.after(): // 在现存元素的外部,从后面插入元素
.insertBefore()和.before(): // 在现存元素的外部,从前面插入元素
.appendTo()和.append(): // 在现存元素的内部,从后面追加元素
.prependTo()和.prepend(): // 在现存元素的内部,从前面追加元素
jQuery复制,删除,创建元素
• 复制元素使用.clone()
• 删除元素使用.remove()和.detach():
两者的区别在于,前者不保留被删除元素的事件,后者保留,有利于重新 插入文档时使用
• 清空元素内容(但是不删除该元素)使用.empty()。
• 创建新元素的方法非常简单,只要把新元素直接传入jQuery的构造该函数就行了:
$('<p>Hello</p>');
$('<li class="new">new list item</li>');
$('ul').append('<li>list item</li>');
jQuery事件操作(1)
- jQuery可以对网页元素绑定事件。根据不同的事件,运行相应的函数: ```javascript $(‘p’).click(function(){ alert(‘Hello’); });
$(‘p’).bind(‘click’,function(){ alert(‘Hello’); });
- jQuery支持的事件:
```javascript
.blur() // 表单元素失去焦点。
.change() // 表单元素的值发生变化
.click() // 鼠标单击
.dblclick() // 鼠标双击
.focus() // 表单元素获得焦点 等等......
还可以使用.bind()来绑定事件,比如为多个事件绑定同一个函数:
$(‘input’).bind(‘click change’, //同时绑定click和change事件
function(){
alert('Hello'); }
);
jQuery事件操作(2)
有时,你只想让事件运行一次,这时可以使用.one()方法:
$("p").one("click", function(){
alert("Hello"); //只运行一次,以后的点击不会运行
});
解除事件绑定可以用.unbind() 方法:
$('p').unbind('click');
所有的事件处理函数,都可以接受一个事件对象(event object)作为参数,比如:
$("p").click(function(event){
alert(event.type); //"click"
});
注:这个事件对象有一些很有用的属性和方法:
event.pageX //事件发生时,鼠标距离网页左上角的水平距离
event.pageY //事件发生时,鼠标距离网页左上角的垂直距离
event.type // 事件的类型(比如click)
event.which //按下了哪一个键
event.data //在事件对象上绑定数据,然后传入事件处理函数
event.target // 事件针对的网页元素
event.preventDefault() //阻止事件的默认行为(比如点击链接,会自动打开新页面)
event.stopPropagation() //停止事件向上层元素冒泡
jQuery事件操作(3)
在事件处理函数中,可以用this关键字,返回事件针对的DOM元素:
$('a').click(function(){
if ($(this).attr('href').match('evil')){ //如果确认为有害链接
e .preventDefault(); //阻止打开
$(this).addClass('evil'); //加上表示有害的class
}
});
自动触发一个事件。一种是直接使用事件函数,另一种是使用.trigger() 或.triggerHandler()。
$('a').click();
$('a').trigger('click');
jQuery特殊效果
常用的特殊效果如下
.fadeIn() // 淡入
.fadeOut() // 淡出
.fadeTo() // 调整透明度
.hide() // 隐藏元素
.show() // 显示元素
.slideDown() // 向下展开
.slideUp() // 向上卷起
.slideToggle() // 依次展开或卷起某个元素
.toggle() // 依次展示或隐藏某个元素
• 设置执行时间:
$('h1').fadeIn(300); // 300毫秒内淡入
$('h1').fadeOut('slow'); //缓慢地淡出
在特效结束后,可以指定执行某个函数:
$('p').fadeOut(300, function(){
$(this).remove();
});
更复杂的特效,可以用.animate()自定义: ```javascript $(‘div’).animate({ left : “+=50”,//不断右移 opacity : 0.25 //指定透明度 }, 300, // 持续时间 function(){ alert(‘done!’); }//回调函数 );
- .stop()和.delay()用来停止或延缓特效的执行。
- $.fx.off如果设置为true,则关闭所有网页特效。
<a name="K4sCK"></a>
### jQuery Ajax
- 把一块 HTML 代码加载到页面的某个区域中去:
```javascript
$('#stats').load('stats.html');
通过GET或POST方式加载数据
$.post('save.do',
{ text: 'my string', number: 23
}, function() {
alert('Your data has been saved.');
});
更复杂的Ajax:
$.ajax({
url: 'document.xml',
type: 'GET',
dataType: 'xml',
timeout: 1000,
error: function(){
alert('Error loading XML document');
},
success: function(xml){
$(xml).find('item').each(function(){
var item_text = $(this).text();
$('<li></li>').html(item_text).appendTo('ol');
});
}
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常用地址
- jQuery官方网站 http://jquery.com
- jQuery中文API https://jquery.cuishifeng.cn/
- jQuery 插件库: https://www.jq22.com/