JS库--jQuery

354 阅读5分钟

About jQuery

jQuery是目前使用最广泛的javascript函数库, 根据builtwith的统计,全球top10000的网站,有9000个以上的网站都使用了这个函数库。而且至今jQuery已经在前端行业活跃了13年之久,这在瞬息万变的前端世界来说已经是传奇级别。

jQuery的流行是因为它能够极大地节省代码量,而且便于使用,兼容性强,在兼容浏览器方面给开发者提供极大的便捷。不过由于jQuery的根本还是在操作DOM,在如今最求性能的前端世界中已经显得比较落后了,而框架的出现也逐步代替了jQuery的位置。但是jQuery代码的设计仍是一门艺术,值得任何使用JS的人去学习。

jQuery的思想

jQuery的核心思想就是:选择网页中的某个元素集合,并通过提供的api对其进行操作。不像使用原生DOM,用户不能直接修改jQuery获取的元素,而必须通过调用的jQuery提供的api来操作元素。同时在实现这个库的代码中,jQuery还使用诸如:重载、适配器、getter/setter等设计模式,让这些api的使用更加的灵活。

jQuery最核心的API当属 jQuery() ,这个API就使用了重载的设计模式,虽然都是获取元素的集合,但是传入的元素的形式却可以是多种。它可以返回匹配的元素集合,无论是通过在DOM的基础上传递的参数还是创建一个HTML字符串。是jQuery最重要的起手式。

jQuery另一个核心的思想就是它的链式编程。jQuery在设计的时候jQuery对象中的每个api都返回了一个jQuery对象,所以无论元素集合是否因为操作改变,jQuery都有一个能一直调用的jQuery对象。而且jQuery还很人性地提供了一个 end()api返回上一个元素集合。

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

jQuery的选择器

jQuery的选择器就使用了重载的设计模式,根据我们传入的不同的参数,jQuery能够选择获取到不同的元素。

  1. CSS选择器

    $(document) // 选择整个文档对象
    
    $('input[name=first]') // 选择name属性为first的input元素
    
  2. jQuery的特有的表达式

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

jQuery的过滤器

在我们使用选择器选取元素集合时大多情况下只能选取一个大概的范围,除非有该元素有独特的class 或 id,但是为了选择一个元素而在它身上“动刀子”就显得太复杂了。

jQuery在选择器的基础上还提供了许多过滤器api用于精确选择元素。

