前端架构师之01_JQuery

1 jQuery快速入门

1.1 什么是jQuery

它是一个开源的JavaScript类库 。

常见的JavaScript类库:jQuery、Prototype、ExtJS、Mootools和YUI等。

jQuery的核心理念:write less,do more(写的更少,做的更多)。

jQuery的特点:

  • jQuery是一个轻量级的脚本,其代码非常小巧。
  • 语法简洁易懂,学习速度快,文档丰富。
  • 支持CSS1~CSS3定义的属性和选择器。
  • 跨浏览器,支持的浏览器包括IE6~IE11和Chrome等。
  • 实现了JavaScript脚本和HTML代码的分离,便于后期编辑和维护。
  • 插件丰富,可以通过插件扩展更多功能。

1.2 下载jQuery

jQuery下载链接

  • jQuery 1.x系列:已经停止更新,保持了对早期浏览器的支持,最终版本是jQuery 1.12.4。
  • jQuery 2.x系列:已经停止更新,不再支持IE6~8浏览器,从而更加轻量级,最终版本是jQuery2.2.4 。
  • jQuery 3.x系列:只支持最新的浏览器,因此除非特殊要求,一般不会使用此版本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • minified 压缩后的生产版、
  • uncompressed 未压缩的开发版

打开链接 -> 右键,网页另存为(或者 Ctrl + S)-> 选择保存目录

1.3 使用jQuery

<!-- 方式1:引入本地下载的jQuery -->
<script src="jquery-1.12.4.min.js"></script>
<!-- 方式2:通过CDN(内容分发网络)引入jQuery -->
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  • 方式1引入了当前目录下的jquery-1.12.4.min.js文件。
  • 方式2则通过公共的CDN的优势加快了jQuery文件的加载速度。

在HTML页面中创建含有文本“测试”和属性(align=“center”)的<h2>元素。

// 原生JavaScript的实现方式
var h2 = document.createElement('h2'); 	// 创建h2元素节点
var text = document.createTextNode('测试'); // 创建文本节点
var attr = document.createAttribute('align');	// 创建属性节点
attr.value = 'center'; 			// 为属性节点赋值
h2.setAttributeNode(attr);  	// 为h2元素添加属性节点
h2.appendChild(text); 		// 为h2元素添加文本节点
// 将h2节点追加为body元素的子节点
document.querySelector('body').appendChild(h2);

// jQuery的实现方式
$('<h2 align="center">测试</h2>').appendTo('body');
  • 美元符号“$”表示jQuery类。
  • $()”等价于“jQuery()”,即jQuery的构造函数,为该构造函数传递一个元素,就可以创建出一个元素对象。

2 元素操作

2.1 jQuery对象

jQuery对象:是对DOM对象的一层包装。

作用:是通过自身提供的一系列快捷功能来简化DOM操作的复杂度,提高程序的开发效率。

解决的问题:不同浏览器的兼容问题。

// 创建一个jQuery对象,该对象包装了document对象
var $doc = $(document);
// 在控制台中输出jQuery对象
console.log($doc);       
  • $(document)表示将document对象转换为jQuery对象。
  • 通过console.log()可以查看其内部结构。
  • jQuery对象内部有3个元素。
  • 下标为0的元素表示其内部的DOM对象,即document对象。
  • length表示其内部DOM对象的个数,一个jQuery对象中可以包装多个DOM对象。
  • 通过 __proto__ 可以查看该对象的的原型(即jQuery本身)所具有的属性和方法。

2.2 jQuery选择器

jQuery选择器类似CSS选择器的机制的一种操作HTML元素的方式。

好处:可以轻松的获取DOM元素。

jQuery选择器的基本语法:$(选择器)。

根据选择器获取方式的不同大致可以将其分为以下几类。

  • 基本选择器
  • 层级选择器
  • 基本过滤选择器
  • 内容选择器
  • 可见性选择器
  • 属性选择器
  • 子元素选择器
  • 表单选择器
2.2.1 基本选择器

jQuery中基本的选择器,常用的分别为:标签选择器、类选择器和ID选择器。

选择器功能描述示例
element根据指定元素名匹配所有元素$("li")选取所有的<li>元素
.class根据指定类名匹配所有元素$(".bar")选取所有class为bar的元素
#id根据指定id匹配一个元素$("#btn")选取id为btn的元素
selector1,selector2,…同时获取多个元素$("li,p,div")同时获取所有<li>、<p>和<div>元素
2.2.2 层级选择器

层级选择器,通过一些指定符号,如空格、>、+和~完成多层级元素之间的获取。

选择器功能描述示例
selector selector1选取祖先元素下的所有后代元素$("div .test") 选取<div>下所有class名为test的元素(多级)
parent > child获取父元素下的所有子元素$(".box >.con") 选取class名为box下的所有class名为con的子元素(一级)
prev + next获取当前元素紧邻的一下同级元素$("div + .title")获取紧邻<div>的下一个class名为title的兄弟节点
prev~siblings获取当前元素后的所有同级元素$(".bar ~ li")获取class名为bar的元素后的所有同级元素节点<li>
2.2.3 基本过滤选择器

