事件

事件下

事件冒泡的两个行为

事件冒泡

从里到外冒泡  里面有一个按钮添加了点击事件  外面有一个盒子也添加了点击事件  在你触发对应的按钮的点击的时候 同时他会自动调用对应盒子的点击事件  而这个机制就叫做事件冒泡

事件捕获

直接进行捕获处理

阻止事件冒泡

e.stoppropagation()*

e.cancelBubble(兼容ie的写法)

<div>

456

<button>123</button>

</div>

<script>

document.querySelector("div").onclick=function(){

console.log("大盒子被点击了");

}

document.querySelector("button").onclick=function(e){

e=e||window.event

//阻止事件冒泡

e.stopPropagation()//适用大多数的浏览器

//兼容ie  取消冒泡

e.canceBubble=true

//兼容写法

if(e.stopPropagation){

e.stopPropagation()

}else{

e.cancelBubble=true

   }

//三目运算写法

e.stopPropagation?e.stopPropagation():e.cancelBubble=true

console.log("按钮被点击了");

}

</script>

兼容写法

e.stopPropagation?e.stopPropagation():e.cancelBubble=true

阻止默认行为

概述:元素自身拥有的一些行为

form的submit按钮会自动提交  然后默认页面

a标签  直接默认跳转页面

鼠标右键点击  会出现菜单栏

......

阻止a标签默认跳转的行为

<ahref="http://www.baidu.com">百度</a>

<script>

document.querySelector("a").onclick=dunction(e){

e=e||window.event

//阻止a标签默认跳转行为

e.preventDefault()//阻止默认行为*

//ie浏览器兼容

e.returnValue=false//阻止默认行为  returnValue 同样适用于高版本浏览器(可能会被废弃)

console.log("a标签被点击了");

returnfalse//阻止默认行为 一般写在最后

}

e.preventDefault()适用所有符合w3c规则的浏览器*

e. returnValue=false  适用ie浏览器  同样适用于高版本浏览器(可能会被废弃)

return  false//都适用,但是要写在最后面

右键菜单栏事件

document.oncontextmenu

拖拽

1.鼠标按下mousedown (获取点击在元素上的位置)

2.鼠标移动mousemove (获取在文档上移动的位置  控制对应的元素移动)

3.鼠标弹起mouseup (将按下事件和移动事件清除)

<body>

<!-- 在body里面拖拽  位置会改变  拖拽的元素需要定位 -->

<div></div>

<script>

//1.获取div元素

vardiv=document.querySelector("div")

//2.需要给div的元素添加鼠标按下事件(获取按下在元素里面的位置)

div.onmousedown=function(e) {

e=e||window.event

//需要鼠标在盒子里面的位置  offsetX offsetY

varcurrentX=e.offsetX

varcurrentY=e.offsetY

//3.在按下事件里面添加移动事件(获取移动的位置)新的位置-鼠标在盒子里面移动的位置

document.onmousemove=function(e) {

e=e||window.event

//pageX包含不可见范围  body的定位是包含不可见

vartargetX=e.pageX-currentX//移动的距离

vartargetY=e.pageY-currentY//移动的距离

//控制对应的元素移动

div.style.left=targetX+"px"

div.style.top=targetY+"px"

}

//4.在按下事件里面添加弹起事件  取消两个事件

document.onmouseup=function() {

document.onmousemove=document.onmouseup=false

//div.onmousedown=false

//document.onmouseup=false

}

}

</script>

区间拖拽

1.给元素添加按下事件(获取元素的父盒子的位置  在网页上的位置  获取对应的鼠标在元素里面的位置)

2.在按下事件里面添加移动事件(父元素添加)(获取当前鼠标在父盒子里面的位置-对应的鼠标在元素的位置  设置对应的位置)

3.在弹起事件离面取消对应的移动事件以及弹起事件

<divclass="box">

<divclass="moveBox"></div>

</div>

<script>

//1.获取元素  大盒子和移动的盒子

varbox=document.querySelector(".box")

varmoveBox=document.querySelector(".moveBox")

//2.给小盒子加鼠标按下事件  记录对应的鼠标在小盒子的位置  记录大盒子的位置

//鼠标在大盒子离的位置其实就是当前的鼠标在页面上的位置(page)-大盒子离页面的距离(offset家族)

//offset家族是获取对应的偏移的位置  它有奶便是娘(谁加了定位他就基于谁  否则基于body)

