清风陪你学习-JavaScript-浏览器的API(二)

2事件

2.1 什么是事件

一种触发相应的机制;

事件三要素:

·       事件源:触发()事件的元素

·       事件类型:事件的触发方式(例如鼠标点击或键盘点击)

·       事件处理程序:事件触发后要执行的代码(函数形式)

2.2 事件绑定

·       行内方式绑定(元素属性)


<body>
 
   <inputtype="button"value="按钮"id="btn"onclick="alert(2)">
</body>


<body>
 
   <inputtype="button"value="按钮"id="btn"onclick="f()">
</body>
<script>
 
   functionf(){
 
       console.log(3);
 
  }
</script>

onclick 其实就是html元素的一个属性,而属性的值需要是一段可执行的JS代码

·       动态绑定 (节点对象属性)


<body>
 
   <inputtype="button"value="按钮"id="btn">
</body>
<script>
 
   varbtn=document.getElementById('btn');
 
   btn.onclick=function(){
 
       alert(4);
 
  }
</script>

获取节点对象,然后修改节点对象属性 onclick的值,值是一个匿名函数即可;

以上两种事件绑定方式,需要在事件名称前加 on ;

·       事件监听(节点对象方法)


<body>
 
   <inputtype="button"value="按钮"id="btn">
</body>
<script>
 
   varbtn=document.getElementById('btn');
 
   btn.addEventListener('click',function(){
 
       alert(5);
 
  });
</script>

每一个节点对象都提供了addEventListener方法,这个方法可以给选中的节点添加指定类型的事件及事件处理程序;

·       移除事件监听


<body>
 
   <inputtype="button"value="按钮"id="btn">
</body>
<script>
 
   functionf(){
 
       alert(5);
 
  }
    varbtn=document.getElementById('btn');
 
   btn.addEventListener('click',f);
 
   btn.removeEventListener('click',f);
</script>

注意:removeEventListener方法移除的监听函数,必须与对应的addEventListener方法的参数完全一致,而且必须在同一个元素节点,否则无效。

2.3 三种事件绑定比较

this关键字在JavaScript中,每一个函数的内部都存在一个this关键字,其随着运行环境的不同,其指向也是不同的。


<body>
 
   <pid="t">ttttt</p>
</body>
<script>
 
   vard=document.getElementById('t');
 
   d.onclick=function(){
        //this指代本对象就是 d
 
       varv=this.innerHTML;
 
       alert(v);
 
  }
</script>

将上述代码的动态绑定,改为行内绑定:


<body>
 
   <pid="t"onclick="f()">ttttt</p>
</body>
<script>
 
   functionf(){
 
       varv=this.innerHTML;
 
       alert(v); //undefined
 
       console.log(this); //window对象
 
  }
</script>

由此可知:行内绑定,其事件处理程序内部的this指向了全局的window对象。动态绑定,其事件处理程序内部的this指向了当前正在操作的dom对象。

需求:同一个元素的同一个事件,绑定多个处理函数:


<body>
 
   <!--行内绑定,谁在前谁执行-->
 
   <pid="t"  onclick="t()"onclick="f()">ttttt</p>
</body>
<script>
 
   vard=document.getElementById('t');
 
   functionf(){
 
       alert(1);
 
  }
    functiont(){
 
       alert(2);
 
  }
</script>


<body>
 
   <pid="t">ttttt</p>
</body>
<script>
 
   //动态绑定,后边的执行函数会将前面的覆盖掉
 
   vard=document.getElementById('t');
 
   d.onclick=function(){
 
       alert(1);
 
  }
    d.onclick=function (){
 
       alert(2);
 
  }
</script>


<body>
 
   <pid="t">ttttt</p>
</body>
<script>
 
   vard=document.getElementById('t');
 
   functionf1() {
 
       console.log(this.innerHTML);
 
  }
    d.addEventListener('click', f1, false);
 
   d.addEventListener('click', function(){console.log('f2');}, false);
</script>