基本过滤选择器,表示对获取到的元素进行筛选,如偶数行中的元素等。

选择器功能描述示例
:first获取指定选择器中的第一个元素$("li :first")获取第1个<li>元素
:last获取指定选择器中的最后一个元素$("li :last")获取最后1个<li>元素
:even获取索引为偶数的指定选择器中的奇数行数据,索引默认从0开始$("li :even")获取所有li元素中,索引为偶数的奇数行数据,如索引为0,2,4的第1个、第3个和第5个<li>元素
:odd获取索引为奇数的指定选择器中的偶数行数据,索引默认从0开始$("li :odd")获取所有<li>元素中,索引为奇数的偶数行数据,如索引为1,3,5的第2个、第4个和第6个<li>元素
:eq(index)获取索引等于index的元素,默认从0开始$("li:eq(3)")获取索引为3的<li>元素
:gt(index)获取索引大于index的元素$("li:gt(3)")获取索引大于3的所有<li>元素
:lt(index)获取索引小于index的元素$("li:lt(3)")获取索引小于3的所有<li>元素
:not(seletor)获取除指定的选择器外的其他元素$("li:not(li:eq(3))")获取除索引为3外的所有<li>元素
:focus匹配当前获取焦点的元素$("input:focus")匹配当前获取焦点的<input>元素
:animated匹配所有正在执行动画效果的元素$("div:not(:animated)")匹配当前没有执行动画的<div>元素
:target选择由文档URI的格式化识别码表示的目标元素若URI为http://example.com/#foo,则$("div:target")将获取<div id="foo">元素
2.2.4 内容选择器

根据元素的内容完成指定元素的获取。例如,获取所有元素内容不为空的<li>等。

选择器功能描述示例
:contains(text)获取内容包含text文本的元素$("li:contains('js')")获取内容中含“js”的<li>元素
:empty获取内容为空的元素$("li:empty")获取内容为空的<li>元素
:has(selector)获取内容包含指定选择器的元素$("li:has('a')")获取内容中含<a>元素的所有<li>元素
:parent获取内容不为空的元素(特殊)$("li:parent")获取内容不为空的<li>元素
2.2.5 可见性选择器

为了方便开发,jQuery中还提供了可见或隐藏元素的获取。

选择器功能描述示例
:hidden获取所有隐藏元素$("li:hidden")获取所有隐藏的<li>元素
:visible获取所有可见元素$("li:visible")获取所有可见的<li>元素
  • 当指定元素的display设置为none时,可以通过“:hidden”获取隐藏的元素。
  • 当指定元素的display设置为block时,可以通过“:visible”获取可见的元素。
2.2.6 属性选择器

根据元素的属性获取指定元素的方式。如获取class值为current的<div>元素等。

选择器功能描述示例
[attr]获取具有指定属性的元素$("div[class]")获取含有class属性的所有<div>元素
[attr=value]获取属性值等于value的元素$("div[class=current]")获取class等于current的所有<div>元素
[attr!=value]获取属性值不等于value的元素$("div[class!=current]")获取class不等于current的所有<div>元素
[attr^=value]获取属性值以value开始的元素$("div[class^=box]")获取class属性值以box开始的所有<div>元素
[attr$=value]获取属性值以value结尾的元素$("div[class$=er]")获取class属性值以er结尾的所有<div>元素
[attr*=value]获取属性值包含value的元素$("div[class*='-']")获取class属性值中含有“-”符号的所有<div>元素
[attr~=value]获取元素的属性值包含一个value,以空格分隔$("div[class~='box']")获取class属性值等于“box”或通过空格分隔并含有box的<div>元素,如“t box”
[attr1][attr2]...[attrN]获取同时拥有多个属性的元素$("input[id][name$='usr']")获取同时含有id属性和属性值以usr结尾的name属性的<input>元素
2.2.7 子元素选择器
选择器功能描述
:nth-child(index/even/odd/公式)索引index默认从1开始,匹配指定index索引、偶数、奇数、或符合指定公式(如2n,n默认从0开始)的子元素
:first-child获取第一个子元素
:last-child获取最后一个子元素
:only-child如果当前元素是唯一的子元素,则匹配
:nth-last-child(index/even/odd/公式)选择所有它们父元素的第n个子元素。计数从最后一个元素开始到第一个
:nth-of-type(index/even/odd/公式))选择同属于一个父元素之下,并且标签名相同的子元素中的第n个子元素
:first-of-type选择所有相同的元素名称的第一个子元素
:last-of-type选择所有相同的元素名称的最后一个子元素
:only-of-type选择所有没有兄弟元素,且具有相同的元素名称的元素
:nth-last-of-type(index/even/odd/公式)选择所有它们的父级元素的第n个子元素,计数从最后一个元素到第一个

带有“of-type” 与未带有“of-type”项的选择器有一定的区别。

