事件(下)

事件的传播行为

冒泡模式(默认模式)

当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window(从里到外触发)
event.bubbles(只读属性)

console.log(e.bubbles);//当前事件是否冒泡
<div>
<button>点我</button>
</div>
<script>
//点击按钮 先触发按钮的点击事件 然后触发div的点击事件 然后触发document的点击事件
document.onclick = function(){
console.log('文档被点击了');
}
document.querySelector('div').onclick = function(){
console.log('div被点击了');
}
document.querySelector('button').onclick = function(e){
console.log(e.bubbles);//当前事件是否冒泡
console.log('button被点击了');
}
</script>

阻止事件冒泡

方法

stopPropagation

e.stopPropagation() //阻止事件冒泡 常用的方法 兼容问题
属性

cancelBubble(兼容ie低版本的写法)

// 兼容写法 兼容ie8及以下
e.cancelBubble = true

兼容写法

//兼容写法
e.stopPropagation?e.stopPropagation():e.cancelBubble = true

捕获模式

从外到里触发

默认行为

1.某些操作或者html元素拥有的一些默认的行为(a 标签的默认行为 进行页面跳转 form里面submit行为
图片的拖动行为...)
2.在某些时候外面的默认行为会导致对应的代码执行出现问题,这个时候就需要禁止默认行为。

阻止默认行为

方法

preventDefault

//阻止默认行为
e.preventDefault();//大部分浏览器兼容
属性

兼容ie低版本的写法 returnValue

//兼容ie
e.returnValue = false //兼容ie

兼容写法

e.preventDefault?e.preventDefault():e.returnValue = false

return false

return false

事件监听器(兼容问题)

1.addEventListener 添加事件监听器(可以添加多个处理函数)
2.removeEventListener 移除事件监听器 (只能移除addEventListener添加的 移除根据对应的处理
函数是否为一个)

//我需要俩个处理函数 事件监听器 可以有多个处理函数
//监听对应的事件执行 来执行对应的处理函数 (不会覆盖之前的事件的处理函数)
//传入事件名 传入处理函数 (如果是直接传入function 就不会被移除)
btn.addEventListener('click',function(){
console.log('点击了按钮');
})
btn.addEventListener('click',function fn(){
console.log('点击了按钮1');
})
btn.addEventListener('click',handler1)
//移除事件监听器 必须处理函数是同一个 不然不能被移除 只能移除addEventListener添加的
btn.removeEventListener('click',function fn(){
console.log('点击了按钮1');
})//不能移除
btn.removeEventListener('click',handler1) //能
btn.removeEventListener('click',handler)//不能移除

拖拽

基础三大事件

  • 鼠标按下事件 (mousedown)
  • 鼠标移动事件 (mousemove)
  • 鼠标弹起事件 (mouseup)

在页面进行拖拽

步骤
  1. 给对应的盒子添加鼠标按下事件
  2. 在鼠标按下事件内容获取鼠标在对应盒子里面的位置 (offsetX)
  3. 在鼠标按下事件中给document添加移动事件
  4. 在移动的时候获取鼠标在页面上的位置(pageX)
  5. 计算对应的定位的位置 (鼠标在页面上的位置 - 鼠标在对应盒子内的位置)
  6. 设置对应的盒子的位置
  7. 在鼠标按下事件中给document添加弹起事件
  8. 在弹起事件内移除对应的移动事件
<div></div>
<script>
//获取div
var div = document.querySelector('div')
//在div里面按下
div.onmousedown = function(e){
e = e || window.event
//获取按下时 鼠标在对应盒子里面位置
var currentX = e.offsetX
var currentY= e.offsetY
//在文档里面移动
document.onmousemove = function(e){
//获取每次移动在页面上的位置 - 对应的按下时鼠标在盒子里面的位置 = 对应的定位的位
置
var targetX = e.pageX - currentX
var targetY = e.pageY- currentY
//设置给对应的盒子
div.style.left = targetX + 'px'
div.style.top = targetY + 'px'
}
//在文档里面弹起
document.onmouseup = function(){
document.onmousemove = null
}
}
</script>

在区间进行拖拽

offset家族(属性 元素对象)
  1. offsetParent 偏移父元素 (找离最近的定位父元素 如果没有定位就找body)
  2. offsetHeight 偏移元素的高度
  3. offsetWidth 偏移元素的宽度
  4. offsetLeft 离父元素偏移的左边的距离 (number类型)
  5. offsetTop 离父元素偏移的上边距离 (number类型)