//offsetParent  偏移的父元素

//offsetLeft  左偏移

//offsetTop  上偏移

//offsetWidth  偏移元素的宽度

//offsetHeight  偏移元素的高度

//当前的鼠标在页面上的位置(pageX)-大盒子离页面的距离(offsetLeft)

//当前的鼠标在页面上的位置(pageY)-大盒子离页面的距离(offsetTop)

moveBox.onmousedown=function(e) {

e=e||window.event

varcurrentX=e.offsetX//鼠标在小盒子里面的位置

varcurrentY=e.offsetY

//3.按下事件里面给大盒子添加移动事件

//(得到鼠标在大盒子里面的位置-鼠标在小盒子里面的位置  控制对应的移动)

box.onmuosemove=function(e) {

e=e||window.event

//var  targetX=e.offsetX-currentX              

//var  targetY=e.offsetY-currentY

vartargetX=e.pageX-this.offsetLeft-currentX

vartargetY=e.pageY-this.offsetTop-currentY

//最大的移动区间就是  父元素的宽度-子元素的宽度

varmaxX=this.offsetWidth-moveBox.offsetWidth

varmaxY=this.offsetHeight-moveBox.offsetHeight

//边界判断

//如果当前定位的位置小于0就让他等于0

if(targetX<0) {

targetX=0

               }

if(targetY<0) {

targetY=0

               }

//如果当前移动的距离  大于我们最大的距离  就让他等于这个距离

if(targetX>maxX) {

targetX=maxX

               }

if(targetY>maxY) {

targetY=maxY

               }

//控制小盒子的位置

moveBox.style.left=targetX+"px"

moveBox.style.top=targetY+"px"

           }

//4.取消对应的大盒子的移动事件  以及大盒子的弹起事件

box.onmouseup=function() {

box.onmouseup=box.onmousemove=false

           }

       }

</script>

公式

鼠标在大盒子里面的位置其实就是=当前的鼠标在页面上的位置(page)-大盒子离页面的距离(offset家族)

移动的位置=得到鼠标在大盒子里面的位置-鼠标在小盒子里面的位置

最大的移动区间=父元素的宽(高)度-子元素的宽(高)度

offset家族

offset家族是获取对应的偏移的位置  它有奶便是娘(谁加了定位他就基于谁  否则基于body)

offsetParent  偏移的父元素

offsetLeft  左偏移

offsetTop  上偏移

offsetWidth  偏移元素的宽度

offsetHeight  偏移元素的高度

获取样式

window.getComputedStyle()*

element.currentStyle(兼容ie 8以下的浏览器)

//获取样式  获取所有的地方的样式  给定都是默认值  使用window对象

console.log(window.getComputedStyle($("h1")).backgroundImage);//返回的是一个样式对象  里面包含所有的样式

//兼容ie  都是属性  直译  元素对象

console.log($("h1").currentStyle);

//兼容写法  获取样式对象

functiongetStyle(element){

    returnwindow.getComputedStyle?window.getComputedStyle(element):element.currentStyle

}

事件监听器

1.采用了观察者模式(observer)

2.同一个事件可以有多个处理函数

3.在添加事件的饿时候对应的处理函数不能是匿名函数(不然是不能被移除的)

添加事件监听 addEventListener

addEventListener(监听事件名,处理函数,冒泡false 还是捕获true)

移出事件监听 removeEventListen

removeEventListen(事件名,处理函数)

varbtn=document.querySelector("botton")

functionhanlder(){

console.log("123");

}

//添加监听  同一个事件可以有多个处理函数

btn.addEventListener('click',hanlder,false)

btn.addEventListener('click',function(){

console.log('456');

},false)//是否捕获

//移出事件监听  函数的指向不一样 开辟两个内存空间  地址是不一样的  移除不了

//移除对应的事件名中某个匹配处理函数

btn.removeEventListener('click',hanlder)

//兼容ie8以下

//btn.attachEvent('obclick',fn)添加

//btn.detachEvent('obclick',fn)移除

封装的兼容方法

//事件监听器的兼容

//添加事件的元素   事件类型  处理函数

functionaddEvent(element,type,fn){

element.addEventListener?element.addEventListener(type,fn):

element.attachEvent(`on${type}`,fn)

}

functionremoveEvent(element,type,fn){

element.removeEventListener?element.removeEventListener(type,fn):

element.removechEvent(`on${type}`,fn)

}

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

推荐阅读更多精彩内容