2.2.8 表单选择器
选择器功能描述
:input获取页面中的所有表单元素,包含<select>以及<textarea>元素
:text选取页面中的所有文本框
:password选取所有的密码框
:radio选取所有的单选按钮
:checkbox选取所有的复选框
:submit获取submit提交按钮
:reset获取reset重置按钮
:image获取type="image"的图像域
:button获取button按钮,包括<button></button>type="button"
:file获取type="file"的文件域
:hidden获取隐藏表单项
:enabled获取所有可用表单元素
:disabled获取所有不可用表单元素
:checked获取所有选中的表单元素,主要针对radio和checkbox
:selected获取所有选中的表单元素,主要针对select

选择器$("input")$(":input")虽然都可以获取表单项,但是它们表达的含义有一定的区别,前者仅能获取表单标签是<input>的控件,后者则可以同时获取页面中所有的表单控件,包括表单标签是<select>以及<textarea>的控件。

2.3 元素遍历

在操作HTML文档中的DOM元素时,经常需要进行元素遍历。

jQuery提供的方法:each()

<ul>
    <li>PHP</li><li>iOS</li>
    <li>Java</li><li>UI</li>
</ul>
<script src="jquery-1.12.4.min.js"></script>
<script>
    $('li').each(function(index, element) {
        console.log('第' + (index + 1) + '个:' + $(element).text());
    });
</script>

提示:在回调函数内部还可以直接使用$(this)来表示当前元素。

2.4 元素内容

元素内容的操作有两种:获取和设置。

语法说明
html()获取第一个匹配元素的HTML内容
html(content)设置第一个匹配元素的HTML内容
text()获取所有匹配元素包含的文本内容组合起来的文本
text(content)设置所有匹配元素的文本内容
val()获取表单元素的value值
val(value)设置表单元素的value值
<div class="desc">
    <font color="red"><b>Smiles to the rocky</b></font>
    <ul>
        <li>天生我材必有用,千金散尽还复来。</li>
        <li>行到水穷处,坐看云起时。</li>
    </ul>
</div>
<script src="jquery-1.12.4.min.js"></script>
<script>
    var desc = $('.desc');     // 获取class为desc的元素
    var html = desc.html();    // 获取desc的HTML内容(含有标签)
    var text = desc.text();    // 获取desc的文本内容
    console.log(html);
    console.log(text);
</script>

val()方法还可以操作表单(select、radio和checkbox)的选中情况,当要获取的元素是<select>元素时,返回结果是一个包含所选值的数组;当要为表单元素设置选中情况时,可以传递数组参数。

2.5 元素样式

元素样式操作是指获取或设置元素的style属性。

在jQuery中,可以很方便的设置元素的样式、位置、尺寸等属性。

例如,通过css()方法可以设置背景色。

语法说明
css(name)获取第一个匹配元素的样式
css(properties)将一个键值对形式的对象设置为所有匹配元素的样式
css(name, value)为所有匹配的元素设置样式
width()获取第一个匹配元素的当前宽度值(返回数值型结果)
width(value)为所有匹配的元素设置宽度样式(可以是字符串或数字)
height()获取第一个匹配元素的当前高度值(返回数值型结果)
height(value)为所有匹配的元素设置高度样式(可以是字符串或数字)
offset()获取元素的位置,返回的是一个对象,包含left和top属性
offset(properties)利用对象设置元素的位置,必须包含left和top属性

css()方法中传递的参数若是对象,则需要去掉CSS属性中的“-”,将第2个单词的首字母变为大写。

<div style="width:100px; height:100px; background-color: red"></div>
<script src="jquery-1.12.4.min.js"></script>
<script>
    var ele = $('div');
    var w = ele.css('width');
    var h = ele.css('height');
    ele.css({border: '2px solid black', backgroundColor: '#ccc'});
    console.log('div元素的宽:' + w + ',高:' + h);
</script>

2.6 元素筛选

jQuery提供的元素过滤和查找方法可提供元素个性化的处理,增强对文档的控制能力。

查找方法:

语法说明
find(expr)搜索所有与指定表达式匹配的元素
parents([expr])取得一个包含所有匹配元素的祖先元素的元素集合(不包含根元素)
parent([expr])取得一个包含所有匹配元素的唯一父元素的元素集合
siblings([expr])获取所有同级元素(不分上下)
next([expr])匹配紧邻的同级的下一个元素
prev([expr])匹配紧邻的同级的上一个元素

过滤方法:

语法说明
eq(index)获取第N个元素
filter(expr|obj|ele|fn)使用选择器、对象、元素或函数完成指定元素的筛选
hasClass(class)检查当前的元素是否含有某个特定的类,如果有,则返回true
is(expr)用一个表达式来检查当前选择的元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true
has(expr)保留包含特定后代的元素,去掉那些不含有指定后代的元素
<div>
    <ul><li>Spring</li><li>summer</li></ul>
    <ul><li>autumn</li><li>winter</li></ul>
</div>
<script src="jquery-1.12.4.min.js"></script>
<script>
    // 获取div下的所有ul
    $uls = $('div').find('ul');
    // 为下标为1的ul设置背景色
    $uls.eq(1).css('background-color', '#ccc');
</script>	

2.7 元素属性

基本属性的操作有三种:获取、设置和删除。