总结:第一种 "HTML标签的on-属性",违反了HTMLJavaScript代码相分离的原则;处理函数中 this 指向的window对象;第二种 "Element节点的事件属性" 的缺点是,同一元素同一个事件只能定义一个监听函数,也就是说,如果定义两次onclick属性,后一次定义会覆盖前一次。但是处理函数中的 this 指向的选中的对象;所以,这两种方法都不推荐使用,除非是为了程序的兼容问题,因为所有浏览器都支持这两种方法。第三种:addEventListener方法可以针对同一个元素的同一个事件,添加多个监听处理函数。处理函数中的 this 指向的也是选中的元素;

2.4 事件类型

https://developer.mozilla.org/zh-CN/docs/Web/Events

2.3.1 页面事件(资源事件)

事件名称

何时触发

load

一个资源及其相关资源已完成加载。


<bodyonload="f1()">
</body>
<script>
 
   functionf1(){
 
       alert('f1');
 
  }
</script>

2.3.2 焦点事件

事件名称

何时触发

focus

元素获得焦点(不会冒泡)

blur

元素失去焦点(不会冒泡)


<body>
 
   <inputtype="text"id="t"value="请输入用户名"onfocus="f1()"onblur="f2()">
</body>
<script>
 
   functionf1(){
 
       document.getElementById('t').value='';
 
  }
    functionf2(){
 
       varv=document.getElementById('t').value;
 
       alert(v);
 
  }
</script>

2.3.3 鼠标事件

事件名称

何时触发

mouseenter

指针移到有事件监听的元素内

mouseover

指针移到有事件监听的元素或者它的子元素内

mousemove

指针在元素内移动时持续触发

mousedown

在元素上按下任意鼠标按钮

mouseup

在元素上释放任意鼠标按键

click

在元素上按下并释放任意鼠标按键

dblclick

在元素上双击鼠标按钮

contextmenu

右键点击 (右键菜单显示前).

mouseleave

指针移出元素范围外(不冒泡)

mouseout

指针移出元素,或者移到它的子元素上

select

文本被选中


 
<body>
 
   <divid="d"style="width:200px;height:200px;border:1pxsolid red">
 
   </div>
</body>
<script>
 
   vard=document.getElementById('d');
 
   //当鼠标悬浮时触发
 
   d.onmouseover=function(){
 
       console.log('请问?');
 
  }
    //当鼠标离开时触发
 
   d.onmouseout=function(){
 
       console.log('这条路');
 
  }
    //当鼠标按下时触发
 
   d.onmousedown=function(){
 
       console.log('怎么走');           
 
  }
    //当鼠标弹起时触发
 
   d.onmouseup=function(){
 
       console.log('再来');           
 
  }
    //当鼠标移动时触发
 
   d.onmousemove=function(){
 
       console.log('不能够');           
 
  }
    
    //当点击右键时
 
   d.oncontextmenu=function(){
 
       console.log('你想问什么?');
 
       returnfalse;
 
  }
   
 
   // 当复制内容时
 
   d.oncopy=function(){
 
       console.log('你敢复制我?');
 
       returnfalse;
 
  }
    
</script>

2.3.4 键盘事件

事件名称

何时触发

keydown

按下任意按键

keypress

除 Shift, Fn, CapsLock 外任意键被按住. (连续触发)

keyup

释放任意按键


<body>
 
   <inputtype="text"  value=""id="t">
</body>
<script>
 
   vard=document.getElementById('t');
 
   //当键盘按下时触发
 
   d.onkeydown=function(){
 
       console.log('推到?');
 
  }
    //当键盘按下时触发
 
   d.onkeypress=function(){
 
       console.log('撩起2?');
 
  }
    //当键盘弹起时触发
 
   d.onkeyup=function(){
 
       console.log('撩起?');
 
  }
</script>

2.3.5 form表单事件

Event Name

Fired When

reset

点击重置按钮时 (<input type=’reset’ value=’重置’ />)

submit

点击提交按钮


