本文共 36812 字,大约阅读时间需要 122 分钟。
JavaScript 对象和函数的封装
write less,do more
,能对 HTML 文档遍历和操作,事件处理,动画以及 Ajax 变得更加简单原生 JS 设置背景
window.onload = function (ev) { // 1.利用原生的JS查找DOM元素 var div1 = document.getElementsByTagName("div")[0]; var div2 = document.getElementsByClassName("box1")[0]; var div3 = document.getElementById("box2"); // 2.利用原生的JS修改背景颜色 div1.style.backgroundColor = "red"; div2.style.backgroundColor = "blue"; div3.style.backgroundColor = "yellow";}
使用 jQuery 设置背景
$(document).ready(function(){ // 查询,操作 CSS 一步到位 $("div").eq(0).css('background','red'); $(".one").eq(0).css('background','blue'); $("#two").css('background','yellow');});
强大的选择器
CSS1-CSS3
几乎所有的选择器,以及 jQuery 独创
的选择器样式操作
事件处理
jQuery插件
Ajax
技术完美结合浏览器兼容
(建议学习1.x
版本)版本 | 兼容性 |
---|---|
1.x | 兼容ie678 ,但相对其它版本文件较大,官方只做BUG维护,功能不再新增,最终版本:1.12.4 |
2.x | 不兼容ie678 ,相对1.x文件较小,官方只做BUG维护,功能不再新增,最终版本:2.2.4 |
3.x | 不兼容ie678 ,只支持最新的浏览器,很多老的jQuery插件不支持这个版本,相对1.x文件较小,提供不包含Ajax/动画API版本 |
体积小
,压缩后只有100KB
左右选择器
DOM封装
事件处理机制
浏览器兼容性
隐式迭代简化编程
插件支持
jQuery 官网
jQuery 库分开发版和发布版
名称 | 大小 | 说明 |
---|---|---|
jQuery-1.版本号.js(开发版) | 约268KB | 完整无压缩版本,主要用于测试,学习和开发 |
jQuery-1.版本号.min.js(发布版) | 约91KB | 经过工具压缩或经过服务器开启Gzip压缩,主要应用于发布的产品和项目 |
工厂函数 $()
转化
为 jQuery 对象选择器 selector
方法 action()
$(selector).action()$("#current").addClass("current")
$ 等同于 jQuery
$(document).ready()=jQuery(document).ready()$(function(){ ...})=jQuery(function(){ ...})
jQuery 链式调用
.
不断调用 jQuery 对象的方法
,而原生 JavaScript 则不一定// 1.原生JavaScriptvar div = document.getElementsByTagName("div");// 报错,必须分开写div[0].style.backgroundColor = "red".width = 200+"px";// div[0].style.width = 200+"px";// 2.jQuery$(document).ready(function () { // 不报错,后面还可以接着继续写 $("div").eq(1).css('background', 'yellow').css('width', '200px');});
jQuery 隐式遍历(迭代)
// 1.原生JavaScriptvar div = document.getElementsByTagName("div");// div.style.backgroundColor = "red";// 无效for(var i = 0; i
读写合一
$(document).ready(function () { // 读取数据 var $tx = $("div").eq(0).text(); alert($tx); // 写入数据 $("div").eq(0).text("新的数据");});
原生JS
会等到DOM元素加载完毕
,并且图片也加载完毕
才会执行jQuery
会等到DOM元素加载完毕
,但不会等到图片也加载完毕
就会执行1. js 原生入口函数window.onload = function (ev) { // 1.通过原生的JS入口函数可以拿到DOM元素 var images = document.getElementsByTagName("images")[0]; // 2.通过原生的JS入口函数可以拿到DOM元素的宽高 var width = window.getComputedStyle(images).width; }=============================================================2. jQuery 入口函数$(document).ready(function () { // 1.通过jQuery入口函数可以拿到DOM元素 var $images = $("images"); // 2.通过jQuery入口函数不可以拿到DOM元素的宽高 var $width = $images.width();});
原生JS
如果编写了多个入口函数
,后面编写的会覆盖
前面编写的jQuery
中编写多个入口函数
,后面的不会覆盖
前面的1. 原生 jswindow.onload = function (ev) { alert("hello lnj1");// 不会显示}window.onload = function (ev) { alert("hello lnj2");// 会显示}===================================2. jQuery$(document).ready(function () { alert("hello lnj1");// 会显示});$(document).ready(function () { alert("hello lnj2");// 会显示});
jQuery 不会覆盖的本质
闭包
ready函数
传递一个新的函数
,不同函数内部的数据不会相互干扰
为何能访问$符号
$
符号 jQuery 框架对外暴露的一个全局变量
为何 window.jQuery = window.$ = jQuery;
不仅提供了jQuery访问还提供$访问
,提升开发者的编码效率
JavaScript中如何定义一个全局变量?
全局变量
是 window 对象
的属性window.jQuery = window.$ = jQuery;
使用 jQuery 框架只有两种方式
$
jQuery
总结
window.onload | $(document).ready() | |
---|---|---|
执行时机 | 必须等待网页全部加载完毕(包括 图片等) ,然后再执行包裹代码 | 只需要等待网页中的DOM结构加载完毕 ,就能执行包裹的代码 |
执行次数 | 只能执行一次 ,如果第二次,那么第一次的执行会被覆盖 | 可以执行多次 ,第N次都不会被上一次覆盖 |
// 1.第一种写法$(document).ready(function () { alert("hello lnj");});// 2.第二种写法jQuery(document).ready(function () { alert("hello lnj");});// 3.第三种写法(推荐)$(function () { alert("hello lnj");});// 4.第四种写法jQuery(function () { alert("hello lnj");});
冲突
时,可以释放$使用权
注意点
其它jQuery代码之前
编写不能再使用$,改为使用jQuery
jQuery.noConflict();
// 2.自定义一个访问符号var nj = jQuery.noConflict();nj(function () { alert("hello lnj");});
我是span
DOM对象
直接
使用 JavaScript 获取的节点对象var objDOM = document.getElementById("title");var objHTML = objDOM.innerHTML;
jQuery对象
方法
$("#title").html();等同于document.getElementById("title").innerHTML;
独立
的方法,不能混用
$()函数
进行转化:$(DOM对象)
jQuery
对象命名一般约定以$开头
var txtName = document.getElementById("txtName"); //DOM对象var $txtName = $(txtName); //jQuery对象
类似数组
的对象,可以通过[index]
的方法得到相应的DOM对象var $txtName = $("#txtName"); // jQuery对象var txtName = $txtName[0]; // DOM对象
get(index)
方法得到相应的DOM对象var $txtName = $("#txtName"); // jQuery对象var txtName = $txtName.get(0); // DOM对象
伪数组
var $div = $("div"); console.log($div); var arr = [1, 3, 5]; console.log(arr);
什么是伪数组
0 到 length-1
属性length
属性var obj = { 0:"lnj", 1:"33", 2:"male", length: 3}
标签选择器、类选择器、ID选择器、并集选择器、交集选择器和全局选择器
名称 | 语法构成 | 描述 | 示例 |
---|---|---|---|
标签 选择器 | element | 根据给定的标签名 匹配元素 | $(“h2”)选取所有h2元素 |
类 选择器 | .class | 根据给定的class 匹配元素 | $(".title")选取所有class为title的元素 |
ID 选择器 | #id | 根据给定的id 匹配元素 | $("#title")选取id为title的元素 |
并集 选择器 | selector1,selector2,…,selectorN | 将每一个选择器匹配的元素合并 后一起返回 | $(“div,p,.title” )选取所有div、p和拥有class为title的元素 |
交集 选择器 | element.class或element#id | 匹配指定class或id的某元素或元素集合 | $(“h2.title”)选取所有拥有class为title的h2元素 |
全局 选择器 | * | 匹配所有元素 | $("*" )选取所有元素 |
层次关系
来获取元素名称 | 语法构成 | 描述 | 实例 |
---|---|---|---|
后代 选择器 | ancestor descendant | 选取 ancestor 元素里的所有 descendant (后代)元素 | $("#menu span" )选取 #menu 下的 span 元素 |
子 选择器 | parent > child | 选取 parent 元素下的child(子)元素 | $(" #menu>span" )选取 #menu 的子元素 span |
相邻 元素选择器 | prev + next | 选取紧邻 prev 元素之后的 next 元素 | $(" h2+dl " )选取紧邻 h2 元素之后的同辈元素 dl |
同辈 元素选择器 | prev~sibings | 选取 prev 元素之后的所有 siblings 元素 | $(" h2~dl " )选取 h2 元素之后所有的同辈元素 dl |
导航菜单案例
HTML元素的属性
来选择元素名称 | 语法构成 | 描述 | 示例 |
---|---|---|---|
属性选择器 | [attribute] | 选取包含给定属性 的元素 | $(" [href]" )选取含有href属性的元素 |
属性选择器 | [attribute=value] | 选取等于给定属性是某个特定值 的元素 | $(" [href =’#’]" )选取含有href属性的元素 |
属性选择器 | [attribute != value] | 选取不等于给定属性是某个特定值 的元素 | $(" [href !=’#’]" )选取含有href属性的元素 |
属性选择器 | [attribute ^= value] | 选取给定属性是以某些特定值开始 的元素 | $(" [href ^=‘en’]" )选取含有href属性的元素 |
属性选择器 | [attribute $=value] | 选取给定属性是以某些特定值结尾 的元素 | $(" [href $=’.jpg’]" )选取含有href属性的元素 |
属性选择器 | [attribute *=value] | 选取给定属性是以包含某些值 的元素 | $(" [href *=‘txt’]" )选取含有href属性的元素 |
通过特定的过滤规则来筛选元素
语法特点
:
"$(“li:first”)
来选取第一个li元素
主要分类
基本
过滤选择器可见性
过滤选择器内容
过滤选择器子元素
过滤选择器选取第一个元素、最后一个元素、索引为偶数或奇数
的元素根据索引的值
选取元素名称 | 语法构成 | 描述 | 示例 |
---|---|---|---|
基本过滤选择器 | :first | 选取第一个 元素 | $(" li:first" )选取所有 li 元素中的第一个 li 元素 |
基本过滤选择器 | :last | 选取最后一个 元素 | $(" li:last" )选取所有 li 元素中的最后一个 li 元素 |
基本过滤选择器 | :even | 选取索引是偶数的所有元素(index从0开始) | $(" li:even" )选取索引是偶数的所有 li 元素 |
基本过滤选择器 | :odd | 选取索引是奇数的所有元素(index从0开始) | $(" li:odd" )选取索引是奇数的所有 li 元素 |
基本过滤选择器 | :eq(index) | 选取索引等于index 的元素(index从0开始) | $(“li:eq(1)” )选取索引等于1的 li 元素 |
基本过滤选择器 | :gt(index) | 选取索引大于index 的元素(index从0开始) | $(" li:gt(1)" )选取索引大于1的 li 元素(注:大于1,不包括1) |
基本过滤选择器 | :lt(index) | 选取索引小于index的元素(index从0开始) | $(“li:lt(1)” )选取索引小于1的 li 元素(注:小于1,不包括1) |
通过元素显示状态
来选取元素名称 | 语法构成 | 描述 | 示例 |
---|---|---|---|
可见性过滤选择器 | :visible | 选取所有可见的元素 | $(":visible" )选取所有可见的元素 |
可见性过滤选择器 | :hidden | 选取所有隐藏的元素 | $(":hidden" ) 选取所有隐藏的元素 |
选择器 | 描述 | 返回 |
---|---|---|
:empty | 选取不包含子元素或文本为空的元素 | 集合元素 |
:parent | 选取含有子元素或文本的元素 | 集合元素 |
:contains(text) | 选取含有文本内容为text的元素 | 集合元素 |
:has(selector) | 选取含有选择器所匹配的元素的元素 | 集合元素 |
:empty
既没有文本内容也没有子元素
的指定元素zslnj
:parent
有文本内容或有子元素
的指定元素zslnj
:contains(text)
包含指定文本内容
的指定元素lnjzslnjlnj
:has(selector)
包含指定子元素
的指定元素与:parent 区别
:parent
只要有子元素就会被找到:has(selector)
不仅要有子元素,而且子元素还必须满足条件
jjjzs
lnj
添加一个或多个类
空格隔开
即可addClass(class)或addClass(class1 class2 … classN)
删除
元素的一个或多个类空格隔开
即可removeClass(“style2 ”)或removeClass("style1 style2 ")
切换
元素添加或删除
一个类(存在就删除不存在就添加
)toggleClass()
模拟了addClass()
与removeClass()
实现样式切换
的过程toggleClass(class)
添加或获取
元素中的HTML
innerHTML
解析
内部HTML标签$("div.left").html(); // 获取元素中的html代码或$("div.left").html("…"); // 设置元素中的html代码
添加或获取
元素中的文本
text
方法能做的html
方法都能做,所以一般使用html方法即可$("div.left").text(); // 获取元素中的文本内容或$("div.left").text("…"); // 设置元素中的文本内容
html()
和 text()
的区别语法 | 参数 | 功能 |
---|---|---|
html() | 无参数 | 用于获取第一个 匹配元素的HTML内容或文本内容 |
html(content) | content参数为元素的HTML内容 | 用于设置 所有匹配元素的HTML内容或文本内容 |
text() | 无参数 | 用于获取所有 匹配元素的文本 内容 |
text(content) | content参数为元素的文本内容 | 用于设置 所有匹配元素的文本 内容 |
添加或获取
元素value属性
的值$(this).val(); // 获取元素的value属性值或$(this).val(""); // 设置元素的value属性值
css()
为指定的元素设置样式值,修改的是行内样式
css(name,value) $(this).css("border","5px solid #f5f5f5");
设置或获取
元素宽度
(相当于获取width属性值
)$(function () { $("button").eq(0).click(function () { // 1.获取元素宽度(不包括padding和border) // alert($('.son').width()); }); $("button").eq(1).click(function () { // 2.设置元素宽度(不包括padding和border) // $(".son").width("50px"); });});
设置或获取
元素高度
(相当于获取height属性值
)$(function () { $("button").eq(0).click(function () { // 1.获取元素宽度(不包括padding和border) // alert($('.son').width()); }); $("button").eq(1).click(function () { // 2.设置元素宽度(不包括padding和border) // $(".son").width("50px"); });});
获取或设置
元素相对窗口
的偏移位$(function () { $("button").eq(0).click(function () { // 1.获取距离窗口的偏移位(从border开始) alert($('.son').offset().left); // 100 }); $("button").eq(1).click(function () { // 2.设置距离窗口的偏移位 $('.son').offset({ left:10, top:10}); });});
最近
的具有相对位置
(position:relative或position:absolute
)的父级元素
的距离$(function () { $("button").eq(0).click(function () { // 1.获取匹配元素相对父元素的偏移 alert($('.son').position().left);// 50 }); $("button").eq(1).click(function () { // 2.无效,不能设置相对定位元素的偏移位 $('.son').position({ left:10, top:10}) });});
设置或获取
匹配元素相对滚动条顶部
的偏移$(function () { $("button").eq(0).click(function () { // 7.获取匹配元素相对滚动条顶部的偏移 // alert($('.scroll').scrollTop()); // alert($('html').scrollTop()); // 兼容所有浏览器写法 alert($('html').scrollTop()+$('body').scrollTop()); }); $("button").eq(1).click(function () { // 8.设置匹配元素相对滚动条顶部的偏移 // $('.scroll').scrollTop(100); // $('html').scrollTop(100); // 兼容所有浏览器写法 $('html,body').scrollTop(100); });});
scrollLeft()
方法返回或设置
匹配元素的滚动条的水平位置
从其左侧滚动过的像素数
最左侧
时,位置是 0
$(function () { $("button").eq(0).click(function () { // 7.获取匹配元素相对滚动条水平的偏移 // alert($('.scroll').scrollLeft()); // alert($('html').scrollLeft()); // 兼容所有浏览器写法 alert($('html').scrollLeft()+$('body').scrollLeft()); }); $("button").eq(1).click(function () { // 8.设置匹配元素相对滚动条水平的偏移 // $('.scroll').scrollLeft(100); // $('html').scrollLeft(100); // 兼容所有浏览器写法 $('html,body').scrollLeft(100); });});
保存的变量
就是属性无论是自定义对象,还是DOM对象
)添加或修改
属性(没有就会添加,有就会修改
) 对象.属性名称 = 值
对象["属性名称"] = 值
获取属性
对象["属性名称"]
在HTML标签中添加的属性就是属性节点
attributes
属性中保存的所有内容都是属性节点// 这里的class和nj就是属性节点
获取
属性节点 DOM元素.getAttribute("属性名称");
设置
属性节点 DOM元素.setAttribute("属性名称", "值");
任何对象都有属性
, 但是只有DOM对象才有属性节点
作用
获取或设置属性节点的值
参数
一个参数
, 代表获取
属性节点的值两个参数
, 代表设置
属性节点的值注意点
获取
只会返回第一个元素指定的属性节点的值
设置
多少个元素不存在
, 那么系统会自动新增
$(function () { // 1.获取指定属性节点值 var $res = $(".span1").attr("nj"); console.log($res); // 2.设置属性节点 $(".span1").attr("nj", "666"); $(".span2").attr("id", "box1 box2"); // 3.注意点: // 3.1.获取属性节点时,只会获取找到所有元素中第一个元素的属性节点 $res = $("span").attr("class"); console.log($res); $("span").attr("class", "lnj");});
作用
删除
属性节点注意点
删除所有
找到元素指定的属性节点$(function () { // 1.设置属性节点时,会给所有找到元素设置属性节点 $("span").attr("test", "jonathan"); // 2.删除属性节点时,会删除所有找到元素的属性节点 $("span").removeAttr("test");});
作用
设置或获取
元素的属性值注意点
prop
方法不仅能够操作
属性, 还能操作属性节点
true
和 false
两个属性的属性节点checked, selected
或者 disabled
使用prop()
,其他的使用 attr()
$(function () { // 1.设置属性 // 1.1.设置属性时,会设置所有找到元素的属性 $("span").prop("demo", "lnj"); // 2.获取属性 // 2.1.获取属性时,只会获取找到第一个元素的属性 console.log($("span").prop("demo"));});
$(function () { // 删除所有找到元素的demo属性 $("span").removeProp("demo");});
DOM
对象,都有一个attributes
属性,而prop
可以操作属性,所以也可以操作属性节点true
和 false
两个属性的属性节点(如 checked, selected 或者 disabled
)使用prop()
,其他
的使用 attr()
true
和 false
两个属性的属性节点,如果没有编写默认attr返回undefined
,而prop返回false
$(function () { // 1.可以通过prop获取属性节点 console.log($("input").prop("class")); // 2.可以通过prop设置属性节点 $("input").prop("class", "tag"); // 3.如果没有默认值,那么attr获取返回undefined //console.log($("input[type=checkbox]").attr("checked")); // 4.如果没有默认值,那么prop获取返回false console.log($("input[type=checkbox]").prop("checked")); // 5.通过attr设置选中 //$("input[type=checkbox]").attr("checked", true); // 6.通过prop设置选中 $("input[type=checkbox]").prop("checked", true)});
DOM操作
进行了封装
,使用更简便
内容及Value属性值
操作节点
操作节点属性
操作节点遍历
查找
节点(利用选择器
完成)创建
节点插入
节点删除
节点替换
节点复制
节点$()
用于获取或创建
节点 $(selector)
:通过选择器
获取节点$(element)
:把DOM节点转化
成jQuery节点$(html)
:使用HTML字符串创建
jQuery节点// 创建含文本与属性
元素内部插入子节点
语法 | 功能 |
---|---|
append(content) | $(A).append(B) 表示将B追加到A内部的最后 ,如:$("ul").append($newNode1); |
appendTo(content) | $(B).appendTo(A) 表示把B追加到A内部的最后 ,如:$newNode1.appendTo("ul"); |
prepend(content) | $(A). prepend (B) 表示将B前置插入 到A内部中,如:$("ul"). prepend ($newNode1); |
prependTo(content) | $(B). prependTo (A) 表示将B前置插入 到A内部中,如:$newNode1. prependTo ("ul"); |
元素外部插入同辈节点
语法 | 功能 |
---|---|
after(content) | $(A).after (B) 表示将B插入到A外部之后 ,如:$("ul").after($newNode1); |
insertAfter(content) | $(B). insertAfter(A) 表示将B插入到A外部之后 ,如:$newNode1.insertAfter("ul"); |
before(content) | $(A). before (B) 表示将B插入至A外部之前 ,如:$("ul").before($newNode1); |
insertBefore(content) | $(B). insertBefore (A) 表示将A插入到B外部之前 ,如:$newNode1.insertBefore("ul"); |
empty()
删除指定元素的内容和子元素
, 指定元素自身不会被删除
$("div").empty();
remove()
删除指定元素
// 删除所有div$("div").remove();// 删除div中id是box1的那个div$("div").remove("#box1");
detach()
删除指定元素
// 删除所有div$("div").detach();// 删除div中id是box1的那个div$("div").detach("#box1");
remove 和 detach 区别
remove
删除元素后,元素上的事件会被移出
detach
删除元素后,元素上的事件会被保留
$("button").click(function () { // $("div").remove(); // $("div").empty(); // $("li").remove(".item"); // 利用remove删除之后再重新添加,原有的事件无法响应 // var $div = $("div").remove(); // 利用detach删除之后再重新添加,原有事件可以响应 var $div = $("div").detach(); // console.log($div); // 将删除的返回值重新添加到body上 $("body").append($div);});$("div").click(function () { alert("div被点击了");});
replaceWith
所有
匹配的元素替换
成指定的 HTML 或 DOM 元素
replaceWith 参数
可以是一个DOM元素
、也可以是一个代码片段
replaceAll
所有 selector 匹配到的元素
// 编写jQuery相关代码$("button").click(function () { // 创建一个新的节点 var $item = $("我是标题6
"); // 利用新的节点替换旧的节点 // $("h1").replaceWith($item); $item.replaceAll("h1");});
clone
复制
一个节点true
表示复制事件处理
浅复制
不会复制节点的事件
深复制
会复制节点的事件
$(function () { // clone([Even[,deepEven]]) $("button").eq(0).click(function () { // 1.浅复制一个元素 var $li = $("li:first").clone(false); // 2.将复制的元素添加到ul中 $("ul").append($li); // 点击li无法响应事件 }); $("button").eq(1).click(function () { // 1.深复制一个元素 var $li = $("li:first").clone(true); // 2.将复制的元素添加到ul中 $("ul").append($li); // 点击li可以响应事件 }); $("li").click(function () { alert($(this).html()); });});
wrap
用其他标记包裹起来
需要在文档中插入额外的结构化标记
非常有用, 而且不会破坏原始文档的语义
wrapAll
所有
匹配的元素用一个元素来包裹wrap
方法是将所有的元素进行单独包裹
wrapInner
每一个匹配的元素的子内容
(包括文本节点
)用其他结构化标记包裹起来//测试使用 jQuery wrap, wrapAll, wrapInner$(function(){ //包装 li 本身 $("#box1 li").wrap(""); //包装所有的 li $("#box2 li").wrapAll(""); //包装 li 里边的文字. $("#box3 li").wrapInner("");})
方法 | 作用 |
---|---|
children | 只考虑子元素 ,不考虑后代元素 |
next | 同辈紧邻后面一个 元素 |
nextAll | 同辈紧邻后面所有 兄弟元素 |
prev | 同辈紧邻前一个 兄弟元素 |
prevAll | 同辈紧邻前所有 兄弟元素 |
siblings | 同辈所有 兄弟元素 |
find(‘xx’) | 返回被选元素的后代 元素,括号内必填写,如果查找所有后代使用 “*”,起查找 作用 |
filter(‘xx’) | 指定选择器的xx元素 ,括号内必填写,符合条件的同级元素,非后代元素,起过滤 作用 |
has(‘xx’) | 符合条件的后代 元素,不包含自身 ,括号内必填写,起过滤 作用 |
parent() | 获取元素的父级 元素 |
parents() | 获取所有祖先 元素,参数为筛选条件 |
parentsUntil() | 截止到xx位置的祖先 节点 |
closest('xx')
最近的匹配元素
,包括自身
检查自身是否符合
符合返回元素本身
不匹配
,向上查找父元素
,逐级向上直到匹配到选择器的元素
什么没找到
,返回一个空的jQuery对象
只能找到一个元素
增删全选
JavaScript事件的封装
Window
事件鼠标
事件键盘
事件表单
事件$(对象).type(fn)
type
是事件名
fn
是事件处理函数
$(对象).事件名(fn)$('input').click(function(){ alert('123')})
bind()
方法和on()
方法优点
缺点
注意点
不会覆盖
$(对象).on(type,[event],fn)type -- 事件类型event -- 事件参数fn -- 处理函数// 2.通过on绑定事件$("button").on("click", function () { alert("hello click1");});
多个事件
绑定方法$("input[name=event_1]").on({ mouseover: function () { // 为 mouseover 绑定方法 $("ul").css("display", "none"); }, mouseout: function () { // 为 mouseout 绑定方法 $("ul").css("display", "block"); }});
移除
事件使用unbind()
方法和off()
方法off方法
如果不带参数
时,表示移除所绑定的全部事件
off方法
如果传递一个参数
, 会移除所有指定类型的事件
off方法
如果传递两个参数
, 会移除所有指定类型的指定事件
$(对象).off([type],[fn])$("button").off(); // 移除button中全部事件$("button").off("click"); // 移除button中click事件$("button").off("click", test1); // 移除button中click事件中test1事件
当事件被触发
时,系统会将事件对象(event)传递给回调函数
,通过event对象就能获取时间的坐标
获取事件坐标有三种方式
event.offsetX, event.offsetY
相对于事件元素左上角
event.pageX, event.pageY
相对于页面的左上角event.clientX, event.clientY
相对于视口的左上角
event.page 和 event.client 区别
网页
是可以滚动
的,而视口
是固定
的获取距离可视区域坐标
通过event.client
获取距离网页左上角的坐标
通过event.page
$(function () { // 获取事件的坐标 $(".son").click(function (event) { // 获取相对于事件元素左上角坐标 console.log(event.offsetX, event.offsetY); // 获取相对于视口左上角坐标 console.log(event.clientX, event.clientY); // 获取相对于页面左上角坐标 console.log(event.pageX, event.pageY); });});
什么是事件冒泡
从目标元素逐级向上传播到根节点的过程
阻止事件冒泡
不影响其父元素
, 此时便可以使用停止事件冒泡
$(function () { $(".son").click(function (event) { console.log(".son"); // 在子元素中停止事件冒泡,时间不会继续向上传播,所以父元素click方法不会被触发 event.stopPropagation(); }); $(".father").click(function () { console.log(".father"); });});
什么是默认行为
默认行为
例如
阻止默认行为
event.preventDefault();
方法阻止事件默认行为
$(function () { $("a").click(function (event) { var str = $("a").attr("href"); // 如果超链接是百度就不跳转 if(str.indexOf("baidu") > 0){ // 阻止默认行为 event.preventDefault(); } });});
什么是自动触发
事件
代码控制
事件, 不用人为点击/移入/移除等
事件就能被触发自动触发方式
$("selector").trigger("eventName");
触发事件冒泡
触发事件默认行为
$("selector").triggerHandler("eventName");
不会触发事件冒泡
不会触发事件默认行为
$(function () { /* $(".son").click(function () { alert("son"); }); $(".father").click(function () { alert("father"); }); // trigger 会触发事件冒泡 // $(".father").trigger("click"); // $(".son").trigger("click"); // triggerHandler 不会触发事件冒泡 // $(".father").triggerHandler("click"); // $(".son").triggerHandler("click"); */ $("input[type='submit']").click(function () { alert("点击了A标签"); }); // trigger 会触发系统默认事件 // $("input[type='submit']").trigger("click"); // triggerHandler 不会触发系统默认事件 $("input[type='submit']").triggerHandler("click");});
什么是自定义
事件
不存在的事件名称来注册事件
,通过这个名称还能触发对应的方法执行
, 这就是自定义事件自定义事件的条件
通过on绑定
的通过trigger来触发
trigger
方法可以自动触发对应名称的事件
,所以只要事件的名称和传递给trigger的名称一致
就能执行对应的事件方法$(function () { $(".father").on("njClick", function () { alert("njClick"); }); $(".father").trigger("njClick");});
什么是事件命名空间
区分相同类型
的事件,区分不同前提条件
下到底应该触发哪个事件eventName.命名空间
添加事件命名空间的条件
通过on来绑定
的通过trigger触发事件
事件命名空间注意点
(面试题
)
trigger
触发子元素带命名空间
的事件时,会触发父元素带相同命名空间的事件
,父元素没有命名空间的事件不会被触发trigger
触发子元素不带命名空间
的事件时,所有父元素(带相同命名空间,不带命名空间)事件
都会被触发,所有子元素(带相同命名空间,不带命名空间)事件
也都会被触发$(function () { // 给父元素添加不带命名空间事件 $(".father").on("click", function () { alert("father"); }); // 给父元素添加带命名空间事件 $(".father").on("click.66", function () { alert("66 - father"); }); $(".son").on("click.nj", function () { alert("nj - 向左走"); }); $(".son").on("click.66", function () { alert("66 - 向右走"); }); // 会同时触发NJ和66编写的click事件 // 事件会冒泡到不带命名空间上级元素和带相同命名空间的上级元素 // $(".son").trigger("click"); // 只会触发NJ编写的click事件 // 事件不会冒泡到不带命名空间上级元素 // $(".son").trigger("click.nj"); // 只会触发66编写的click事件 // 事件只会冒泡到带相同命名空间的上级元素 $(".son").trigger("click.66");});
请其他人帮忙做我们想做的事
最终的结果还是会反馈到我们
这里减少监听数量
事件处理程序数量
将直接关系到页面的整体运行性能
需要不断的与dom节点进行交互
,访问dom的次数越多
,引起浏览器重绘与重排的次数也就越多
,就会延长整个页面的交互就绪时间
每个监听的函数都是一个对象
,是对象就会占用内存
,对象越多
,内存占用率就越大
,自然性能就越差
新增元素自动有事件响应处理
新增的元素无法响应新增前添加的事件
添加前
$("li").click隐式迭代给界面上所有li都添加了click事件
(监听数量众多
)$("ul").append
新添加的li无法影响
click事件添加后
$(parentSelector).delegate(childrenSelector, eventName, callback)
$("ul").delegate隐式迭代所有ul添加事件
(相比开始迭代li,必然ul的个数会少很多)事件被触发
时,系统会自动动态查找
当前是哪个li触发了事件,所以新增的li也能响应到事件$(function () { // 1.委托ul监听li的点击事件 $("ul").delegate("li","click",function () { // 前面我们说过事件委托就是让别人帮忙做事,但最终的结果还是会返回到我们手里,所以这里的this是触发事件的li // 这里的this之所以是触发事件的li,本质是因为"事件冒泡", 触发事件的li向上传递到ul,触发了click事件.// console.log(this); // 弹出当前点击行内容 alert($(this).html()); }); // 2.监听新增按钮点击 var count = 0; $("button").eq(0).click(function () { count++; // 新增一行内容 $("ul").append("
delegate()
方法用于委托事件的注册
$(对象).delegate(子元素名,事件名,处理函数)
委托事件的特点
事件冒泡机制
实现委托提高
事件处理的性能
动态添加DOM元素
的事件绑定$(function(){ // 简单低级方式 $('li').on('mouseover',function(){ $(this).css('color','#f00') }) // 代理高级方式 $('ul').delegate('li','mouseover',function(){ $(this).css('color','#f00') })}
移动到子元素不会触发事件
$(function () { // 移动到子元素不会触发事件 // 2.1移入事件 $('.father').mouseenter(function () { console.log('mouseenter'); }); // 2.2移除事件 $('.father').mouseleave(function () { console.log('mouseleave'); });});
移动到子元素会触发事件
$(function () { // 2.1移入事件 $('.father').mouseover(function () { console.log('mouseover') ; }); // 2.2移除事件 $('.father').mouseout(function () { console.log('mouseout') ; });});
内容监听移入和移出
调用mouseenter和mouseleave
$(function () { /* // 传入两个回调函数,一个监听移入,一个监听移出 $(".father").hover(function () { console.log("mouseenter"); }, function () { console.log("mouseleave"); }); */ // 如果只传入一个方式,那么这个方式既监听移入也监听移出 $(".father").hover(function () { console.log("移入移除"); });});
显示与隐藏
淡入淡出
高度
显示动画
显示速度
可以实现动画效果毫秒(如1000)、slow、normal、fast
默认
的动画时长是400毫秒
slow
本质是600毫秒
normal
本质是400毫秒
fast
本质是200毫秒
原理
块级
,调用display:block;
行内
,调用display:inline;
// 编写jQuery相关代码$("button").eq(0).click(function () { // $("div").css("display", "block"); // 注意: 这里的时间是毫秒 $("div").show(1000, function () { // 作用: 动画执行完毕之后调用 alert("显示动画执行完毕"); });});
隐藏动画
参数
也可以设置隐藏
的动画效果$("button").eq(1).click(function () { // $("div").css("display", "none"); $("div").hide(1000, function () { alert("隐藏动画执行完毕"); });});
切换动画
显示变隐藏,隐藏变显示
$("button").eq(2).click(function () { $("div").toggle(1000, function () { alert("切换动画执行完毕"); });});
展开动画
逐步延伸显示
$("button").eq(0).click(function () { $("div").slideDown(1000, function () { alert("展开完毕"); });});
收起动画
逐步缩短直至隐藏
$("button").eq(1).click(function () { $("div").slideUp(1000, function () { alert("收起完毕"); });});
切换动画
展开变收起,收起变展开
$("button").eq(2).click(function () { $("div").slideToggle(1000, function () { alert("收起完毕"); });});
淡入动画
改变元素的透明度
实现淡入
效果$("button").eq(0).click(function () { $("div").fadeIn(1000, function () { alert("淡入完毕"); });});// 以较慢的速度淡入$("input[name=fadein_btn]").click(function(){ $("img").fadeIn("slow");});
淡出动画
改变元素的透明度
实现淡出
效果$("button").eq(1).click(function () { $("div").fadeOut(1000, function () { alert("淡出完毕"); });});
切换
动画 显示变淡出,不显示变淡入
$("button").eq(2).click(function () { $("div").fadeToggle(1000, function () { alert("切换完毕"); });});
指定透明度
动画通过第二个参数
,淡入到指定的透明度(取值范围0~1
)$("button").eq(3).click(function () { $("div").fadeTo(1000, 0.2, function () { alert("淡入完毕"); })});
animate()
针对各类样式变化
提供渐变
的动画功能$(selector).animate(styles,speed,easing,callback)styles 变化的样式speed 动画的速度easing 动画的方式callback 动画后的执行回调函数
/*第一个参数: 接收一个对象, 可以在对象中修改属性第二个参数: 指定动画时长第三个参数: 指定动画节奏, 默认就是swing第四个参数: 动画执行完毕之后的回调函数*/$(".two").animate({ marginLeft: 500}, 5000, "linear", function () { // alert("自定义动画执行完毕");});
初始位置或者初始状态
,如果想在上一次位置或者状态下再次进行动画
可以使用累加动画
$("button").eq(1).click(function () { $(".one").animate({ width: "+=100" }, 1000, function () { alert("自定义动画执行完毕"); });});
同时操作多个属性
,自定义
动画会执行同步
动画,多个被操作的属性一起执行动画$(".one").animate({ width: 500, height: 500}, 1000, function () { alert("自定义动画执行完毕");});
同时执行
的动画$(selector).animate({ 样式1,样式2...},speed)
先后执行
的动画//先执行的动画$(selector).animate(styles,speed,easing,function(){ //后执行的动画 $(selector).animate(styles,speed,easing) })
链式编程
$("div").slideDown(1000).slideUp(1000).show(1000);$(".one").slideDown(1000,function () { $(".one").slideUp(1000, function () { $(".one").show(1000); });});
后面紧跟一个非动画方法
则会被立即执行
// 立刻变为黄色,然后再执行动画$(".one").slideDown(1000).slideUp(1000).show(1000).css("background", "yellow");
动画执行完毕之后设置
回调
动画队列
$(".one").slideDown(1000,function () { $(".one").slideUp(1000, function () { $(".one").show(1000, function () { $(".one").css("background", "yellow") }); });});$(".one").slideDown(1000).slideUp(1000).show(1000).queue(function () { $(".one").css("background", "yellow")});
注意
queue()
后面不能继续直接添加queue()
想继续添加必须在上一个queue()方法中next()方法
$(".one").slideDown(1000).slideUp(1000).show(1000).queue(function (next) { $(".one").css("background", "yellow"); next(); // 关键点}).queue(function () { $(".one").css("width", "500px")});
动画延迟时长
$(".one").animate({ width: 500 // height: 500}, 1000).delay(2000).animate({ height: 500}, 1000);
停止
指定元素上正在执行的动画// 立即停止当前动画, 继续执行后续的动画$("div").stop();$("div").stop(false);$("div").stop(false, false);// 立即停止当前和后续所有的动画$("div").stop(true);$("div").stop(true, false);// 立即完成当前的, 继续执行后续动画$("div").stop(false, true);// 立即完成当前的, 并且停止后续所有的$("div").stop(true, true);
动画停止stop(stopAll,gotoEnd)
stopAll
表示是否停止后续其他动画执行
gotoEnd
表示是否允许完成当前动画
,是在第一个参数生效
时使用对象方法
对象方法用实例对象调用
,而静态方法用类名调用
// 1.定义一个类 function AClass() { } // 2.给这个类添加一个静态方法 // 直接添加给类的就是静态方法 AClass.staticMethod = function () { alert("staticMethod"); } // 静态方法通过类名调用 AClass.staticMethod(); // 3.给这个类添加一个实例方法 AClass.prototype.instanceMethod = function () { alert("instanceMethod"); } // 实例方法通过类的实例调用 // 创建一个实例(创建一个对象) var a = new AClass(); // 通过实例调用实例方法 a.instanceMethod();
暂停或者恢复 jQuery.ready() 事件
true
或 false
js 原生 forEach 方法
forEach
方法只能遍历数组, 不能遍历伪数组
/* 第一个参数: 遍历到的元素 第二个参数: 当前遍历到的索引*/var arr = [1, 3, 5, 7, 9];var obj = { 0:1, 1:3, 2:5, 3:7, 4:9, length:5}; arr.forEach(function (value, index) { console.log(index, value);});obj.forEach(function (value, index) { console.log(index, value);// 报错});
jQuery 的 each 静态方法
遍历对象或数组(伪数组)
统一遍历对象和数组
的方式回调参数的顺序
更符合我们的思维模式// 1.利用jQuery的each静态方法遍历数组/*第一个参数: 当前遍历到的索引第二个参数: 遍历到的元素*/$.each(arr, function (index, value) { console.log(index, value);});$.each(obj, function (index, value) { console.log(index, value);});
js 原生 map 方法
不能遍历的伪数组
jQuery 的 map 方法
遍历对象或数组
新的数组
返回$(function () { // 4.1遍历数组 var arr = [1, 3, 5, 7, 9]; // 4.1.1通过原生方法遍历数组 // 第一个回调函数参数是遍历到的元素 // 第二个回调函数参数是当前遍历的索引 // 第三个回调函数参数是当前被遍历的数组 // 返回值: 将回调函数返回值收集起来组成一个新的数组 var res = arr.map(function (ele, idx, arr) { console.log(idx, ele, arr); return ele + idx; }); console.log(res); // 4.1.2通过jQuery静态方法遍历数组 // 第一个回调函数参数是遍历到的元素 // 第二个回调函数参数是当前遍历的索引 // 返回值: 将回调函数返回值收集起来组成一个新的数组 var $res2 = $.map(arr, function (ele,idx) { console.log(idx, ele); return ele + idx; }); console.log($res2); // 4.2遍历对象 var obj = { name: "lnj", age:"33", gender:"male"}; /* obj.map(function (ele, idx, obj) { // 报错,原生JS没有map方法 console.log(idx, ele, obj); }); */ var $res = $.map(obj, function (value, key) { console.log(key, value); return key + value; }); console.log($res); });
作用
返回符合一定条件的元素
规定一个条件
不符合条件
的元素将从选择中移除
符合条件
的元素将被返回
缩小
在被选元素组合中搜索元素的范围
返回带有类名 "intro" 的所有元素$("p").filter(".intro")
作用
返回
被选元素的后代元素
子、孙、曾孙
,依此类推
返回
each
静态方法默认的返回值就是遍历谁就返回谁
map
静态方法默认的返回值是一个空数组
each
静态方法不支持在回调函数中对遍历的数组进行处理
map
静态方法可以在回调函数中通过return对遍历的数组进行处理, 然后生成一个新的数组返回
作用
正则表达式
undefined或null
,则返回相应的"undefined"或"null"
内部属性[[Class]]
和一个浏览器的内置对象的 [[Class]]
相同,就返回相应的 [[Class]] 名字
$.type( undefined ) === "undefined"$.type() === "undefined"$.type( window.notDefined ) === "undefined"$.type( null ) === "null"$.type( true ) === "boolean"$.type( 3 ) === "number"$.type( "test" ) === "string"$.type( function(){ } ) === "function"$.type( [] ) === "array"$.type( new Date() ) === "date"$.type( new Error() ) === "error" // jQuery 1.9 新增支持$.type( /test/ ) === "regexp"
作用
去除字符串两端的空格
参数
需要去除空格的字符串
去除空格之后的字符串
$(function () { var str = " lnj "; console.log("---"+str+"---"); var $res = $.trim(str); console.log("---"+$res+"---");});
作用
判断
传入的对象是否是window对象
返回值 true / false
// 真数组var arr = [1, 3, 5, 7, 9];// 伪数组var arrlike = { 0:1, 1:3, 2:5, 3:7, 4:9, length:5};// 对象var obj = { "name":"lnj", age:"33"};// 函数var fn = function(){ };// window对象var w = window;var res = $.isWindow(w);console.log(res);
作用
判断
传入的对象是否是真数组
返回值 true / false
$(function () { // 对象 var obj = { name:"lnj",age: "33", gender:"male"}; // 真数组 var arr = [1, 3, 5, 7, 9]; var $res = $.isArray(obj); console.log($res);// false var $res2 = $.isArray(arr); console.log($res2);// true});
作用
返回
数组中指定元素的索引值
没有找到
,则返回-1
$(function () { var arr = [ 4, "Pete", 8, "John" ]; var $spans = $( "span" ); $spans.eq( 0 ).text( jQuery.inArray( "John", arr ) ); $spans.eq( 1 ).text( jQuery.inArray( 4, arr ) ); $spans.eq( 2 ).text( jQuery.inArray( "Karl", arr ) ); $spans.eq( 3 ).text( jQuery.inArray( "Pete", arr, 2 ) );})
作用
判断
传入的对象是否是一个函数
返回值: true / false
注意点
jQuery
框架本质上是一个函数
(function( window, undefined ) {})( window );
$(function () { var obj = { name:"lnj",age: "33", gender:"male"}; var arr = [1, 3, 5, 7, 9]; var fn = function () { } var $res = $.isFunction(obj); console.log($res);// false $res = $.isFunction(arr); console.log($res); $res = $.isFunction(fn); console.log($res); // 通过该方法验证了我们前面所说的,jQuery框架本质是一个匿名函数 $res = $.isFunction($); console.log($res);});
作用
$.parseJSON()
函数用于将符合标准格式的的JSON字符串转为与之对应的JavaScript对象
格式有误
的 JSON 字符串可能导致抛出异常
JSON标准不允许"控制字符"如制表符或换行符
解析一个 JSON 字符串$(function () { var obj = jQuery.parseJSON('{"name":"John"}'); alert( obj.name === "John" );})
作用
$.makeArray()
函数用于将一个类似数组的对象转换为真正的数组对象
注意
类数组
对象具有许多数组的属性(例如length
属性,[]数组访问运算符
等)缺少从数组的原型对象上继承下来的内置方法
(例如:pop()
、reverse()
等)将一个HTML元素集合转换成对应的数组$(function () { var elems = document.getElementsByTagName("div"); // 返回一个节点列表 var arr = jQuery.makeArray(elems); arr.reverse(); //对列表的元素使用一个数组方法 $(arr).appendTo(document.body);})
作用
jQuery.extend()
函数用于将一个或多个
对象的内容合并
到目标对象注意
$.extend()
指定了一个参数,则意味着参数target被省略
,此时,target就是jQuery对象本身
可以为全局对象 jQuery 添加新的函数
多个对象
具有相同的属性
,则后者会覆盖
前者的属性值作用
$.fn.extend()
函数为jQuery
扩展一个或多个
实例属性和方法
(主要用于扩展方法
)提示
jQuery.fn
是jQuery
的原型对象
,其extend()
方法用于为jQuery
的原型
添加新的属性和方法
jQuery实例对象上调用
Ajax: 异步刷新技术
无刷新
: 不刷新整个页面,只刷新局部
无刷新的好处
有效利用带宽
连续的用户体验
类似C/S的交互效果
,操作更方便
传统web | Ajax技术 |
---|---|
提交表单 方式发送请求 | 异步引擎对象 发送请求 |
响应内容是一个完整页面 | 响应内容只是需要的数据 |
需等待服务器响应完成并重新加载整个页面后 ,用户才能进行操作 | 可以动态更新页面中的部分内容 ,用户不需要等待请求的响应 |
传统方式实现Ajax的不足
不好记忆
步骤繁琐
浏览器兼容
问题“$”不需要选择器,这是工具方法
) $.ajax()
$.get()
$.post()
$.getJSON()
load()
$.ajax()
实现异步交互
$.ajax({ url: url, // 要提交的 URL 路径 type: "get", // 发送请求的方式 data: data, // 要发送到服务器的数据 dataType: "json" // 指定传输的数据格式 success: function(result){ // 请求成功后要执行的代码 }, error: function(){ // 请求失败后要执行的代码 }});
$.get()
实现异步交互
$.get(url,data,function(result){ // 省略将服务器返回的数据显示到页面的代码});// 以上代码等价于$.ajax({ url:url, data:data, type:"get", success: function(result) { //省略代码 }});
load()
实现异步交互
加载外部的页面文件到当前页面中
$("#nameDiv").load(url,data);// 以上代码等价于$.get(url,data,function(result){ $("#nameDiv").html(result);}
$.getJSON()
实现异步交互
仅限于JSON数据格式
$.getJSON(url,data, success(result) { //省略将服务器返回的数据显示到页面的代码});
跨域的限制
跨域的规定
URL | 原因 | 是否允许通信 |
---|---|---|
http://www.a.com/dir/b.html | 同一域名下 | 允许 |
http://www.a.com/dir2/c.html | 同一域名,不同文件夹 | 允许 |
http://www.a.com:81/dir/d.html | 同一域名,不同端口 | 不允许 |
https://www.a.com/dir/e.html | 同一域名,不同协议 | 不允许 |
http://71.23.92.77/dir/f.htmll | 域名和域名对应 ip | 不允许 |
http://script.a.com/g.html | 主域相同,子域不同 | 不允许 |
http://a.com/h.html | 同一域名,不同二级域名 (同上) | 不允许(cookie 这种情况下也不允许访问) |
http://www.cc.com/a.html | 主机名不同 | 不允许 |
服务器设置
允许跨域请求
代理设置
jsonp
script
可以跨域的特点dataType参数
jsonp参数
使用淘宝商品推荐的接口,实现模糊搜索功能
http://suggest.taobao.com/sug?code=utf-8&q=关键字&callback=cb
转载地址:http://pjqwi.baihongyu.com/