语法说明
attr(name)取得第一个匹配元素的属性值,否则返回undefined
attr(properties)将一个键值对形式的对象设置为所有匹配元素的属性
attr(name, value)为所有匹配的元素设置一个属性值
attr(name, function)将函数的返回值作为所有匹配的元素的name属性值
prop(name)取得第一个匹配元素的属性值,否则返回undefined
prop(properties)将一个键值对形式的对象设置为所有匹配元素的属性
prop(name, value)为所有匹配的元素设置一个属性值
prop(name, function)将函数的返回值作为所有匹配的元素的name属性值
removeAttr(name)从每一个匹配的元素中删除一个属性
  • attr()prop()方法只能获取第一个匹配元素的属性值。

  • 要获取所有匹配元素的属性值,则需要配合jQuery提供的each()方法进行元素遍历。

在获取或设置属性时,建议操作元素的状态,如checked、selected或disabled时使用prop()方法,其他的情况使用attr()方法。

虽然attr()方法可完成基本的属性操作,但是对于class属性的操作却不够灵活。

因此,为了方便操作,jQuery专门提供了针对class属性操作的方法。

语法作用说明
addClass(class)追加样式为每个匹配的元素追加指定的类名
removeClass(class)移除样式从所有匹配的元素中删除全部或者指定的类
toggleClass(class)切换样式判断指定类是否存在,存在则删除,不存在则添加
hasClass(class)判断样式判断元素是否具有class样式
  • addClass()removeClass()方法经常一起使用来切换元素的样式。
  • 若要为匹配到的元素添加和移除多个样式类名,则样式类名之间可使用空格进行分隔。

2.8 练习作业

  • 折叠菜单

    • 编写网页,设置CSS完成折叠菜单的结构和样式设置。
    • 通过层级选择器、基本过滤选择器以及查找的方法获取指定的元素对象。
    • 通过css()方法设置需要折叠以及需要展开的菜单的display值。

3 DOM节点操作

3.1 节点追加

节点追加指的是在现有的节点树中,进行父子或兄弟节点的追加。

语法作用说明
父子节点append(content)把content内容追加到匹配的元素内容尾部
父子节点prepend(content)把content内容追加到匹配的元素内容头部
父子节点appendTo(content)把匹配到的内容插入到content内容的尾部
父子节点prependTo(content)把匹配到的内容插入到content内容的头部
兄弟节点after(content)把content内容插入到元素的尾部
兄弟节点before(content)把content内容插入到元素的头部
兄弟节点insertAfter(content)把所有匹配的内容插入到content元素的尾部
兄弟节点insertBefore(content)把所有匹配的内容插入到content元素的头部
  • 父子节点添加指的是在匹配到的元素内部添加指定的content内容。
  • 兄弟节点指的是在匹配到的元素外部添加指定的content内容。

3.2 节点替换

节点替换是指将选中的节点替换为指定的节点。

语法说明
replaceWith(content)将所有匹配的元素替换成指定的HTML或DOM元素
replaceAll(selector)用匹配的元素替换掉所有selector匹配到的元素

replaceWith()方法的参数是一个函数时,它的返回值类型必须是字符串类型,用于完成指定元素的替换操作。

3.3 节点删除

语法说明
empty()清空元素的内容,但不删除元素本身
remove([expr])清空元素的内容,并删除元素本身(可选参数expr用于筛选元素)
detach([expr])从DOM中删除所有匹配的元素(保留所有绑定的事件、附加的数据等)
  • empty()方法仅能删除匹配元素的文本内容,而元素节点依然存在。
  • remove()方法则可以同时删除匹配元素本身和文本内容。

3.4 节点复制

语法说明
clone([false])复制匹配的元素并且选中这些复制的副本,默认参数为false
clone(true)参数设置为true时,复制元素的所有事件处理

开发中若在复制元素节点时,想要同时复制该节点的所有事件的处理,则可以将clone()方法的操作设置为true,否则节点复制时使用默认操作false即可。

3.5 练习作业

  • 左移与右移

    • 编写网页,设置CSS完成左移右移的结构和样式设置。
    • 通过层级选择器和表单选择器获取选中的操作项。
    • 通过append()方法将匹配到的内容追加到指定元素的尾部。

4 事件操作

4.1 常用事件

标签中通过属性设置事件,每个属性都由一个on和事件名组成。例如,点击事件对应的属性为onclick。

在jQuery中则可直接使用其提供的与事件类型同名的方法。例如,点击事件对应的方法为click()

这些事件方法允许重复绑定处理程序,按照绑定顺序依次执行。

若省略参数,则表示触发事件。

