Web页面经常需要和用户之间进行交互,而交互的过程中我们可能想要捕捉这个交互的过程:
原生事件监听方法:
jQuery事件监听方法:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<ul id="list" class="panel">
<li class="li-1">li-1li>
<li class="li-2">li-2li>
<li class="li-3">li-3li>
<li class="li-4">li-4li>
<li class="li-5">li-5li>
ul>
<button class="cancel">取消事件的监听button>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
// 监听事件
// 1.使用on来监听事件
$('ul').on('click', function() {
console.log('click1')
})
// 2.使用click来监听事件
$('ul').click(function() {
console.log('click2')
})
// 3.使用mouseenter来监听事件
$('ul').mouseenter(function() {
console.log('mouseenter')
})
// 取消监听事件
$('.cancel').click(function() {
// $('ul').off() // 取消ul元素上所有的事件
// $('ul').off('mouseenter')
$('ul').off('click')
})
// 使用程序-自动触发事件
// $('ul').trigger('click') // 模拟用户点击了ul元素
$('ul').trigger('mouseenter')
})
script>
body>
html>
click和on的区别:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<ul id="list" class="panel">
<li class="li-1">li-1li>
<li class="li-2">li-2li>
<li class="li-3">li-3li>
<li class="li-4">li-4li>
<li class="li-5">li-5li>
ul>
<button class="cancel">取消事件的监听button>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
// 监听事件
// 1.使用on来监听事件 ( 支持给事件添加命名空间: liujun )
$('ul').on('click.liujun', function() {
console.log('click1')
})
// 2.使用click来监听事件
$('ul').click(function() {
console.log('click2')
})
// 取消监听事件
$('.cancel').click(function() {
$('ul').off('click.liujun')
})
/*
1.on 监听的事件支持使用 命名空间
2.on 函数支持一个 selector 的参数
*/
// $('ul').on('click', '字符串类型的选择器', function() {
// })
})
script>
body>
html>
click和on的this指向:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<ul id="list" class="panel">
<li class="li-1">li-1li>
<li class="li-2">li-2li>
<li class="li-3">li-3li>
<li class="li-4">li-4li>
<li class="li-5">li-5li>
ul>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
// $('ul').click(function() {
// console.log("%O", this) // DOM Element -> UL
// })
// $('ul').on('click', function() {
// console.log(this) // DOM Element -> UL
// })
// $('ul li').click(function() {
// console.log(this) // DOM Element -> UL
// })
// 底层实现的原理
// var lisEl = $('ul li').get() // [li, li, li]
// for(var liEL of lisEl ){
// liEL.addEventListener('click', function() {
// console.log(this)
// })
// }
// $('ul li').click(function() {
// console.log( $(this) ) // DOM Element 转成 jQuery 对象
// })
$('ul li').click(() => {
console.log(this)
})
})
script>
body>
html>
我们会发现默认情况下事件是从最内层(如下图span)向外依次传递的顺序,这个顺序我们称之为事件冒泡(Event Bubble);
事实上,还有另外一种监听事件流的方式就是从外层到内层(如:body -> span),这种称之为事件捕获(Event Capture);
为什么会产生两种不同的处理流呢?
这是因为早期在浏览器开发时,不管是IE还是Netscape公司都发现了这个问题;
但是他们采用了完全相反的事件流来对事件进行了传递;
IE<9仅采用了事件冒泡的方式,Netscape采用了事件捕获的方式;
IE9+和现在所有主流浏览器都已支持这两种方式。
jQuery为了更好的兼容IE浏览器,底层并没有实现事件捕获。
jQuery事件系统的规范是根据W3C的标准来制定jQuery事件对象。原始事件对象的大多数属性都被复制到新的jQuery事件 对象上。如,以下原生的事件属性被复制到jQuery事件对象中: altKey, clientX, clientY, currentTarget, data, detail, key, keyCode, offsetX, offsetY, originalTarget, pageX, pageY, relatedTarget, screenX, screenY, target, …
jQuery事件对象通用的属性(以下属性已实现跨浏览器的兼容):
jQuery事件对象常用的方法:
preventDefault
() : 取消事件的默认行为(例如,a标签、表单事件等)。stopPropagation
() : 阻止事件的进一步传递(例如,事件冒泡)。要访问其它事件的属性,可以使用 event.originalEvent 获取原生对象。
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
.box{
width: 200px;
height: 200px;
background-color: pink;
}
.content{
display: inline-block;
width: 50px;
height: 50px;
background-color: green;
}
style>
head>
<body>
<div class="box">
div
<span class="content">spanspan>
div>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
// 1.获取原生的事件对象
// var divEl = document.querySelector('.box')
// divEl.addEventListener('click', function(event) {
// console.log(event)
// })
// 2.获取jQuery的事件对象
$('.box').click(function($event) {
console.log($event) // 是jQuery的事件对象
console.log($event.originalEvent) // 拿到原生的事件对象
})
})
script>
body>
html>
事件冒泡在某种情况下可以帮助我们实现强大的事件处理模式 – 事件委托模式(也是一种设计模式)
那么这个模式是怎么样的呢?
因为当子元素被点击时,父元素可以通过冒泡监听到子元素的点击;
并且可以通过event.target获取到当前监听事件的元素(event.currentTarget获取到的是处理事件的元素);
案例:一个ul中存放多个li,使用事件委托的模式来监听li中子元素的点击事件。
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
ul li.item {
width: 200px;
height: 80px;
margin-bottom: 10px;
background-color: #ccc;
}
style>
head>
<body>
<script src="./utils/jquery-3.7.1.min.js">script>
<script>
$(function () {
$('ul').on('click', 'li.item', function(event) {
console.log($(event.target).text()+"被点击了")
})
})
script>
<ul>
<li class="item">item1li>
<li class="item">item2li>
<li class="item">item3li>
<li class="item">item4li>
<li class="item">item5li>
ul>
body>
html>
鼠标事件(Mouse Events)
click
() 、.dblclick()、.hover
()、.mousedown() 、.mouseup()mouseenter
()、.mouseleave
()、.mousemove
()键盘事件(Keyboard Events)
keydown
() 、.keypress()、.keyup()文档事件(Document Loading Events)
ready
()、.unload表单事件(Form Events)
blur
() 、.focus
()、.change
()、.submit()、.select()浏览器事件(Browser Events)
resize
()、.scroll()DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<ul id="list" class="panel">
<li class="li-1">li-1li>
<li class="li-2">li-2li>
<li class="li-3">li-3li>
<li class="li-4">li-4li>
<li class="li-5">li-5li>
ul>
<input type="text">
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
// on('hover', func)
// 1.hover 底层使用的是: mouseenter or mouseleaver
// $('ul').hover(function() {
// console.log('鼠标悬浮在ul')
// }, function() {
// console.log('鼠标离开在ul')
// })
// 2.监听浏览器resize事件 ( throttle 节流 )
// on('resize', func)
$(window).resize(function() {
console.log('resize')
})
// 3.表单事件
$('input').focus(function() {
console.log('input focus事件')
})
$('input').blur(function() {
console.log('input blur事件')
})
// input ( debounce 防抖操作 )
$('input').on('input', function() {
// console.log( $('input').val() )
console.log( $(this).val() )
})
})
script>
body>
html>
mouseenter()和mouseleave()
mouseover()和mouseout()
事件的执行顺序是 keydown()、keypress()、keyup()
我们可以通过key和code来区分按下的键:
表单事件(Form Events)
).animate(): 执行一组 CSS属性的自定义动画,允许支持数字的CSS属性上创建动画。
自定义修改宽高度动画
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
.box{
width: 200px;
height: 100px;
background-color: pink;
}
style>
head>
<body>
<button class="hide">隐藏button>
<button class="show">显示button>
<div class="box">
box
div>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
$('.hide').click(function() {
// 需要一个隐藏的动画
$('.box').animate({
height: 0, // 100px -> 0px
width: 0, // 200px -> 0px
opacity: 0 // 1 -> 0
},2000, 'swing' , function() {
console.log('动画执行完毕之后会回调')
})
})
$('.show').click(function() {
$('.box').animate({
height: 100,
width: 200,
opacity: 1
}, function() {
console.log('动画执行完毕之后会回调')
})
// $('.box').animate({
// height: 100,
// width: 200,
// opacity: 1
// }, 2000, 'swing', function() {
// console.log('动画执行完毕之后会回调')
// })
// $('.box').animate({
// height: 100,
// width: 200,
// opacity: 1
// }, {
// duration: 'slow',
// complete: function() {
// console.log('动画执行完毕之后会回调')
// }
// })
})
})
script>
body>
html>
显示和隐藏匹配的元素
淡入淡出
.fadeIn()、.fadeIn( [duration ] [, complete ] )、.fadeIn( options ) - 淡入动画
.fadeOut()、.fadeOut( [duration ] [, complete ] )、.fadeOut( options ) -淡出动画
.fadeToggle()、.fadeToggle( [duration ] [, complete ] )、.fadeToggle( options ) - 淡入淡出的切换
.fadeTo( duration, opacity [, complete ] ) - 渐变到
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
body{
height: 200px;
}
.box{
width: 200px;
height: 100px;
background-color: pink;
}
style>
head>
<body>
<button class="hide">隐藏button>
<button class="show">显示button>
<button class="toggle">切换button>
<div class="box">
box
div>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
$('.hide').click(function() {
$('.box').hide('slow', function() {
console.log('动画执行完成')
})
})
$('.show').click(function() {
$('.box').show('fast', function() {
console.log('动画执行完成')
})
})
$('.toggle').click(function() {
// $('.box').toggle(2000)
$('.box').toggle({
duration: 3000,
complete: function() {
console.log('动画执行完成')
}
})
})
})
script>
body>
html>
jQuery匹配元素中的animate和delay动画是通过一个动画队列
(queue)来维护的。例如执行下面的动画都会添加到动画队列中:
.queue():查看当前选中元素中的动画队列。
.stop( [clearQueue ] [, jumpToEnd ] ):停止匹配元素上当前正在运行的动画。
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
.box{
position: relative;
width: 100px;
height: 100px;
background-color: pink;
}
style>
head>
<body>
<button class="start">开始动画button>
<button class="stop">停止动画button>
<button class="queue">查看动画队列button>
<div class="box">boxdiv>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
var $box = $('.box')
$('.start').click(function() {
$box.animate({
top: 100
}, 5000)
$box.animate({
left: 100
}, 5000)
$box.animate({
top: 0
}, 5000)
$box.animate({
left: 0
}, 5000)
})
$('.queue').click(function() {
console.log( $box.queue() ) // 查看动画队列 fx
})
$('.stop').click(function() {
// $box.stop() // 停止 fx 动画队列( 停止当前执行的动画,还会继续执行动画队列中其它的动画 )
// stop(false, false) 默认值
// $box.stop(true) // 停止所有的动画, 清空了动画队列
// $box.stop(true, true) // 清空了动画队列, 立即执行完当前的动画
})
})
script>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
.box{
position: fixed;
bottom: 0;
right: 0;
}
img{
vertical-align: bottom;
}
.close{
position: absolute;
top: 0;
right: 0;
width: 25px;
height: 25px;
cursor: pointer;
/* border: 1px solid red; */
}
style>
head>
<body>
<div class="box">
<span class="close">span>
<div class="top">
<img src="./images/top.png" alt="">
div>
<div class="bottom">
<img src="./images/bottom.png" alt="">
div>
div>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
$('.close').click(function() {
$('.bottom').animate({height: 0}, 600, function() {
$('.box').animate({width: 0}, 600, function() {
$('.box').css('display', 'none')
})
})
})
})
script>
body>
html>
.each( function ): 遍历一个 jQuery 对象,为每个匹配的元素执行一个回调函数。
jQuery.each( array | object , callback ) : 一个通用的迭代器函数,可以用来无缝地迭代对象和数组。
array参数:支持数组(array)或者类数组(array-like),底层使用for循环 。
object参数: 支持普通的对象 object 和 JSON对象等,底层用for in循环。
function 参数:
.each() 和 jQuery.each()函数的区别:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<ul id="list" class="panel">
<li class="li-1">li-1li>
<li class="li-2">li-2li>
<li class="li-3">li-3li>
<li class="li-4">li-4li>
<li class="li-5">li-5li>
ul>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
// 1.遍历jQuery对象 ( 已经实现了迭代器协议 for of )
// 对象中的 each 底层调用的 jQuery函数上的each方法
$('ul li').each(function(index, element) { // [].forEach( func(element, index, array ))
console.log(index, element)
})
console.log("%O", $('ul') )
// 2.使用 for of
})
script>
body>
html>
在前端页面开发中,如果页面中的数据是需要动态获取或者更新的,这时我们需要向服务器发送异步的请求来获取数据,然后在无需刷新页面的情况来更新页面。那么这个发起异步请求获取数据来更新页面的技术叫做AJAX
。
AJAX全称(Asynchronous JavaScript And XML),是异步的 JavaScript 和 XML,它描述了一组用于构建网站和Web应用程序的开发技术。
异步
”特性。也就是说它可以在不重新刷新页面的情况下与服务器通信,交换数据,或更新页面。AJAX请求方法(Method)
jQuery中也有AJAX模块,该模块是在XMLHttpRequest的基础上进行了封装,语法(Syntax)如下:
$.ajax( [settings ] ) - 默认用 GET 请求从服务器加载数据, 会返回jQXHR对象,可以利用该对象的abort方法来取消请求。
$.get( url [, data ] [, success ] [, dataType ] ) - 发起GET请求,底层调用的还是$ajax()
$.post( url [, data ] [, success ] [, dataType ] ) - 发起POST请求,底层调用的还是$ajax()
初体验jQuery中的AJAX
请求参数(Parameters)
url
- 指定发送请求的 URL。method / type
- 用于指定请求的类型 (e.g. “POST”, “GET”, “PUT”),默认为GETdata
- 指定要发送到服务器的数据(PlainObject or String or Array)processData
:当data是一个对象时,jQuery 从对象的键/值对生成数据字符串,除非该processData选项设置为false. 例如,{ a: “bc”, d: “e,f” }被转换为字符串"a=bc&d=e%2Cf",默认为true。header
- 请求头的内容(PlainObject)contentType
- 默认值:application/x-www-form-urlencoded; charset=UTF-8,向服务器发送数据时指定内容类型。
timeout
- 请求超时时间。它以毫秒为单位。success
- 请求成功回调的函数error
- 请求失败回调的函数DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<ul id="list" class="panel">
<li class="li-1">li-1li>
<li class="li-2">li-2li>
<li class="li-3">li-3li>
<li class="li-4">li-4li>
<li class="li-5">li-5li>
ul>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
// console.log(encodeURIComponent('天河公园'))
// 1.url 添加查询字符串
// $.ajax({
// url: 'http://httpbin.org/get?cityId=404100&keyWord=天河公园',
// method: "GET",
// success: function(res) {
// console.log(res)
// }
// })
// 2.支持在data中提交参数
// $.ajax({
// url: 'http://httpbin.org/get',
// method: "GET",
// data: {
// cityId: '504100',
// keyWord: '小蛮腰'
// },
// success: function(res) {
// console.log(res)
// }
// })
// 3.给 get请求添加请求头
// $.ajax({
// url: 'http://httpbin.org/get',
// method: "GET",
// data: {
// cityId: '504100',
// keyWord: '小蛮腰'
// },
// headers: { // 比如你登录成功之后,后台会返回一个 token
// accessToken: 'aaaaabbbbbcccccc'
// },
// success: function(res) {
// console.log(res)
// }
// })
// 4.get简写
$.get('http://httpbin.org/get')
.then(function(res) { // jQuery 1.8 ; done
console.log(res)
})
.catch(function() { // fail
console.log('catch')
})
.always(function() { // finally
console.log('always')
})
})
script>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<ul id="list" class="panel">
<li class="li-1">li-1li>
<li class="li-2">li-2li>
<li class="li-3">li-3li>
<li class="li-4">li-4li>
<li class="li-5">li-5li>
ul>
<script src="../libs/jquery-3.6.0.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
// 1. 在url中提交查询字符串(比较少见)
// $.ajax({
// url: 'http://httpbin.org/post?cityId=404100&keyWord=天河公园',
// method: "POST",
// success: function(res) {
// console.log(res)
// }
// })
// 2. 在data中提交查询字符串
// $.ajax({
// url: 'http://httpbin.org/post',
// method: "POST",
// data: {
// cityId: '504100',
// keyWord: '小蛮腰'
// },
// // contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
// // dataType: 'json', // 自动推断, response content-type
// success: function(res) {
// console.log(res)
// }
// })
// 3. 在data中 JSON 字符串
// $.ajax({
// url: 'http://httpbin.org/post',
// method: "POST",
// data: JSON.stringify({
// cityId: '504100',
// keyWord: '小蛮腰'
// }),
// contentType: 'application/json; charset=UTF-8',
// success: function(res) {
// console.log(res)
// }
// })
// 4. 在data中 FormData
// var formData = new FormData() //
// formData.append('cityId', 404100)
// formData.append('keyWord', '小蛮腰')
// // formData.append('file', 文件)
// $.ajax({
// url: 'http://httpbin.org/post',
// method: "POST",
// data: formData,
// processData: false, // processData:true, 会将data为对象的转成查询字符串
// contentType: false, // 使用 原生 XHR 默认的 contentType
// success: function(res) {
// console.log(res)
// }
// })
// 5. 在添加请求头
// var formData = new FormData()
// formData.append('cityId', 404100)
// formData.append('keyWord', '小蛮腰')
// $.ajax({
// url: 'http://httpbin.org/post',
// method: "POST",
// data: formData,
// processData: false, // processData:true, 会将data为对象的转成查询字符串
// contentType: false, // 使用 原生 XHR 默认的 contentType
// headers: {
// liujunToken: 'xxxxxxxsssssssssssd'
// },
// success: function(res) {
// console.log(res)
// }
// })
// 6. POST简写
$.post('http://httpbin.org/post', {
cityId: '504100',
keyWord: '小蛮腰'
})
.then(function(res) {
console.log(res)
})
})
script>
body>
html>
在我们开发时,有时候jQuery提供的方法并不能满足我们的需求。如果我们想给jQuery扩展一些其它的方法,那这种情况下, 可能需要编写一个插件。
编写jQuery 插件的步骤:
案例:开发一个 jquery.showlinklocation.js 的插件。
;(function(window, $) {
// 1.在jquery的原型上添加了一个 showlinklocation
// $.fn.showlinklocation = function() {
// console.log(this) // jQuery对象
// this.append('(http://www.liujun.com)')
// }
// 2.需要过滤出a元素
// $.fn.showlinklocation = function() {
// console.log(this) // jQuery对象
// this.filter('a').append('(http://www.liujun.com)')
// }
// 3.需要遍历a元素
$.fn.showlinklocation = function() {
console.log(this) // jQuery对象
this.filter('a').each(function() {
var $a = $(this) // DOM Element
var link = $a.attr('href')
$a.append(`(${link})`)
})
return this
}
//
})(window, jQuery)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<ul id="list" class="panel">
<li class="li-1">li-1li>
<li class="li-2">li-2li>
<li class="li-3">li-3li>
<li class="li-4">li-4li>
<li class="li-5">li-5li>
ul>
<a href="https://www.jd.com">京东商城a>
<a href="https://www.taobao.com">淘宝商城a>
<a href="https://www.biyao.com">必要商城a>
<script src="../libs/jquery-3.6.0.js">script>
<script src="./utils/jquery.showlinklocation.js">script>
<script>
// 1.监听文档完全解析完成
$(function() {
$('a').showlinklocation().css('color', 'red')
})
script>
body>
html>