<div class="outerBox">
<div class="box">
<div class="moveBox"></div>
</div>
</div>

<script>
//获取移动的盒子
var move = document.querySelector('.moveBox')
//获取区间的大盒子
var box = document.querySelector('.box')
//给移动的盒子添加按下事件
move.onmousedown = function (e) {
//获取在移动的盒子里面按下的位置
e = e || window.event
var currentX = e.offsetX
var currentY = e.offsetY
//给区间的大盒子添加移动
box.onmousemove = function (e) {
e = e || window.event
//设置move这个盒子在box里面定位
//鼠标在页面的位置 e.pageX - 大盒子在页面的位置 - 鼠标按下的位置 currentX
var distance = computedPointElementInPage(this)
//接收对应的设置的定位位置
var targetX = e.pageX - distance.left - currentX
var targetY = e.pageY - distance.top - currentY
//进行区间判断
//最大的移动距离X = 大盒子宽度 - 小盒子的宽度
var maxX = this.offsetWidth - move.offsetWidth
var maxY = this.offsetHeight - move.offsetHeight
//如果当前的定位位置比0还小 设置为0
if(targetX < 0){
targetX = 0
}
if(targetY < 0){
targetY = 0
}
//如果比最大值还大 就设置最大值
if(targetX > maxX){
targetX = maxX
}
if(targetY > maxY){
targetY = maxY
}
//位置设置
move.style.left = targetX + 'px'
move.style.top = targetY + 'px'
}
document.onmouseup = function(){
//清除大盒子的移动事件
box.onmousemove = null
}
}
//如果要找盒子在页面上的位置 那么外面要从自己的基于的父元素的距离 + 对应父元素基于他的父元
素距离 .. 直到找到body
//封装一个方法计算盒子在页面上的位置 传递一个盒子
function computedPointElementInPage(element) {
//封装一个距离对象 left离左边的 top离上边的
var distance = {
left: 0,
top: 0
}
//到了body就是null 到了body对应while循环就结束
while (element.offsetParent) {
//将对应的左边的距离一个个+
distance.left += element.offsetLeft
//将对应的上边的距离一个个+
distance.top += element.offsetTop
//进入到父元素
element = element.offsetParent
}
//将计算好的结果返回出去
return distance
}
</script>

样式获取

style属性 只能获取内嵌样式

var div = document.getElementsByTagName('div')[0]
//style的弊端 他只能获取对应的内嵌的样式 也就是只能获取style属性里面写的内容
console.log(div.style.width); //空字符串
console.log(div.style.height); //300px

getComputedStyle 方法可以获取所有的样式

//对应的兼容获取所有样式的方法
var style = getComputedStyle(div, '')
console.log(style); //getComputedStyle获取样式对象里面都有默认值(所有的样式)
console.log(style.backgroundColor);
console.log(style.color);
console.log(style.width);
console.log(style.height);

currentStyle ie的低版本兼容

console.log(div.currentStyle); //ie低版本兼容 废弃

兼容封装

// getComputedStyle 兼容问题
// console.log(div.currentStyle); //ie低版本兼容 废弃
//兼容写法 传入一个元素 返回一个样式对象
function getStyle(element) {
var style = window.getComputedStyle ? getComputedStyle(element, '') :
element.currentStyle
return style
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 事件的传播行为(事件流) 冒泡模式(默认模式) 冒泡模式就是从里到外触发 event.bubbles(只读属性) ...
    学习路上阅读 100评论 0 1
  • 事件(下) 事件对象 在事件对象中记录了很多事件的信息。。。 事件类型 e.type// 事件的类型 例: 按钮...
    新生勿扰阅读 271评论 0 0
  • 一、注册事件处理程序 注册事件处理程序有两种基本方式: (1)一种是给事件目标对象或文档元素设置属性。 按照约定,...
    蒜泥捣莓阅读 176评论 0 1
  • EVENT(下) 今天来聊一聊事件的执行机制 什么是事件的执行机制呢?思考一个问题?当一个大盒子嵌套一个小盒子的时...
    千锋HTML5学院阅读 500评论 0 5
  • 事件类型 UI事件 load:当页面完全加载后在window上面触发,当所有框架加载完成后在框架集上触发,图像加载...
    梨啊梨阅读 325评论 0 0