事件处理
事件
发生在HTML元素上的事情,可以是用户行为,也可以是浏览器的行为
- 用户点击了某个HTML元素
- 用户将鼠标移动到某个HTML元素上
- 用户输入数据时光标离开
- 页面加载完成
事件源:时间触发的源头,即触发事件的元素,如按钮,输入框,超链接
事件对象:当一个事件发生时,这个事件相关的详细信息会被保存到一个对象中,称为event对象
事件监听:监听事件的发生,绑定事件函数,当事件触发后执行该事件函数,即回调函数
绑定事件
三种方式:
- 静态绑定,通过为标签的事件属性赋值
<input type="button" value="按钮" onclick="fn()">
- 动态绑定,通过为DOM对象的事件属性赋值
<script>
var btn = document.getElementById("btn")
btn.onclick = function(){
console.log('动态绑定')
}
</script>
</head>
<body>
<input type="button" value="按钮" id="btn">
</body>
- 动态绑定 通过DOM对象进行事件监听,使用addEventistene(“时间名”,回调函数)
<script>
var btn = document.getElementById("btn")
btn.addEventListener ('click' function(){
console.log('动态绑定')
})
</script>
</head>
<body>
<input type="button" value="按钮" id="btn">
</body>
事件对象
<script>
window.onload=function(){
var btn = document.getElementById("btn")
btn.onclick=function(event){ //事件触发时会自动为回调函数传入一个参数,表示event事件对象
console.log(event,typeof event,event,type)
console.log(this==event.target) //this表示事件源
}
}
function f1(e) {
console.log(e)
}
</script>
</head>
<body>
<input type="button" value="按钮" id="btn">
//静态事件绑定 需要在绑定事件回调函数时接收时间对象参数
<button onclick="f1(event)">click me</button>
</body>
注意
可以通过事件回调函数的第一个参数获取事件对象event
target 事件的目标元素,即事件源
type 事件类型
timestamp 事件生成的日期和时间
clientX 当事件被触发时,鼠标指针的水平坐标
clientY 当事件被触发时,鼠标指针的垂直坐标
鼠标事件
时间名 | 描述 |
---|---|
onclick | 鼠标单击 |
ondbclick | 鼠标双击 |
onmouseover | 鼠标移到某元素之上 |
onmouseout | 鼠标从某元素上移开 |
onmouseup | 鼠标按键被松开 |
onmousedown | 鼠标按键被按下 |
onmousemove | 鼠标被移动 |
<script>
window.onload = function() {
var btn = document.getElementById('btn')
// btn.onclick=function(){
btn.onmouseover = function() {
console.log('点击事件')
}
}
</script>
</head>
<body>
<input type="button" value="按钮" id="btn">
</body>
键盘事件
事件名 | 描述 |
---|---|
onkeydown | 某个键盘的健被按下 |
onkeyup | 某个键盘的键被松开 |
onkeypress | 某个键盘的键被按下去且松开 |
<script>
window.onload = function() {
var username = document.getElementById('username')
username.onkeydown = function() {
console.log('111')
}
username.onkeypress = function() {
console.log('222')
}
username.onkeyup = function() {
console.log('333')
}
// 获取事件对象
username.onkeyup = function(e) {
console.log(e)
}
}
</script>
</head>
<body>
<input type="button" value="按钮" id="btn"> 用户名:
<input type="text" id="username">
</body>
示例
按回车的时候再控制台输出
<script>
window.onload = function() {
var username = document.getElementById('username')
username.onkeyup = function(e) {
//按键码
if (e.keyCode == 13) {
console.log(e.keyCode)
}
}
}
</script>
</head>
<body>
<input type="button" value="按钮" id="btn"> 用户名:
<input type="text" id="username">
</body>
表单事件
事件名 | 描述 |
---|---|
onfocus | 元素获得焦点 |
onblur | 元素失去焦点 |
onchange | 域的内容发生改变,一般用于文件选择器和下拉列表 |
onselect | 文本内容被选中 |
onsubmit | 表单提交时触发,回调函数返回true表示允许表单提交,返回false表示阻止表单提交 |
onfocus onblur
示例
<script>
window.onload = function() {
// var username = document.getElementById('username')
// username.onfocus = function() {
// username.classList.add('border')
// }
document.getElementById('username').onfocus=function(){
//this 指事件源
this.classList.add('border')
}
username.onblur = function() {
username.classList.remove('border')
}
}
</script>
<style>
#username {
outline: 0;
}
.border {
border: 1px solid red;
}
</style>
</head>
<body>
<input type="button" value="按钮" id="btn"> 用户名:
<input type="text" id="username">
</body>
点击输入框获取焦点,离开输入框失去焦点,进而触发事件,比较常用
onchange
<script>
window.onload = function() {
document.getElementById('pro').onchange = function() {
console.log(this.checked)
}
}
</script>
</head>
<body>
爱好:<input type="checkbox" name="hobby" id="pro" value="pro" checked>
</body>
示例2
头像设置
<script>
window.onload = function() {
document.getElementById('pro').onchange = function() {
// console.log(this.files[0]) //获取选择的文件数据
//可以自动获取用户更换图片的路径
document.getElementById('image').src = window.URL.createObjectURL(this.files[0])
}
}
</script>
<style>
#image {
width: 120px;
height: 120px;
}
#pro {
display: none;
}
</style>
</head>
<body>
头像:<input type="file" id="pro" multiple>
<label for="pro">
<img src="../images/baidu.png" id="image">
</label>
</body>
默认的baidu图片换成当前的1
onselect
文本选中
<style>
#email {
outline: 0;
}
.border {
border: 1px solid red;
}
</style>
<script>
window.onload = function() {
document.getElementById('email').onselect = function() {
this.classList.add('border')
}
}
</script>
</head>
<body>
邮箱:<input type="text" id="email" value="xxx.com">
</body>
onsubmit
<script>
window.onload = function() {
document.getElementById('frm').onsubmit = function() {
//判断表单内容是否符合要求
var email = document.getElementById('email').value
if (email == '') {
return false
}
return true
}
}
</script>
<body>
<form action="" id="frm">
用户名: <input type="text" id="username"><br> 邮箱:
<input type="text" id="email" value="xxx.com" name="email"><br>
<input type="submit" value="提交">
</form>
</body>
案例:实现复选框
<script>
window.onload = function() {
//实现全选和取消全选效果
var all = document.getElementById('all');
all.onchange = function() {
var items = document.getElementsByName('item')
for (var item of items) {
// 点击全选按钮,将时间源的改变属性赋值给其他复选框
item.checked = this.checked;
}
}
// 实现当选中下面所有复选框时自动选中全选
var items = document.getElementsByName('item')
for (var item of items) {
item.onchange = function() {
//先默认选中全选
all.checked = true
//判断只要有一个没选中,则不勾选全选
for (var ele of items) {
if (!ele.checked) {
all.checked = false
break
}
}
}
}
}
</script>
</head>
<body>
<table id="mytal">
<thead>
<tr>
<th>全选 <input type="checkbox" id="all"></th>
<th>序号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>爱好</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox" name="item"></td>
<td>1</td>
<td>jibu</td>
<td>age</td>
<td>male</td>
<td>eat</td>
</tr>
<tr>
<td><input type="checkbox" name="item"></td>
<td>1</td>
<td>jibu</td>
<td>age</td>
<td>male</td>
<td>eat</td>
</tr>
<tr>
<td><input type="checkbox" name="item"></td>
<td>1</td>
<td>jibu</td>
<td>age</td>
<td>male</td>
<td>eat</td>
</tr>
</tbody>
</table>
</body>
事件操作
事件流
概念:当一个HTML元素产生事件时,该事件会在当前元素与根元素之间按特定的顺序传播,所有经过的节点都会收到该事件并执行,这个传播过程就是DOM事件流
分类:事件冒泡,事件捕获。
- 事件冒泡:当一个元素上的事件被触发时,事件从事件源开始,往上冒泡直到页面的根元素,这一过程被称为事件冒泡(默认方式)
- 事件捕获:当一个元素上的事件被触发时,事件从页面根元素开始,往下直到事件目标元素,这一过程被称为事件捕获
事件冒泡示例:
<script>
function test(name) {
console.log(name)
}
</script>
<style>
div {
border: 1px solid black;
}
.div1 {
width: 200px;
height: 200px;
}
.div2 {
width: 150px;
height: 150px;
}
.div3 {
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="div1" onclick="test('div1')"> div1
<div class="div2" onclick="test('div2')"> div2
<div class="div3" onclick="test('div3')">div3 </div>
</div>
</div>
</body>
事件捕获
<script>
function $(id) {
return document.getElementById(id)
}
window.onload = function() {
$('div1').addEventListener('click', function() {
console.log('div1')
}, true) //第三个参数为true表示采用事件捕获,默认为false表示事件冒泡
$('div2').addEventListener('click', function() {
console.log('div2')
}, true)
$('div3').addEventListener('click', function() {
console.log('div3')
}, true)
}
</script>
<style>
div {
border: 1px solid black;
}
#div1 {
width: 200px;
height: 200px;
}
#div2 {
width: 150px;
height: 150px;
}
#div3 {
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="div1"> div1
<div id="div2"> div2
<div id="div3">div3 </div>
</div>
</div>
</body>
阻止事件冒泡
<script>
function $(id) {
return document.getElementById(id)
}
window.onload = function() {
$('div1').addEventListener('click', function() {
console.log('div1')
}, false) //第三个参数为true表示采用事件捕获,默认为false表示事件冒泡
$('div2').addEventListener('click', function(event) {
console.log('div2')
event.stopPropagation(); //阻止事件冒泡
}, false)
$('div3').addEventListener('click', function() {
console.log('div3')
}, false)
}
</script>
<style>
div {
border: 1px solid black;
}
#div1 {
width: 200px;
height: 200px;
}
#div2 {
width: 150px;
height: 150px;
}
#div3 {
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="div1"> div1
<div id="div2"> div2
<div id="div3">div3 </div>
</div>
</div>
</body>
点击div3,执行到div2停止,不让其冒泡
事件代理/事件委托
概念:利用事件冒泡/事件捕获机制,通过给父元素绑定事件,从而实现对所有子元素的事件管理,无需为每个子元素绑定事件
优点:
1)减少事件注册,降低内存占有
2)新增元素时实现动态绑定事件
<script>
window.onload = function() {
var lis = document.querySelectorAll('li')
for (var li of lis) {
li.onclick = function() {
console.log(this)
}
}
}
function add() {
var li = document.createElement('li')
li.innerText = 'li5'
document.querySelector('ul').appendChild(li)
}
</script>
</head>
<body>
<button onclick="add()">添加li</button>
<ul>
<li>li1</li>
<li>li2</li>
<li>li3</li>
<li>li4</li>
</ul>
</body>
新增的元素需要手动绑事件
<script>
window.onload = function() {
// var lis = document.querySelectorAll('li')
// for (var li of lis) {
// li.onclick = function() {
// console.log(this)
// }
// }
// 这里的e指的是点击的li而非ul
document.querySelector('ul').onclick = function(e) {
console.log(e.target.innerText)
}
}
function add() {
var li = document.createElement('li')
li.innerText = 'li5'
// li.onclick = function() {
// console.log(this)
// }
document.querySelector('ul').appendChild(li)
}
</script>
</head>
<body>
<button onclick="add()">添加li</button>
<ul>
<li>li1</li>
<li>li2</li>
<li>li3</li>
<li>li4</li>
</ul>
</body>
利用事件冒泡原理,给其父元素绑定事件,如此不用给子元素单个绑定事件
这里需要注意一点:之前的理解是this==e.target,但是在这里不是,这里this还是指事件源ul,而e代表的是点击的元素
事件默认行为
概念:当一个事件发生时浏览器自己会默认做的失去,如:点击连接时默认会跳转,邮件点击时默认会弹出菜单
阻止事件的默认行为:e.preventDefault()
<script>
function print(e) {
console.log(111)
e.preventDefault(); //阻止事件默认行为
}
</script>
</head>
<body>
<button oncontextmenu="print(event)">右键点击</button>
<br>
<a href="https://www.baidu.com" onclick="print(event)">百度</a>
<a href="javascript:print(event)" onclick="print(event)">百度</a>
</body>
上面的示例:超链接默认会跳转,这里阻止其默认行为