JS中的事件(对象,冒泡,委托,绑定)
- 事件,是文档或浏览器窗口中发生的一些特定的交互瞬间,JS与HTML之间的交互是通过事件实现的
对于web应用来说,有下面这些代表性事件:点击事件,鼠标移动,按下键盘等等
- 事件,是用户和浏览器之间的交互行为
我们可以在事件对应的属性中设置一些js代码,当事件被触发时,这些代码会执行
文档的加载:
浏览器在加载一个页面时,是按照自上而下的顺序加载的,
读取到一行就运行一行,在代码执行时,页面还没有加载
将js代码编写到页面的下面,确保页面加载完毕以后再执行js代码
window.onload 确保页面加载完成以后执行,可以保证代码执行时所有DOM对象已经加载完毕了
clientWidth/clientHeight:
- 可以获取元素的可见宽度和高度
- 这些属性都是不带px的,返回都是一个数字,可以直接进行计算
- 会获取元素宽度和高度,包括内容区和那边距
- 这些属性都是只读的,不能修改
事件对象:
当事件的响应函数被触发时,浏览器每次都会将一个事件对象作为实參传递进响应函数
在事件对象中封装了当前事件相关的一切信息,比如:鼠标的坐标,键盘哪个按键被按下
- <div id="areaDiv">
- </div>
- <br>
- <br>
- <div id="showMsg">
- </div>
- <script>
- /**
- * 当鼠标在areaDiv中移动时,在showMsg来显示鼠标的坐标
- onmousemove
- - 该事件将会在鼠标在元素中移动时被触发
- */
- var area=document.getElementById('areaDiv')
- var show=document.getElementById('showMsg')
if(!event){
event=window.event}//event=event||window.event- area.onmousemove=function(event){
- /**
- * clientX可以获取鼠标指针的水平坐标
- clientY可以获取鼠标的垂直坐标,在ie8中不兼容
- */
- show.innerHTML='x='+event.clientX+',Y='+event.clientY
- }
- </script>
⚠️:
在ie8中,响应函数被触发时,浏览器不会传递事件对象
在ie8及以下的浏览器中,是将事件对象作为window对象的属性保存的
事件冒泡:
所谓冒泡就是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发
在开发中大部分情况冒泡都是有用的,如果不希望发生事件冒泡可以通过事件对象来取消
- <div id="box1">
- 我是box1
- <span id='s1'>我是span</span>
- </div>
- <script>
- var s1=document.getElementById('s1');
- var box1=document.getElementById('box1');
- s1.onclick=function(event){
- event=event||window.event
- alert('s1 here')
- event.cancelBubble=true
- }
- box1.onclick=function(){
- event=event||window.event
- alert('box1 here')
- event.cancelBubble=true//取消冒泡
- }
- document.body.onclick=function(){
- alert('body here')
- }
- </script>
事件的委派:
- 将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件触发时,会一直冒泡到祖先元素,从而通过祖先元素的响应函数来处理事件
- 事件委派是利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能
- <button id="btn">添加超链接</button>
- <ul id="ul">
- <li><a href="javascript:;" class="link">超链接一</a></li>
- <li><a href="javascript:;" class="link">超链接二</a></li>
- <li><a href="javascript:;" class="link">超链接三</a></li>
- </ul>
- <script>
- var ul=document.getElementById('ul')
- var btn=document.getElementById('btn')
- btn.onclick=function(){
- var li=document.createElement('li');
- li.innerHTML="<a <li><a href='javascript:;' class='link'>超链接</a></li>"
- ul.appendChild(li)
- }
- /**
- *为每个超链接都绑定一个单击响应函数
- 这些操作只能为已经有的超链接设置事件,为新添加的超链接必须重新绑定
- */
- /**
- * var allA=document.getElementsByTagName('a');
- for(var i=0;i<allA.length;i++){
- allA[i].onclick=function(){
- alert('我是a')
- }
- }
- */
- /**
- * 我们希望,只绑定一次事件,即可应用到所有元素上,即使元素是后添加的
- 我们可以尝试将其绑定给元素的共同祖先元素
- */
- //为ul绑定一个单击响应函数
- ul.onclick=function(event){
- event=event||window.event
- //如果触发事件的对象是我们期望的对象,则执行否则不执行
- /**
- target
- *event的target表示触发事件的对象
- */
- // alert(event.target)
- if(event.target.className=='link')
- {
- alert('我是a')
- }
- }
事件的绑定:
- <button id="btn">click</button>
- var btn=document.getElementById('btn')
- btn.addEventListener("click",function(){
- alert(1)
- },false)
- btn.addEventListener("click",function(){
- alert(2)
- },false)
- <button id="btn">click</button>
- var btn=document.getElementById('btn')
- btn.attachEvent("onclick",function(){
- alert(1)
- },false)
- btn.attachEvent("onclick",function(){
- alert(2)
- },false)
定义一个函数,用来为指定元素绑定响应函数
参数:
obj 要绑定的对象
eventStr 事件的字符串(不要on)
callback 事件的回调函数
- var btn=document.getElementById('btn')
- function bind(obj,eventStr,callback){
- if(obj.addEventListener){
- //大部分兼容的方式
- obj.addEventListener(eventStr,callback,false)
- }
- else{
- /**
- * this是谁,由调用方式决定
- callback.call(obj)
- */
- //ie8及以下
- // obj.attachEvent("on"+eventStr,callback)//callback由浏览器调用,this对象指向浏览器,
- //可以把上一句改成:
- obj.attachEvent("on"+eventStr,function(){
- callback.call(obj)//obj传入参数,代替this指向
- })
- }
- }
- bind(btn,"click",function(){
- alert('hello')
- })
事件的传播:
- 关于事件的传播有两种说法:
1.事件是从内往外传播,也就是当事件触发时,应该先触发当前元素上的事件,然后再向当前元素的祖先元素上传播,也就是说事件应该再冒泡阶段执行
2.事件是由外向内传播,也就是先是当前元素的最外层祖先元素触发,然后在向内传递给后代元素
w3c综合了两种说法,将事件分成了3个阶段:
- 捕获阶段
在捕获阶段是从最外层的祖先元素,向目标元素进行事件的捕获,但是默认此时不会触发事件
- 目标阶段
事件捕获到目标元素,捕获结束开始在目标元素上触发事件
- 冒泡阶段
事件从目标元素向他的祖先元素传递,依次触发祖先元素上的事件
⚠️:
- 如果希望在捕获阶段就触发事件,可以将addEventListener()的第三个参数设置为true(一般不会有人这么做
- ie8没有捕获阶段
JS中的事件(对象,冒泡,委托,绑定)的更多相关文章
- JS中的事件&对象
一.JS中的事件 (一)JS中的事件分类 1.鼠标事件 click/dblclick/onmouseover/onmouseout 2.HTML事件 onload/onscroll/onsubmit/ ...
- js中获取事件对象的方法小结
原文地址:http://jingyan.baidu.com/article/d8072ac4594d6cec95cefdac.html 事件对象 的获取很简单,很久前我们就知道IE中事件对象是作为全局 ...
- 和我一起理解js中的事件对象
我们知道在JS中常用的事件有: 页面事件:load: 焦点事件:focus,blur: 鼠标事件:click,mouseout,mouseover,mousemove等: 键盘事件:keydown,k ...
- JS 学习笔记--JS中的事件对象基础
事件:JavaScript中的事件是由访问web页面用户的一系列操作引起的,比如点击鼠标,键盘按键等.当用户执行某些操作的时候再去执行一些代码. 事件模型:内联模型.脚本模型.DOM2模型 内联模型: ...
- js中的事件代理(委托)
1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这 ...
- 怎么理解js中的事件委托
怎么理解js中的事件委托 时间 2015-01-15 00:59:59 SegmentFault 原文 http://segmentfault.com/blog/sunchengli/119000 ...
- JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象
前 言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...
- js中的事件委托(事件代理)详解
本文转载:https://www.cnblogs.com/liugang-vip/p/5616484.html#!comments js中的事件冒泡.事件委托是js 中一些需要注意的小知识点,这里结合 ...
- js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象
事件对象 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对 ...
随机推荐
- spring boot 1.4 整合 mybatis druid
http://www.jianshu.com/p/cef49ad91ba9spring boot 1.4 整合 mybatis druid
- 2018.4.24 flask_mail使用
#!/flask/bin/python # -*- coding: utf-8 -*- from threading import Thread from flask import Flask fro ...
- Jenkins入门-环境搭建(1)
因为Jenkins的环境搭建比较简单,本来不想来介绍,但是发现有些入门小朋友,从各种网站上下载的各种安装包来搭建,最后导致出现了各种千奇百怪的问题,介于这种情况下我决定还是来写一下Jenkins的环境 ...
- anaconda 在内网中代理配置
修改anaconda的配置文件,位置在c:\User(或“用户”)\current_user(当前用户)\.condarc,将以下内容拷贝进去, 替换原有内容, 修改 http://proxy.you ...
- workerman相关
(1)workerman linxu 内核优化 http://doc.workerman.net/315302 (2)workerman 安装环境配置 http://doc.workerman.ne ...
- 20165312 2017-2018-2 《JAVA程序设计》第4周学习总结
一.课本五六章知识点总结 1.第五章 继承是一种由已有的类创建新类的机制 子类继承父类的成员变量和方法 子类继承的方法只能操作子类继承和隐藏的成员变量 子类重写或新增的方法只能操作子类继承和新声明的成 ...
- 4th Dec 2018
两个人都觉得自己没错,或者对方都把错误归结于另外一方,总会盯着对方的不足,无限放大:谁都不肯先放下兵器,亦或害怕自己放下了兵器,对方又拿起了盾.这就好像双方在同一时间拉扯一根皮筋,拉扯的越长,张力越大 ...
- python网页爬虫开发之二
1.网站robots robotparser模块首先加载robots.txt文件,然后通过can_fetch()函数确定指定的用户代理是否允许访问网页. 2.识别网站技术 3.下载网页 使用urlli ...
- bitbucket 上公钥SSH key如何add key并进行项目运用
前提:从sourcetree 添加项目时老是拉取不下来,查到原因是应为bitbucket需要SSH key公钥 目的:公钥相当于你在任何一台电脑只要有公钥授权就可以随时提交代码到服务器 原因: 1.很 ...
- [UGUI]圆形Image
参考链接: http://www.cnblogs.com/leoin2012/p/6425089.html 前面说过Mask组件会影响性能:https://www.cnblogs.com/lyh916 ...