<body>
 
   <formid="f"action="1.2.5.php">
 
       姓名:<inputtype="text"name=""value=""><br>
 
       <inputtype="submit"name=""value="提交">
 
       <inputtype="reset"name=""value="重置">
 
   </form>
</body>
<script>
 
   vard=document.getElementById('f');
    //当表单提交时触发
 
   d.onsubmit=function(){
 
       alert('t');
 
  }
    //当表单重置时触发
 
   d.onreset=function(){
 
       alert('re');
 
  }
</script>

2.3.6 内容变化事件

change当内容改变且失去焦点时触发(存储事件)input 当内容改变时触发(值变化事件)


<body>
 
   <inputtype="text"id="t"value="">
</body>
<script>
 
   vard=document.getElementById('t');
 
   //当内容改变且失去焦点时触发
 
   d.onchange=function(){
 
       console.log('t');
 
  }
    //当内容改变时触发
 
   d.oninput=function(){
 
       console.log('in');
 
  }
</script>

2.4 事件的传播

三个包裹着的DIV,都绑定了点击事件,问:当点击 div1 时,会发生什么现象?


<head>
 
   <title></title>
 
   <metacharset="UTF-8">
 
   <style>
 
       div{padding: 40px}
 
       #div3{width: 300px;height: 300px;background-color: red}
 
       #div2{width: 200px;height: 200px;background-color: yellow}
 
       #div1{width: 100px;height: 100px;background-color: blue}
 
   </style>
</head>
<body>
 
   <divid="div3">3
 
       <divid="div2">2
 
          <divid="div1">1</div>
 
       </div>
 
   </div>
</body>
<script>
 
   vard1=document.getElementById('div1');
 
   vard2=document.getElementById('div2');
 
   vard3=document.getElementById('div3');

 
   d1.onclick=function(){
 
       alert('1');
 
  }
    d2.onclick=function(){
 
       alert('2');
 
  }
    d3.onclick=function(){
 
       alert('3');
 
  }
</script>

当点击div1时,触发事件1,但是,紧跟着,事件2和事件3也被触发了;

这种现象,我们称为事件冒泡

JS中当一个事件发生以后,它会在不同的DOM节点之间传播。这种传播分成三个阶段:第一阶段:从window对象传导到目标节点,称为捕获阶段。第二阶段:在目标节点上触发,称为目标阶段。第三阶段:从目标节点传导回window对象,称为冒泡阶段

事件传播的最上层对象是window;事件的传播顺序,在捕获阶段依次为windowdocumenthtmlbodydiv;在冒泡阶段依次为divbodyhtmldocumentwindow

注意:三种事件绑定方式全部默认监听冒泡阶段事件;

2.5 改变事件触发的阶段

想让事件监听在捕获阶段,只能通过addEventListener 方法的进行设置:


<script>
 
   vard1=document.getElementById('div1');
 
   vard2=document.getElementById('div2');
 
   vard3=document.getElementById('div3');
 
   d1.addEventListener('click',function(){
 
       alert('m1');
 
  });//目标阶段触发

 
   d2.addEventListener('click',function(){
 
       alert('b2');
 
  },true);//捕获阶段触发

 
   d3.addEventListener('click',function(){
 
       alert('b3');
 
  },true);//捕获阶段触发


 
   d1.addEventListener('click',function(){
 
       alert('mm1');
 
  });//目标阶段触发

 
   d2.addEventListener('click',function(){
 
       alert('p2');
 
  });//冒泡阶段触发
    d3.addEventListener('click',function(){
 
       alert('p3');
 
  },false);//冒泡阶段触发
</script>

 

"我是Spirit_Breeze,中文&lt;晟世清风>,在这纷纷乱世之中,祈望能有一股清流之风." 本人从事销售,不甘心于口舌之利,突然对代码和框架充满兴趣,遂之研究研究,欢迎研究讨论,转载请备注地址和作者,谢谢


猜你喜欢

转载自blog.csdn.net/spirit_breeze/article/details/80905154
今日推荐