分类方法说明
表单事件blur([[data],function])当元素失去焦点时触发
表单事件focus([[data],function])当元素获得焦点时触发
表单事件change([[data],function])当元素的值发生改变时触发
表单事件focusin([data],function)在父元素上检测子元素获取焦点的情况
表单事件focusout([data],function)在父元素上检测子元素失去焦点的情况
表单事件select([[data],function])当文本框(包括<input><textarea>)中的文本被选中时触发
表单事件submit([[data],function])当表单提交时触发
键盘事件keydown([[data],function])键盘按键被按下时触发
键盘事件keypress([[data],function])键盘按键(Shift等非字符键除外)被按下时触发
键盘事件keyup( [[data],function ])键盘按键被松开时触发
鼠标事件mouseover([[data],function])当鼠标移入对象时触发
鼠标事件mouseout([[data],function])在鼠标从元素上离开时触发
鼠标事件click([[data],function])当单击元素时触发
鼠标事件dblclick([[data],function])当双击元素时触发
鼠标事件mousedown([[data], function])当鼠标指针移动到元素上方,并按下鼠标按键时触发
鼠标事件mouseup([[data], function])当在元素上放松鼠标按钮时,会被触发
浏览器事件scroll([[data],function])当滚动条发生变化时触发
浏览器事件resize([[data], function])当调整浏览器窗口的大小时会被触发
  • 参数function表示触发事件时执行的处理程序(函数)。

  • 参数data用于为事件处理函数传递数据。(可在事件处理函数中使用“事件对象.data”获取)

$('input[type=text]').focus(function() { // 文本框获取焦点
    var tips = $('<span></span>');
    tips.html('请按要求输入');
    $('input:focus').after(tips);
});
$('input[type=text]').blur(function() {  // 文本框失去焦点
    $(this).next().remove();
});
// div块的移动
// 事件对象.which:获取当前按下键盘的对应码值keyCode
// 通过offset()获取当前按下键盘时div元素的位置(left和top值)
// 根据码值修改div元素位置( left和top值)
// 提示:37(左)、38(上)、39(右)、40(下)
$(document).keydown(function(event) {
    var opt = event.which;            // 获取当前按下键盘的对应码值keyCode
    var item = $('.boxes');           // 获取操作的元素
    var left = item.offset().left;    // 获取元素距离文档左侧的位置,单位像素
    var top = item.offset().top;      // 获取元素距离文档上面的位置,单位像素
    switch(opt) {
        case 37: item.offset({left: left - 1, top: top}); break;    // 左
        case 38: item.offset({left: left, top: top - 1}); break;    // 上
        case 39: item.offset({left: left + 1, top: top}); break;    // 右
        case 40: item.offset({left: left, top: top + 1}); break;    // 下
    }
});
// 鼠标移入
$('.hit').mouseover(function() {
    $(this).css('background-color', 'green');
});
// 鼠标移出
$('.hit').mouseout(function() {
    $(this).css('background-color', '');
});

4.2 页面加载事件

类比选项window.onload$(document).ready()
执行时机必须等待网页中的所有内容加载完成后(包括外部元素,如图片)才能执行网页中的所有DOM结构绘制完成后就执行(可能关联内容并未加载完成)
编写个数不能同时编写多个能够同时编写多个
简化写法$()

jQuery中的ready与JavaScript中的onload相比,不仅可以在页面加载后立即执行,还允许注册多个事件处理程序。

// jQuery中的页面加载事件方法有3种语法形式,具体如下。
$(document).ready(function() {  });  // 语法方式1
$().ready(function() {  });		     // 语法方式2
$(function() {  });			         // 语法方式3

4.3 事件绑定与切换

事件处理机制,即事件绑定和事件切换,统一了事件处理的各种方法。

语法说明
on(events,[selector],[data],function)在匹配元素上绑定一个或多个事件处理函数
off(events,[selector],[function])在匹配元素上移除一个或多个事件处理函数
one(events,[data],function)为每个匹配元素的事件绑定一次性的处理函数
trigger(type,[data])在每个匹配元素上触发某类事件
triggerHandler(type,[data])同trigger(),但浏览器默认动作将不会被触发
hover([over,]out)元素鼠标移入与移出事件切换
  • 参数events表示事件名(多个用空格分隔)。
  • 参数selector表示选择器。
  • 参数data表示将要传递给事件处理函数function的数据。
  • 参数type表示为元素添加的事件类型(多个用空格分隔)。
  • 参数over和out分别表示鼠标移入移出时的事件处理函数。
// 事件的绑定
$('div').on('click', function() {
    console.log('已完成单点击');
});
// 事件的取消
$('div').off('click');
// 绑定单次事件
$('div').one('click', function() {
    console.log('已完成1次单点击');
});
// 多个事件绑定同一个函数
$('div').on('mouseover mouseout', function() {
    console.log('鼠标移入或移出');
});
// 多个事件绑定不同的函数
$('div').on({
    mouseover: function() {
        console.log('鼠标移入');
    },
    mouseout: function() {
        console.log('鼠标移出');
    }
});
// 为以后创建的元素委派事件
$('body').on('click', 'div', function() {
    console.log('收到');
});
//测试:创建<div>元素
$('body').append('<div>测试</div>');
// 鼠标移入移出事件切换
$('div').hover(function() {
    console.log('鼠标移入')
}, function() {
    console.log('鼠标移出');
});

on()方法与off()方法是jQuery从1.7版本开始新增的方法。jQuery官方推荐使用on()方法进行事件绑定,在新版本中已经取代了bind()delegate()live()方法。

