day12 事件下

事件的传播行为(事件流)

冒泡模式(默认模式)

冒泡模式就是从里到外触发 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() //阻止事件冒泡 常用的方法 兼容问题
  • 兼容ie低版本的写法 cancelBubble (属性)

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

兼容写法

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

捕获模式

捕获模式就从外到里触发

默认行为

某些操作或者html元素拥有的一些默认的行为(a 标签的默认行为 进行页面跳转 form里面submit行为 图片的拖动行为...)

在某些时候外面的默认行为会导致对应的代码执行出现问题,这个时候就需要禁止默认行为。

阻止默认行为

  • preventDefault (方法)

//阻止默认行为
e.preventDefault();//大部分浏览器兼容
  • 兼容ie低版本的写法 returnValue 属性

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

兼容写法

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

return false

事件监听器(兼容问题)

  • addEventListener 添加事件监听器(可以添加多个处理函数)

  • 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)//不能移除

拖拽

基础三大事件

  1. 鼠标按下事件 (mousedown)

  2. 鼠标移动事件 (mousemove)

  3. 鼠标弹起事件(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家族(属性 元素对象)

  • offsetParent 偏移父元素 (找离最近的定位父元素 如果没有定位就找body)

  • offsetHeight 偏移元素的高度

  • offsetWidth 偏移元素的宽度

  • offsetLeft 离父元素偏移的左边的距离 (number类型)

  • 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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
明日问题的输入事件与输出事件为: | Input Events | Node Output Event description Node . e0: start program event 1 e7: Welcome message 2 e1: center a valid month 6e8: print today's date 4 e2: enter an invalid month 67| e9: print tomorrow's date 6 e3: enter a valid day 69 e10: "month OK" 39 e4: enter an invalid day 69 e11: "month out of range" 41 e5: enter a valid year 71 e12: "day OK" 4 e6: enter an invalid year 71 e13: "day out of range" 4S e14: "year OK" 54 e15: "year out of range" 5( e16: "Date OK" 6C e17: "please enter a valid date" 62 e18: "enter a month" 6( e19: "enter a day" 68 e20: "enter a year" 70 c21: "Day is month, day, year" 8S 在下表中,ASF-6对应的输入事件为: 输出事件 ASF-7对应的输入事件为: 输出事件 为:_ ASF-8对应的输入事件为:_, 输出事件 为:_ ASF-9对应的输入事件为:_,输 出事件 为:_ Atomic System Function Inputs Outputs L ASF-1 start program e0 e7 | ASF-2 enter a date with an invalid month, valid day and valid year e2, e3,e5 e11,e12,e14,e17 | ASF-3 enter a date with an invalid day, valid month and validyear| e1, c4,e5 e10,e13,e14,e17 | ASE-4 enter a date wih an ivalid year, valid day and valid monh| el,e3, c6 e10,e12, el5,e17| ASF-5 enter a date with valid month, day, and year e1,e3,e5 . e10, e12, e14, e16, c21 | ASIF-6 enter a date with valid month, day and year invalid ASF-7 enter a date with valid day, month and year invalid ASF-8 enter a date with valid year, day and month invalid ASF-9 enter a date with invalid month, day, year
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值