$('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很巧妙的将这两种需求合并到了同一个api中。这些api可以根据开发者传递的参数来判断其意图。

当只有一个参数时,这些api就认为开发者需要设置值(set);当没有参数时,这些api就认为开发者需要获取值(get)。这就是我们常说的:getter/setter 设计模式。

常用的取值与赋值函数如下:

.html() // 取出或设置html内容

.text() // 取出或设置text内容

.attr() // 取出或设置某个属性的值

.width() // 取出或设置某个元素的宽度

.height() // 取出或设置某个元素的高度

.val() // 取出某个表单元素的值

jQuery元素的“把被”操作

在操作元素的位置的时候,相同的插入位置jQuery会提供2个api,唯一的不同点就是调用他们的‘主角’不同。这样我们就能够根据主角来使用api,同时也避免了因为单一的api影响到元素集。

使用这种操作模式的方法一共有4对:

.insertAfter()和.after():在现存元素的外部,从后面插入元素

.insertBefore()和.before():在现存元素的外部,从前面插入元素

.appendTo()和.append():在现存元素的内部,从后面插入元素

.prependTo()和.prepend():在现存元素的内部,从前面插入元素

jQuery中元素的创建、复制与删除

  • 元素的创建:

    jQuery元素的创建非常简单,只要把新元素直接传入jQuery的构造函数就行了。

    $('<p>Hello</p>');
    
    $('<li class="new">new list item</li>');
    
    $('ul').append('<li>list item</li>');
    
  • 元素的赋值:

    直接使用 clone()方法即可

  • 元素的删除:

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

jQuery的工具方法

除了操作元素,jQuery也提供了一些与元素无关的方法。这些函数是在jQuery构造函数上的,所以我们直接通过jQuery.method() 就能调用这些方法。

常用的工具方法:

&emsp;&emsp;$.trim() 去除字符串两端的空格。

&emsp;&emsp;$.each() 遍历一个数组或对象。

&emsp;&emsp;$.inArray() 返回一个值在数组中的索引位置。如果该值不在数组中,则返回-1。

&emsp;&emsp;$.grep() 返回数组中符合某种标准的元素。

&emsp;&emsp;$.extend() 将多个对象,合并到第一个对象。

&emsp;&emsp;$.makeArray() 将对象转化为数组。

&emsp;&emsp;$.type() 判断对象的类别(函数对象、日期对象、数组对象、正则对象等等)。

&emsp;&emsp;$.isArray() 判断某个参数是否为数组。

&emsp;&emsp;$.isEmptyObject() 判断某个对象是否为空(不含有任何属性)。

&emsp;&emsp;$.isFunction() 判断某个参数是否为函数。

&emsp;&emsp;$.isPlainObject() 判断某个参数是否为用"{}""new Object"建立的对象。

&emsp;&emsp;$.support() 判断浏览器是否支持某个特性。

jQuery的事件处理

以往jQuery是使用 .bind()给元素绑定事件,而在3.0版本以后,使用.on()来给元素绑定事件;使用.off()来取消绑定的事件;使用.one()来绑定只能触发一次的事件。

除了使用.on()来绑定事件,也可以直接使用.click() .mousedown()等api绑定事件。

当我们需要通过JS来触发事件时,有两种方式:

$('a').click(); // 直接使用事件函数

$('a').trigger('click'); // trigger()或triggerHandler()

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

&emsp;&emsp;$('a').click(function(e) {
	// this就是触发click事件的Dom元素
&emsp;&emsp;&emsp;&emsp;if ($(this).attr('href').match('evil')) { //如果确认为有害链接

&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;e.preventDefault(); //阻止打开

&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;$(this).addClass('evil'); //加上表示有害的class

&emsp;&emsp;&emsp;&emsp;}

&emsp;&emsp;});

常用的事件

.blur() 表单元素失去焦点。

.change() 表单元素的值发生变化

.click() 鼠标单击

.dblclick() 鼠标双击

.focus() 表单元素获得焦点

.focusin() 子元素获得焦点

.focusout() 子元素失去焦点

.hover() 同时为mouseenter和mouseleave事件指定处理函数

.keydown() 按下键盘(长时间按键,只返回一个事件)

.keypress() 按下键盘(长时间按键,将返回多个事件)

.keyup() 松开键盘

.load() 元素加载完毕

.mousedown() 按下鼠标

.mouseenter() 鼠标进入(进入子元素不触发)

.mouseleave() 鼠标离开(离开子元素不触发)

.mousemove() 鼠标在元素内部移动

.mouseout() 鼠标离开(离开子元素也触发)

.mouseover() 鼠标进入(进入子元素也触发)

.mouseup() 松开鼠标

.ready() DOM加载完成

.resize() 浏览器窗口的大小发生改变

.scroll() 滚动条的位置发生变化

.select() 用户选中文本框中的内容

.submit() 用户递交表单

.toggle() 根据鼠标点击的次数,依次运行多个函数

.unload() 用户离开页面

常用的事件对象

event.pageX 事件发生时,鼠标距离网页左上角的水平距离

event.pageY 事件发生时,鼠标距离网页左上角的垂直距离

event.type 事件的类型(比如click)

event.which 按下了哪一个键

event.data 在事件对象上绑定数据,然后传入事件处理函数

event.target 事件针对的网页元素

event.preventDefault() 阻止事件的默认行为(比如点击链接,会自动打开新页面)

event.stopPropagation() 停止事件向上层元素冒泡