4.4 练习作业

  • 手风琴效果
    • 编写网页,设置CSS完成手风琴的结构和样式设置。
    • 为所有图片添加鼠标移入与移出事件。
    • 鼠标移入时,将当前元素的width设为图片的原宽,其他图片的width= (<div>的宽度 - 图片的原宽) / 剩余图片元素个数
    • 鼠标移出时,所有图片的width=<div>的宽度 / 所有图片的个数

5 动画特效

5.1 常用动画

分类方法说明
基本特效show([speed,[easing],[fn]])显示隐藏的匹配元素
基本特效hide([speed,[easing],[fn]])隐藏显示的匹配元素
基本特效toggle([speed],[easing],[ fn])元素显示与隐藏切换
滑动特效slideDown([speed],[easing],[ fn])垂直滑动显示匹配元素(向下增大)
滑动特效slideUp([speed,[easing],[ fn]])垂直滑动显示匹配元素(向上减小)
滑动特效slideToggle([speed],[easing],[ fn])在slideUp()和slideDown()两种效果间的切换
淡入淡出fadeIn([speed],[easing],[ fn])淡入显示匹配元素
淡入淡出fadeOut([speed],[easing],[ fn])淡出隐藏匹配元素
淡入淡出fadeTo([[speed],opacity,[easing],[ fn]])以淡入淡出方式将匹配元素调整到指定的透明度
淡入淡出fadeToggle([speed,[easing],[ fn]])在fadeIn()和fadeOut()两种效果间的切换
  • 参数speed表示动画的速度,可设置为动画时长的毫秒值(如1000),或预定的3种速度(slow、fast和normal)。
  • 参数easing表示切换效果,默认效果为swing,还可以使用linear效果。
  • 参数fn表示在动画完成时执行的函数。
  • 参数opacity表示透明度数值(范围在0~1之间,0代表完全透明,0.5表示50%透明,1代表完全不透明)。

5.2 自定义动画

方法说明
animate(params [,speed] [,easing] [,fn])用于创建自定义动画的函数
$.speed([speed] [,settings])创建一个包含一组属性的对象用来定义自定义动画
queue([queueName])显示被选元素上要执行的函数队列
delay(speed [,queueName])设置一个延时来推迟执行队列中之后的项目
clearQueue([queueName])从尚未运行的队列中移除所有项目
dequeue([queueName])从队列移除下一个函数,然后执行函数
finish([queueName])停止当前正在运行的动画,删除所有排队的动画,并完成匹配元素所有的动画
stop([clearQueue] [, jumpToEnd])停止所有在指定元素上正在运行的动画
  • 参数params表示一组包含动画最终属性值的集合。
  • 参数settings是easing与fn组成的一个对象集合。
  • 参数queueName表示队列名称,默认值为fx(标准效果队列)。
  • 参数clearQueue与jumpToEnd都是布尔类型,默认值为false,前者规定是否停止被选元素所有加入队列的动画,后者规定是否立即完成当前的动画。
<input id="btn" type="submit" value="开始动画"><div></div>
<script>	
    $('#btn').click(function () {
        $('div').css({background: 'red', width: 0, height: 0});
        var params = {width: '100px', height: '100px'};
        var settings = $.speed(2000, 'linear');
        $('div').animate(params, settings);
    });
</script>
// 动画队列
$('div').show('slow')
    .animate({left: '+=200'}, 2000)
    .animate({left: '-=200'}, 1500)
    .slideUp('normal', runQue);
// 队列长度
$('div').queue('fx').length;
div.show('slow')
    .animate({left: '+=200'}, 2000)
    .queue(function() {
    // 为队列添加额外操作
    $(this).css('background', 'green').dequeue();
})
    .animate({left: '-=200'}, 1500)
    .slideUp('normal', runQue)
    .queue(function() {
    // 为队列添加额外操作
    $(this).css('background', 'red').dequeue();
});

5.3 练习作业

  • 无缝轮播图
    • 焦点图的各个图片(即需要轮播的图片)依次横向排列。
    • 设置焦点图的外边框的宽度以及超出隐藏,限定其只能显示一张图片。
    • 切换到下一张时,只需要修改焦点图外层样式中的left值,就可以将焦点图整体向左移动,从而显示第2张图片。
    • 当焦点图显示到最后一张图片时,再向左切换就会回到第一张图片,这就是无缝切换效果。
    • 为了实现这种效果,将第一张图片连接到最后一张图片的后面,然后等这张图片向左移动直到完全显示之后,立即将焦点图的left值设为0,就切换到第1张图片了。

6 jQuery操作Ajax

传统的Ajax是通过XMLHttpRequest实现的,不仅代码复杂,而且浏览器兼容问题也比较多。

jQuery中通过对Ajax操作的封装,极大地简化了Ajax操作的开发过程。

