事件(下)

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

1.冒泡模式

概述:冒泡模式就是事件从里到外进行依次触发。(默认模式)

  • event.bubbles 查看事件是否冒泡(这是只读属性,不能改)
    e.stopPropagation() //阻止事件冒泡 常用的方法 兼容问题
    阻止事件冒泡:
  • stopPropagation (方法)
    e.stopPropagation() //阻止事件冒泡 常用的方法 兼容问题
  • cancelBubble (属性),这是兼容ie低版本的写法
    e.stopPropagation?e.stopPropagation():e.cancelBubble = true //兼容ie低版本的写法
    兼容写法(推荐使用这种写法)
    e.stopPropagation?e.stopPropagation():e.cancelBubble = true //兼容写法

2.捕捉模式

概述:捕捉模式就是事件从外到里进行依次触发。

默认行为

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

  • preventDefault (方法)
    e.preventDefault();//大部分浏览器兼容
  • returnValue (属性),这是兼容ie低版本的写法
    e.returnValue = false //兼容ie
  • 兼容写法(推荐使用这种写法)
    e.preventDefault?e.preventDefault():e.returnValue = false
  • return false
    return false //阻止默认行为

事件监听器

概述:所谓的“事件监听器”,指的是使用addEventListener()方法来为一个元素添加事件,我们又称之为“绑定事件”,具有兼容问题。

  • 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.绑定拖拽的元素,移动和鼠标松开后是对document的绑定,因为移动的是整个div。
3.点击:a= 获取当前鼠标坐标、b =div距浏览器距离、c = 鼠标在div内部距离=a-b。
移动:通过 a - c 建立鼠标与div的关系,防止鼠标超出div。

1、示例:一个div在页面进行拖拽
<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>
2、 示例:一个div在区间进行拖拽
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
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容