JavaScript常见事件对象与操作实例总结


Posted in Javascript onJanuary 05, 2019

本文实例讲述了JavaScript常见事件对象与操作。分享给大家供大家参考,具体如下:

触发 DOM 上的事件时,会生成一个事件对象 event,它包含着所有与事件有关的信息,诸如导致事件的元素、事件的类型以及其他与特定事件相关的信息。所有的浏览器都支持 event 对象,但支持的方式不同。

1 DOM 中的事件对象

兼容 DOM 的浏览器会将 event 对象传入事件处理程序(DOM0 级与 DOM2 级都支持):

var btn = document.getElementById("myBtn");
btn.onclick = function (event) {
  console.log(event.type);//"click"
};
btn.addEventListener("click",function(event){
  console.log(event.type);//"click"
,false};

event.type 保存的是被触发的事件类型。

通过 HTML 属性指定事件处理程序时, event 中保存的是 event 对象:

<input type="button" value="Click Me" onclick="alert(event.type)"/>

event 对象包含着创建它的特定事件相关的属性和方法,所以可能每个特定事件都有自己所特有的属性和方法,不过所有事件都会有这些属性和方法:

属性/方法 类型 读/写 说明
bubbles Boolean 只读 事件是否冒泡。
cancelable Boolean 只读 是否可以取消事件的默认行为。
currentTarget Element 只读 与当前事件处理程序相关的元素。
defaultPrevented Boolean 只读 true 表示已调用 preventDefault() 方法(DOM3 新增)。
detail Integer 只读 与事件相关的细节信息。
eventPhase Integer 只读 调用事件处理程序的阶段;1:捕获;2:处于目标;3:冒泡。
preventDefault() Function 只读 取消事件的默认行为(如果 cancelable 为 true,就可以调用这个方法)。
stopImmediatePropagation() Function 只读 阻止事件被进一步捕获或者冒泡,同时阻止任何事件处理程序被调用(DOM3 新增)。
stopPropagation() Function 只读 阻止事件被进一步捕获或者冒泡(如果 bubbles 为 true,就可以调用这个方法)。
target Element 只读 事件的目标。
trusted Boolean 只读 true:事件是由浏览器生成的;false:事件是通过 JavaScript 创建的(DOM3 新增)。
type String 只读 被触发的事件类型。
view AbstractView 只读 与事件相关的抽象视图,相当于发生事件的 window 对象。

在事件处理程序内部,this 始终等于 currentTarget,而 target 等于事件的实际目标。如果直接将事件处理程序指定给目标元素,那么这三个值相等:

<script type="text/javascript">
  var btn = document.getElementById("myBtn");
  btn.onclick = function (event) {
    console.log(event.currentTarget === this);//true
    console.log(event.target === this);//true
  }
</script>

如果事件处理程序指定到按钮的父节点上,那么它们是不同的:

<script type="text/javascript">
  document.body.onclick = function (event) {
    console.log(event.currentTarget === document.body);//true
    console.log(this === document.body);//true
    console.log(event.target === document.getElementById("myBtn"));//true
  }
</script>

如果需要通过一个函数来处理多个事件,那么可以使用 type 属性:

<script type="text/javascript">
  var btn = document.getElementById("myBtn");
  var handler = function (event) {
    switch (event.type) {
      case "click":
        console.log("Clicked");
        break;
      case "mouseover":
        event.target.style.backgroundColor = "red";
        break;
      case "mouseout":
        event.target.style.backgroundColor = "";
        break;
    }
  };
  btn.onclick = handler;
  btn.onmouseover = handler;
  btn.onmouseout = handler;
</script>

使用 preventDefault() 方法来阻止特定事件的默认行为:

<a id="myLink" href="163.com" rel="external nofollow" rel="external nofollow" >点我</a>
<script type="text/javascript">
  var link = document.getElementById("myLink");
  link.onclick = function (event) {
    event.preventDefault();
  }
</script>

注意:只有 cancelable 属性值为 true 的事件,才可以使用 preventDefault() 阻止特定事件的默认行为!

stopPropagation() 会立即阻止事件在 DOM 层次的传播。比如这里在按钮事件中调用 stopPropagation() ,来避免触发注册在 document.body 上的事件处理程序:

<script type="text/javascript">
  var btn = document.getElementById("myBtn");
  btn.onclick = function (event) {
    console.log("Clicked");
    event.stopPropagation();
  };
  document.body.onclick = function (event) {
    console.log("Body clicked");
  };
</script>

eventPhase 属性,可以确定事件当前正处于事件流的哪一个阶段:

<script type="text/javascript">
  var btn = document.getElementById("myBtn");
  btn.onclick = function (event) {
    console.log(event.eventPhase);//2
  };
  document.body.addEventListener("click", function (event) {
    console.log(event.eventPhase);//1
  }, true);//true 表示捕获阶段
  document.body.onclick = function (event) {
    console.log(event.eventPhase);//3
  };
</script>

注意: 只有在事件处理程序执行期间,event 对象才会存在;一旦事件处理程序执行结束,event 对象就会被销毁!

2 IE 中的事件对象

在使用 DOM0 级方法添加事件处理程序时,event 对象是作为 window 对象的一个属性存在:

var btn = document.getElementById("myBtn");
btn.onclick = function () {
  var event = window.event;
  console.log(event.type);//"click"
};

如果是通过 HTML 属性指定的事件处理程序,也跟 DOM一样,可以通过 event 变量来访问 event 对象。

IE 的 event 对象也包含着创建它的特定事件相关的属性和方法,所以可能每个特定事件都有自己所特有的属性和方法,不过所有事件都会有这些属性和方法:

属性 类型 读/写 说明
cancelBubble Boolean 读/写 默认值为 false,true 表示可以取消事件冒泡(同 DOM 的 stopPropagation() )。
returnValue Boolean 读/写 默认值为 true,false 表示取消事件默认行为(同 DOM 的 preventDefault() )。
srcElement Element 只读 事件的目标(同 DOM 中的 target)。
type String 只读 被触发的事件类型。

因为事件处理程序的作用域是根据它指定的方式来确定的,所以最好是使用 event.srcElement 来得到事件的目标比较靠谱:

<button id="myBtn">点我</button>
<script type="text/javascript">
  var btn = document.getElementById("myBtn");
  btn.onclick = function () {
    console.log(window.event.srcElement === this);//true
  };
  btn.attachEvent("onclick", function (event) {
    console.log(event.srcElement === this);//false
  });
</script>

将 returnValue 设置为 false,就能阻止默认行为:

<a id="myLink" href="163.com" rel="external nofollow" rel="external nofollow" >点我</a>
<script type="text/javascript">
  var link = document.getElementById("myLink");
  link.onclick = function () {
    window.event.returnValue = false;
  }
</script>

与 DOM 不同的是,这里没有办法确定事件是否能被取消。

因为 IE 不支持事件捕获,所以只能取消事件冒泡:

<script type="text/javascript">
  var btn = document.getElementById("myBtn");
  btn.onclick = function () {
    console.log("Clicked");
    window.event.cancelBubble = true;
  };
  document.body.onclick = function (event) {
    console.log("Body clicked");
  };
</script>

3 跨浏览器的事件对象

我们把之前的 EventUtil 对象进行增强:

var EventUtil = {
  ...
  /**
   * 返回对 event 对象的引用
   * @param event
   * @returns {*}
   */
  getEvent: function (event) {
    return event ? event : window.event;
  },
  /**
   * 返回事件的目标
   * @param event
   * @returns {*|elem|Object}
   */
  getTarget: function (event) {
    return event.target || event.srcElement;
  },
  /**
   * 取消事件默认行为
   * @param event
   */
  preventDefault: function (event) {
    if (event.preventDefault) {
      event.preventDefault();
    } else {
      event.returnValue = false;
    }
  },
  /**
   * 阻止事件流
   * @param event
   */
  stopPropagation: function (event) {
    if (event.stopPropagation) {
      event.stopPropagation();
    } else {
      event.cancelBubble = true;
    }
  }
}

这样使用:

<button id="myBtn">点我</button>
<script type="text/javascript">
  var btn = document.getElementById("myBtn");
  btn.onclick = function (event) {
    event = EventUtil.getEvent(event);//确保所有浏览器都能使用 event 对象
    var target = EventUtil.getTarget(event);
    console.log(target);
  }
</script>

取消事件默认行为:

<a id="myLink" href="http://www.163.com" rel="external nofollow" >点我</a>
<script type="text/javascript">
  var link = document.getElementById("myLink");
  link.onclick = function (event) {
    event = EventUtil.getEvent(event);
    EventUtil.preventDefault(event);
  }
</script>

阻止事件传播:

<button id="myBtn">点我</button>
<script type="text/javascript">
  var btn = document.getElementById("myBtn");
  btn.onclick = function (event) {
    console.log("Clicked");
    event = EventUtil.getEvent(event);
    EventUtil.stopPropagation(event);
  };
  document.body.onclick = function (event) {
    console.log("Body clicked");
  };
</script>

因为 IE 不支持事件捕获,所以 EventUtil 的 stopPropagation() 的方法只能阻止事件冒泡。

PS:关于javascript事件说明可参考本站javascript事件与功能说明大全:http://tools.3water.com/table/javascript_event

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
爆炸式的JS圆形浮动菜单特效代码
Mar 03 Javascript
最新28个很棒的jQuery 教程
May 28 Javascript
扩展JavaScript功能的正确方法(译文)
Apr 12 Javascript
WEB前端设计师常用工具集锦
Dec 09 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
Apr 15 Javascript
AngularJS入门教程之表格实例详解
Jul 27 Javascript
使用yeoman构建angular应用的方法
Aug 14 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
Feb 22 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
Sep 25 Javascript
Nuxt页面级缓存的实现
Mar 09 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
Jun 11 Javascript
html实现随机点名器的示例代码
Apr 02 Javascript
JavaScript常见事件处理程序实例总结
Jan 05 #Javascript
JavaScript代码调试方法实例小结
Jan 05 #Javascript
JavaScript实现连连看连线算法
Jan 05 #Javascript
JavaScript错误处理操作实例详解
Jan 04 #Javascript
JSON基本语法及与JavaScript的异同实例分析
Jan 04 #Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 #Javascript
Node.js操作系统OS模块用法分析
Jan 04 #Javascript
You might like
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
Ajax基础知识详解
2017/02/17 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
Python字符串对象实现原理详解
2019/07/01 Python
python判断自身是否正在运行的方法
2019/08/08 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
电脑租赁公司创业计划书
2014/01/08 职场文书
绩效考核实施方案
2014/03/18 职场文书
大学生职业生涯规划书汇总
2014/03/20 职场文书
爱我中华演讲稿
2014/05/20 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
归途列车观后感
2015/06/17 职场文书
运动会加油稿
2015/07/22 职场文书
JAVA springCloud项目搭建流程
2022/05/11 Java/Android