分类方法说明
高级应用$.get(url[,data][,fn][,type])通过远程HTTP GET请求载入信息
高级应用$.post(url[,data][,fn][, type])通过远程HTTP POST请求载入信息
高级应用$.getJSON(url[,data][,fn])通过HTTP GET请求载入JSON数据
高级应用$.getScript(url[,fn])通过HTTP GET请求载入并执行一个JavaScript文件
高级应用元素对象.load(url[,data] [,fn])载入远程HTML文件代码并插入至DOM中
底层应用$.ajax(url[,options])通过HTTP请求加载远程数据
底层应用$.ajaxSetup(options)设置全局Ajax默认选项
  • 参数url表示待请求页面的URL地址。
  • data表示传递的参数。
  • 参数fn表示请求成功时,执行的回调函数。
  • 参数type用于设置服务器返回的数据类型,如XML、JSON、HTML、TEXT等。
  • 参数options用于设置Ajax请求的相关选项。
选项名称说明
url处理Ajax请求的服务器地址
data发送Ajax请求时传递的参数,字符串类型
successAjax请求成功时所触发的回调函数
type发送的HTTP请求方式,如get、post
datatype期待的返回值类型,如xml、json、script或html数据类型
async是否异步,true表示异步,false表示同步,默认值为true
cache是否缓存,true表示缓存,false表示不缓存,默认值为true
contentType请求头,默认值为application/x-www-form-urlencoded; charset=UTF-8
complete当服务器URL接收完Ajax请求传送的数据后触发的回调函数
jsonp在一个jsonp请求中重写回调函数的名称
$.post('index.php', {'id': 2, 'name': 'JS'}, function(msg) {
    console.log(msg.id + '-' + msg.name);    // 输出结果:2-JS
}, 'json');

上述代码表示处理当前Ajax请求的地址是同级目录下的index.php,在Ajax请求成功后,接收index.php返回的JSON格式的数据并在控制台进行输出。

  • 在jQuery中对Ajax的操作方法中,$.ajax(url,[options])是底层方法。

  • 通过该方法的options参数,可以实现$.get()$.post() ‘ . g e t J S O N ( ) ‘ 和 ‘ `.getJSON()`和` ‘.getJSON().getScript()`方法同样的功能。

  • 下面列举$.ajax()方法的3种常用方式。

    • 只发送GET请求

      $.ajax('index.php');
      
    • 只配置setting参数,同样实现Ajax操作

      $.ajax('index.php',{
          data: {'book': 'PHP', 'sales': 2000},  // 要发送的数据
          success:function(msg){// 请求成功后执行的函数
              alert(msg);
          }
      });
      
    • 发送GET请求并传递数据,接收返回结果

      $.ajax({
          type: 'GET
          url: 'index.php',
          data: {'id': 2, 'name': 'JS'},
          success: function(msg) {
              console.log(msg);
          }
      });
      
      $.ajaxSetup({
          type: 'GET',
          url: 'index.php',
          data:{'id': 2, 'name': 'JS'},
          success: function(msg) {
              alert(msg);
          }
      });
      $.ajax();
      

除此之外,在jQuery中还为操作Ajax额外的提供了一些辅助的函数以及相关的Ajax事件处理方法,方便开发。

分类方法/函数说明
辅助函数$.param(obj)创建数组或对象的序列化表示
辅助函数serialize()通过序列化表单值,创建URL编码文本字符串
辅助函数serializeArray()通过序列化表单值,创建对象数组(名称和值)
Ajax事件ajaxComplete(fn)Ajax请求完成时触发的事件执行函数
Ajax事件ajaxError(fn)Ajax请求发生错误时触发的事件执行函数
Ajax事件ajaxSend(fn)Ajax请求发送前触发的事件执行函数
Ajax事件ajaxStart(fn)Ajax请求开始时触发的事件执行函数
Ajax事件ajaxStop(fn)Ajax请求结束时触发的事件执行函数
Ajax事件ajaxSuccess(fn)Ajax请求成功时触发的事件执行函数
// 序列化对象
var data = {'id': 2, 'name': 'Lucy', skill: ['PHP', 'JS']};
var seri_data = $.param(data);
var deseri_data = decodeURIComponent(seri_data);
// 输出结果:id=2&name=Lucy&skill%5B%5D=PHP&skill%5B%5D=JS
console.log(seri_data); 
// 输出结果:id=2&name=Lucy&skill[]=PHP&skill[]=JS
console.log(deseri_data);

上述代码表示处理当前Ajax请求的地址是同级目录下的index.php,在Ajax请求成功后,接收index.php返回的JSON格式的数据并在控制台进行输出。

// 序列化表单数据
$('input[type=button]').on('click', function () {
    console.log($('form').serialize());
    console.log($('form').serializeArray());
});

Ajax各个事件处理的先后顺序为ajaxStart() > ajaxSend() > ajaxSuccess()、ajaxError() > ajaxComplete() > ajaxStop()

根据Ajax请求是否发生错误在Ajax发送后执行ajaxSuccess()还是ajaxError()方法进行相关的处理。

$(document).ajaxError(function() {
    console.log('ajaxError');
});
$.post('index.php', {'id': 2, 'name': 'JS'}, function(msg) {
    console.log(msg.id + '-' + msg.name);
}, 'xml');

7 插件机制

