一:注册事件(绑定事件)
注册事件有两种方式:
a.传统方式
b.方法监听注册方式
二:优缺点
a.传统注册:
- 利用on开头的事件 eg: onclick,onmouseove…
<button onclick="alert('hi~')" ></button>
btn.onclick = function() {}
- 特点:注册事件的唯一性
- 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数
b.方法监听注册:
- w3c 标准 推荐方式
- addEventListener() 是一个方法
- IE9之前的IE不支持此方法,可使用attachEvent()代替
- 特点:同一个元素同一个事件可注册多个事件(监听器)
- 按注册顺序依次执行
三:addEventListener()监听方式 (具有兼容性问题,IE9以上支持)
1.eventTarget.addEventListener(type, listener[, useCapture])
2.此方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数
- type: 事件类型字符串,如 click,mousedown(这里不需要带on)
- listener:事件处理函数,事件发生时,会调用该监听函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>传统方式</button>
<button>事件侦听方式</button>
<script>
// 1.传统方式
var btns = document.querySelectorAll('button');
btns[0].onclick = function() {
alert('1');
}
btns[0].onclick = function() {
alert('2');
}
// 只弹出第二个事件函数
// 2.事件侦听方法
btns[1].addEventListener('click', function() {
alert('11');
})
btns[1].addEventListener('click', function() {
alert('22');
})
</script>
</body>
</html>
四:删除事件(解绑事件)
4.1传统方式删除事件:
eventTarget.onclick = null;
4.2方法监听注册事件:
1.eventTarget.removeEventListener(type, listener[,useCapture]);
自学小demo:拖动模态框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>拖动模态框</title>
<style>
ul,
li,
ol,
dl,
dt,
dd,
div,
p,
span,
h1,
h2,
h3,
h4,
h5,
h6,
a {
margin: 0;
padding: 0;
}
a {
text-decoration: none;
color: #000;
}
.login-header {
width: 100%;
text-align: center;
font-size: 24px;
height: 30px;
line-height: 30px;
}
.login {
display: none;
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 512px;
height: 280px;
border: 1px solid #ebebeb;
background-color: #fff;
box-shadow: 0 0 20px #ddd;
z-index: 99;
}
.login-title {
position: relative;
width: 100%;
text-align: center;
height: 40px;
line-height: 40px;
font-size: 18px;
cursor: move;
}
.login-input-content {
margin-top: 20px;
}
.login-button {
width: 50%;
text-align: center;
line-height: 40px;
margin: 30px auto 0px auto;
font-size: 14px;
border: 1px solid #ebebeb;
}
.login-button a {
display: block;
}
.login-input input.list-input {
float: left;
line-height: 35px;
height: 35px;
width: 350px;
text-indent: 5px;
border: 1px solid #ebebeb;
}
.login-input {
/* 清除浮动 */
overflow: hidden;
margin: 0 0 20px 0;
}
.login-input label {
float: left;
width: 90px;
padding-right: 10px;
line-height: 35px;
text-align: right;
height: 35px;
font-size: 14px;
}
.login-bg {
display: none;
width: 100%;
height: 100%;
position: fixed;
left: 0;
top: 0;
background: rgba(0, 0, 0, .2);
}
.login-title span {
position: absolute;
right: -20px;
top: -30px;
width: 40px;
height: 40px;
font-size: 12px;
border-radius: 20px;
border: 1px solid #ebebeb;
background-color: #fff;
}
</style>
</head>
<body>
<!-- 标题 -->
<div class="login-header">
<a id="link" href="javascript:;">点击,弹出登录框</a>
</div>
<!-- 登录部分 -->
<div class="login" id="login">
<!-- 标题 -->
<div class="login-title" id="title">
登录会员
<span><a href="javascript:;" id="closeBtn" class="close-login">关闭</a></span>
</div>
<div class="login-input-content">
<!-- 用户名 -->
<div class="login-input">
<label for="">用户名:</label>
<input type="text" placeholder="请输入用户名" name="info[username]" id="username" class="list-input">
</div>
<!-- 登录密码 -->
<div class="login-input">
<label for="">登录密码:</label>
<input type="password" placeholder="请输入登录密码" name="info[password]" id="password" class="list-input">
</div>
<div class="login-button" id="loginBtn">
<a href="javascript:;" class="login-button-submit">登录会员</a>
</div>
</div>
</div>
<div class="login-bg" id="bg"></div>
<script>
// 需求一:显示隐藏登录和遮罩层模块
var link = document.querySelector('#link');
var closeBtn = document.querySelector('#closeBtn');
var login = document.querySelector('.login');
var mask = document.querySelector('.login-bg');
var title = document.querySelector('#title');
link.addEventListener('click', function() {
login.style.display = 'block';
mask.style.display = 'block';
})
closeBtn.addEventListener('click', function() {
login.style.display = 'none';
mask.style.display = 'none';
})
// 需求二: 拖动模态框: 鼠标按下获得鼠标在login中的坐标并保持不变 再鼠标移动, 获取login盒子距离页面的位置大小( 使用鼠标在页面的坐标减去鼠标在盒子内的坐标) 鼠标弹起不在拖动模态框
// 事件源是title
title.addEventListener('mousedown', function(e) {
var x = e.pageX - login.offsetLeft;
var y = e.pageY - login.offsetTop;
document.addEventListener('mousemove', move)
function move(e) {
// 注意此处勿忘记加单位px
login.style.left = e.pageX - x + 'px';
login.style.top = e.pageY - y + 'px';
}
// 鼠标弹起,解除鼠标移动事件
document.addEventListener('mouseup', function() {
document.removeEventListener('mousemove', move);
})
})
</script>
</body>
</html>
来源:CSDN
作者:T357
链接:https://blog.csdn.net/qq_45915768/article/details/104422360