博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript的事件处理(一)——基础原理
阅读量:5281 次
发布时间:2019-06-14

本文共 2009 字,大约阅读时间需要 6 分钟。

事件是用户或者游览器自身执行的某种动作,诸如click,load,mouseover,都是时间的名称。响应某事件的函数就叫做事件处理程序(或者事件侦听器),事件处理程序的名字往往以'on'开头,比如click事件的事件处理程序是onclick,load时间的是onload。

     为事件指定处理程序的方式有好几种:

     1. html事件处理程序

 

      这里特别一个问题,事件处理程中的代码在执行时,有权访问全局作用域中的任何代码。

      但在html中指定事件处处理程序有两个缺点:

      1. 时差问题。

      2. html与javascript代码紧密耦合

      第二点比较容易理解,这里重点讲下第一点,比如:

        Test UI Thread                  

      在段代码在页面刚出现时点击按钮是没有用的,10s后再点击才能触发相应事件,这里因为用户可能会在hmtl元素一出现就触发,但当时的事件处理程序可能尚不具备执行条件,这样就会报错。

     由于以上两个缺陷,好的开发者应该摒弃这种事件处理程序。

 

     2. DOM0级事件处理程序

     通过Javascript制定事件处理程序的传统方式,就是将一个函数赋值给一个事件处理程序属性。这种方法至今仍然为所有现代游览器所支持,一是因为简单,而是跨游览器。每个元素(包括window和document)都有自己的事件处理程序属性,这些属性通常全部小写,例如onclick。将这种属性的值设置为一个函数,就可以指定事件处理程序。

     具体如下:

 

     同样的道理,在这些代码运行以前不会指定事件处理程序,

     特别强调的是,使用DOM0级方法指定的事件处理程序被认为是元素的方法,因此,这时候的事件处理程序在元素的作用域中运行;换句话说,程序中的this引用当前元素。比如还是上例,代码换成:

var bn3 = document.getElementById('mybutton3'); bn3.onclick = function(){
alert(this.id);// mybutton3 }

    这时就会显示 mybutton3 

    可以在事件处理程序中通过this访问元素的任何属性和方法,以这种方式添加的事件处理程序都在事件流的冒泡阶段被处理。

    当然只要像下面这样将事件处理程序属性设置为null,即可删除通过DOM0级方法指定的时间处理程序。

bn3.onclick = null;

 

   3. DOM2级事件处理程序

   “DOM2级事件”定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventLister()。所有DOM节点中都包含这两个方法,并且他们都接受3个参数:要处理的事件名,作为事件处理程序的函数和一个布尔值。最后这个布尔值参数如果是true,表示在捕捉阶段调用事件调用事件处理程序,如果是false,表示在冒泡阶段调用事件处理程序。比如:

 

      通过addEventListener()添加的时间处理程序只能使用removeEventListener()来移除;移除时传入的参数和添加处理程序时使用的参数相同。这意味着通过addEventListener()添加的匿名函数将无法移除,比如:

var bn4 = document.getElementById('mybutton4');       bn4.addEventListener('click',function(){
alert('add event listener of button4'); },false); //没有用 bn4.removeEventListener('click',function(){
alert('remove event listener of button4'); });

      这段代码之所以没有起作用是因为实际上,第二个参数与addEventListener()中的那个是完全不同的函数。正确的做法:

var hadler = function(){
alert('add event listener of button4'); }; bn4.addEventListener('click',hadler,false); //有用 bn4.removeEventListener('click',hadler,false);

 

转载于:https://www.cnblogs.com/aaa6818162/archive/2012/01/18/2325242.html

你可能感兴趣的文章
[LeetCode 063] Unique Paths II
查看>>
团队项目测评博客
查看>>
discuz 文件模板edit
查看>>
Android 4.0通过新的特性统一了平板电脑与手机
查看>>
WinSCP 5.1.3 版本 发布
查看>>
Android-x86 4.2 发布,基于 Android 4.2.2
查看>>
Linux基础学习-数据备份工具Rsync
查看>>
HTML页面的导出,包括Excel和Word导出
查看>>
每日编程-20170310
查看>>
6.10—039—周一
查看>>
ORACLE ORA-01653: unable to extend table 的错误
查看>>
Config文件的使用:通过程序修改Config文件
查看>>
20-2 orm分组和聚合以及在项目中执行的一些方法
查看>>
屏蔽某些地区显示效果22
查看>>
枚举类型练习
查看>>
LeetCode--006--Z字型变换(java)
查看>>
Qt 中文问题
查看>>
【HANA系列】SAP HANA计算视图中的RANK使用方法
查看>>
MouseOver/MouseOut vs MouseEnter/MouseLeave
查看>>
使用web api开发微信公众号,调用图灵机器人接口(一)
查看>>