7.1 自定义插件

  • 封装jQuery对象方法

    // 在插件中封装1个方法
    (function($){
        $.fn.方法名 = function() {
            // 实现插件的代码
            ……
        };
    })(jQuery);
    
    • . f n 是 j Q u e r y 的原型对象(相当于 .fn是jQuery的原型对象(相当于 .fnjQuery的原型对象(相当于.prototype)。
    • 通过“$.fn.方法名”的方式将封装的功能方法对每一个jQuery实例都有效,成为jQuery的插件。
    • jQuery的简写“ ”是可以被修改的,为了避免影响到插件中的代码,建议将插件方法放在“ ‘ ( f u n c t i o n ( ”是可以被修改的,为了避免影响到插件中的代码,建议将插件方法放在“`(function( 是可以被修改的,为了避免影响到插件中的代码,建议将插件方法放在“‘(function(){……})(jQuery);`”这个包装函数中,该函数的参数$就表示jQuery全局对象。
    // 在插件中封装多个方法
    jQuery.fn.extend({
        方法名1:function(参数列表) {
            // 实现插件的代码
            ……
        },
        方法名2:function(参数列表) {
            // 实现插件的代码
            ……
        }
    });
    
    • 若要在一个插件中封装多个方法,则可以借助extend()方法,为该方法传递对象类型的参数。
    • 参数的设置按照JavaScript对象语法的编写方式即可实现多个方法的封装。
    • 插件文件的名称建议遵循“jquery.插件名.js”的命名规则,防止与其他JavaScript库插件混淆。
  • 定义全局函数

    // 定义全局函数的插件
    jQuery.extend({
        方法名1: function(参数列表){
            // 实现插件的代码
            ……
        },
        方法2: function(参数列表){
            // 实现插件的代码
            ……
        }
    });
    
    • 将自定义函数附加到jQuery命名空间下,从而作为一个公共的全局函数使用。
    • 例如,jQuery的ajax()方法就是利用这种途径内部定义的全局函数。
  • 自定义选择器

    $.expr[":"].方法名称 = function(obj) {
        // 自定义选择器代码
        return 匹配HTML元素的条件;
    };
    
    • 用户可以利用jquery.expr实现选择器的自定义。
    • obj表示进行匹配的HTML元素对应的jQuery对象。
    • 根据需要对jQuery对象的属性进行判断,并使用return返回匹配结果。

7.2 jQuery插件库

随着jQuery的发展,诞生了许多优秀的插件。

网站地址为:http://plugins.jquery.com/。

通过在搜索框中输入插件名即可搜索需要的插件。

7.3 jQuery UI

  • jQuery UI是在jQuery基础上新增的一个库。
  • 特点: 拥有强大的可扩展功能,具有吸引人的漂亮页面,能够更轻松地在网页中添加专业级的UI元素。
  • 举例:日历、菜单、拖拽、调整大小等交互效果。
  • 下载地址
<!-- 引入所需文件 -->
<script src="jQuery-1.12.4.min.js"></script>
<script src="jquery-ui/jquery-ui.min.js"></script>
<link rel="stylesheet" href="jquery-ui/jquery-ui.css">

<div id="datepicker"></div>

<!-- 实例化datepicker -->
<script>
    $('#datepicker').datepicker();
    
    // 自定义日历显示样式
    $('#datepicker').datepicker({
        changeMonth: true,      	// 下拉列表方式选择月份
        changeYear: true,       	// 下拉列表方式选择年
        firstDay: 1,            	// 星期显示顺序为:“Mo Tu We Th Fr Sa Su”
        showOtherMonths: true, // 当前月中空白的日期利用相邻月日期填充
    });
    
    // 自定义中文显示
    var m = ['一月', '二月', '三月', '四月', '五月', '六月','七月', '八月', '九月', '十月', '十一月', '十二月'];
    var d = ['日', '一', '二', '三', '四', '五', '六'];
    $('#datepicker').datepicker({
        ……
        monthNamesShort: m,
        dayNamesMin: d,
    });
</script>

在实际项目中若只做中文开发,则每次使用时都配置这些属性会比较麻烦,建议将中文相关的配置保存到一个JavaScript文件中,每次使用时直接引用即可。

7.4 练习作业

  • 自定义全选与反选插件
    • 编写表格展示数据,为其提供“全选”、“反选”和“全不选”操作按钮。
    • 引入jQuery文件以及自定义的插件文件(待编写)。
    • 编写自定义插件文件,利用封装jQuery对象方法的方式实现插件。
    • 在HTML中,调用插件封装的方法,实现全选、反选以及全不选的功能。

ery-ui.min.js">


> 在实际项目中若只做中文开发,则每次使用时都配置这些属性会比较麻烦,建议将中文相关的配置保存到一个JavaScript文件中,每次使用时直接引用即可。



### 7.4 练习作业

- 自定义全选与反选插件
  - 编写表格展示数据,为其提供“全选”、“反选”和“全不选”操作按钮。
  - 引入jQuery文件以及自定义的插件文件(待编写)。
  - 编写自定义插件文件,利用封装jQuery对象方法的方式实现插件。
  - 在HTML中,调用插件封装的方法,实现全选、反选以及全不选的功能。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

teayear

读后有收获可以支付宝请作者喝咖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值