事件监听器
事件绑定 下面的会覆盖上面的!
div.onclick=function(){
alert(1);
}
div.onclick=function(){
alert(2);
}
事件名称 不需要加"on" 不会相互覆盖
div.addEventListener('click',function(){
alert(1);
});
div.addEventListener('click',function(){
alert(2);
});
取消事件监听器
function fn(){
alert('取消')
}
el.addEventListener('click',fn)
el.removeEventListener('click',fn)
事件冒泡

<body>
<div>
<p></p>
</div>
<script>
var div=document.querySelector('div');
var p=document.querySelector('p');
document.body.addEventListener('click',function(){
alert('body')
})
div.addEventListener('click',function(){
alert('div');
});
p.addEventListener('click',function(){
alert('p');
});
</script>
</body>
addEventListener('ev',fn,[,capture,{}])
默认第三个参数是flase(不捕获)
第四个参数还可以传递对象:{}
// capture:true/false 是否在捕获阶段执行
// once:true/false 只执行一次事件
// passive:false/true //阻止取消默认事件
这里的true表示不允许阻止(例如e.preventDefault())
div.addEventListener('click',function(){alert('div');},{once:true,passive:false});
p.addEventListener('click',function(){
alert('p');
});
取消事件冒泡
e.cancelBubble = true
e.stopPropagation()
事件委托

<body>
<div>
<ul>
<li>
<p></p>
</li>
<li>
<p></p>
</li>
<li>
<p></p>
</li>
<li>
<p></p>
</li>
</ul>
</div>
<script>
var ul=document.querySelector('ul');
ul.addEventListener('click',function(e){
if(e.target.tagName=='LI'){
e.target.style.background='yellow';
}
})
</script>
</body>
事件代理

<body>
<div class="box">
<input type="text" id="user" value="名字" />
<textarea id="message">加油</textarea>
<button id="btn">提交留言</button>
<ul id="list">
</ul>
</div>
<script>
// 给按钮添加点击事件
// 创建元素 并且插入到ul列表当中
var btn=document.querySelector('#btn')
var user=document.querySelector('#user')
var message=document.querySelector('#message')
var list=document.querySelector('#list')
// 将事件添加到父级身上 - 事件委托
list.addEventListener('click',function(e){
// e.target
if(e.target.className=='clos'){
var li=e.target.parentNode
// console.log(li)
list.removeChild(li)
}
})
btn.addEventListener('click',function(){
// 创建一个li
var li=document.createElement('li')
li.innerHTML=`
<h2 class="user">${user.value}说:</h2>
<p>${message.value}</p>
<a href="javascript:;" class="clos">删除<span>X</span></a>
`
list.insertBefore(li,list.children[0])
})
</script>
</body>
mouseout/mouseover
鼠标移入或者移出子元素范围mouseover和 mouseout会再次触发
mouseleave/mouseenter
mouseenter和mouseleave不受子级元素范围干扰
e.pageX/e.pageY
获取鼠标点击的位置(相对于页面左上角位置)
在页面有滚动的时候获取的也是相对于页面左上角位置
e.cilentX/e.clientY
获取鼠标点击的位置(相对于显示区域的位置)
在页面有滚动的时候获取的也是相对于显示页面左上角位置
鼠标滚轮事件
document.addEventListener('mousewheel',function(e){
console.log(e.wheelDelta)
})
document.addEventListener('DOMMouseScroll',function(e){
console.log(e.detail)
})
鼠标滚轮事件函数封装兼容浏览器
function toWheel(el,downFn,upFn){
el.addEventListener('mousewheel',function(e){
if(e.wheelDelta>0){
upFn&&upFn.call(el)
}else{
downFn&&downFn.call(el)
}
})
el.addEventListener('DOMMouseScroll',function(e){
if(e.detail>0){
downFn&&downFn.call(el)
}else{
upFn&&upFn.call(el)
}
})
}
自定义右键菜单
document.addEventListener('contextmenu',function(){
e.preventDefault()
alert(1);
})
阻止默认行为
方法一:
document.oncontextmenu=function(e){
return false;
}
双击事件
el.addEventListener('dblclick',function(){
alert('双击了')
})
拖拽案例

<style>
div{
width: 100px;
height: 100px;
background: red;
position: absolute;
}
</style>
var startPos={}
var boxPos={}
el.addEventListener('mousedown',function(e){
startPos.x=e.clientX;
startPos.y=e.clientY;
boxPos.x=css(div,'left')
boxPos.y=css(div,'top')
div.addEventListener('mousemove',function(e){
var nowPos={
x:e.clientX,
y:e.clientY
}
var dis={
x:nowPos.x-startPos.x,
y:nowPos.y-startPos.y
}
var newPos={
l:dis.x+boxPos.x,
t:dis.y+boxPos.y
}
css(div,'top',newPos.t)
css(div,'left',newPos.l)
})
})
keydown/keyup
document.addEventListener('keydown',function(){
console.log('键盘按下')
})
document.addEventListener('keyup',function(){
console.log('键盘抬起')
})
字符串拼接用法
if(e.keyCode == 38 && e.ctrlKey){
scale+=0.5
div.style.transform='scale('+scale+')'
}
表单方法
el.addEventListener('focus',function(){
console.log('获取焦点时')
})
el.addEventListener('change',function(){
console.log('内容改变时')
})
el.addEventListener('input',function(){
console.log('当内容修改时')
})
el.addEventListener('submit',function(e){
e.preventDefault();
console.log('提交事件')
})
el.addEventListener('reset',function(){
console.log('重置事件')
})
document.addEventListener('keydown',function(e){
if(e.keyCode == 13){
txt.blur();
}
})