热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DOM事宜总结(一)

媒介:撸完CSS-DOM紧接着来撸DOM事宜,事宜总结完成后我要最先总结动画,然后用纯JS完成一个轮播图,前路漫漫,另有种种框架等着我~~~本篇主要内容有:事宜流事宜处置惩罚递次跨

媒介:撸完CSS-DOM紧接着来撸DOM事宜,事宜总结完成后我要最先总结动画,然后用纯JS完成一个轮播图,前路漫漫,另有种种框架等着我~~~
本篇主要内容有:事宜流 事宜处置惩罚递次 跨浏览器事宜处置惩罚递次

--------------------? 分割线---------------------

1.事宜流

事宜冒泡:事宜最先时由最详细的元素(文档嵌套条理最深的节点)吸收,然后逐级向上传播到较为不详细的节点。
事宜捕捉:不太详细的节点应当更早吸收到事宜,最详细的节点应当末了吸收到事宜。

2.DOM事宜流

在W3C范例中:分三步(1、事宜捕捉;2、事宜触发;3、事宜冒泡);
在IE中:分两步(1、事宜冒泡;2、事宜触发)
在网景(Netscape):分两步(1、事宜捕捉;2、事宜触发)

3.事宜处置惩罚递次

(一)HTML事宜处置惩罚递次

这个在《DOM编程艺术》中开端完成的图片库的总结(一)就有了应用,它的js代码嵌套在HTML中,如:想要完成在点击按钮时显现一个正告框,则能够这么写:

瑕玷:
1.代码例子中的alert能够换成本身定义的函数,假如用户在页面加载后还没最先剖析这个函数时就单击了按钮,这个时刻就会激发毛病,这时候能够将事宜处置惩罚递次封装在try-catch块中,上面的代码能够改成:

2.HTML和js代码耦合性太强,假如要替换事宜处置惩罚递次,就要修改两个处所。

(二)DOM 0级事宜处置惩罚递次

每一个元素(包含window和document)都有本身的事宜处置惩罚递次属性,比方onclick,将这类属性值设置为一个函数,就能够指定事宜处置惩罚递次,以下方代码:

//假如有一个按钮,先猎取这个按钮元素
var btn = document.getElementById("myBtn");
btn.Onclick= function(){
alert("你点我干啥!!!");
};

注重:以上代码在运转之前不会指定事宜处置惩罚递次,换句话说就是假如这些代码插进去在html文档中的末了,位于按钮以后,body标签之前,那末在文档剖析这个函数之前,点击按钮时无效的。

长处:简朴,具有跨浏览器的上风

特性:运用DOM 0级要领指定事宜处置惩罚递次被认为是元素的要领,因而这个时刻事宜处置惩罚是在元素的作用域中举行运转,递次中的this指向当前元素。 来看下面一段代码:

var btn = document.getElementById("mybtn");
btn.Onclick= function(){
alert(this.id); //this代表当前实行操纵的元素btn,也就是id为mybtn的按钮
}

以上不单单议能够接见元素的id属性,元素的任何属性和要领都能够经由过程this接见。以这类体式格局增添的事宜处置惩罚递次会在事宜流的冒泡阶段被处置惩罚。

(三)DOM 2级事宜处置惩罚递次

DOM 2级事宜定义了两个要领,离别用于处置惩罚指定和删除事宜处置惩罚递次的操纵:
addEventListener()removeEventListener()
他们都吸收三个参数:要处置惩罚的事宜名、作为事宜处置惩罚递次的函数、一个布尔值。
布尔值假如是true示意在捕捉阶段挪用事宜处置惩罚递次,假如是false示意在冒泡阶段挪用事宜处置惩罚递次。

增添事宜操纵
以下代码:

var btn = document.getElementById("myBtn");
btn.addEventListener("click",function(){
alert(this.id);
},false);
btn.addEventListener("click",function(){
alert("你点我干啥!!!");
},false);

以上代码为一个按钮增添了一个onclick事宜处置惩罚递次,注重内里参数通报的是"click",这个是跟DOM中的事宜范例有关,后续再说。~~~
而且运用DOM 2级要领增添事宜处置惩罚递次的优点是,能够增添多个事宜处置惩罚递次,上面例子中首先会显现元素id,然后显现”你点我干啥!!!”。

删除事宜操纵
经由过程addEventListener()增添的事宜处置惩罚递次只能运用removeEventListener()来移除,移除时传入的参数与增添递次时运用的参数雷同。这也就意味着经由过程addEventListener()增添的匿名函数将没法移除。如上面的例子,我增添以下代码将没法移除事宜:

btn.removeEventListener("click",function(){
alert(this.id);
},false);

处理办法是,将上面的匿名函数赋值给一个变量,然后adddEventListener和 removeEventListener
传参数时传入这个变量就能够了。

重写这个函数以下:

var btn = document.getElementById("myBtn");
var handler = function(){
alert(this.id);
};
btn.addEventListener("click",handler,false);
btn.addEventListener("click",handler,false);

(4)跨浏览器的事宜处置惩罚递次

----------------- 珍重性命,阔别IE ------------------

IE也完成了DOM中的相似的两个要领:attachEvent() 和detachEvent(),这两个要领接收雷同的两个参数,事宜处置惩罚递次称号与事宜处置惩罚递次函数。

以下代码:

var btn = document.getElementById("mybtn");
btn.attachEvent("onclick",function(){ //你没看错,用的“onclick”!!!
alert("你又点我了!!!");
});

注重:
1.attachEvent()的第一个参数时“onclick”
2.运用attachEvent(),事宜处置惩罚递次会在全局作用域中举行,因而this===window
3.增添多个事宜时,事宜处置惩罚递次不是以增添它们的递次实行,而是以相反的递次被触发。
4.运用detachEvent()来移除时,匿名函数一样不能移除,因而须要通报给函数雷同的援用。

那末重点来了,能够封装一个对象处理跨浏览器举行事宜处置惩罚,给这个对象起名叫:EventUtil,它有两个要领,离别举行事宜增添和移除。

且看下面代码:

var EventUtil = {
//@handler是装载匿名函数的援用变量,内里装载的是详细要实行的函数逻辑
//@element是目的元素
//type代表的是DOM 2级的事宜范例,因而在用IE或许DOM 0级前面要加“on” addHandler: function (element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, handler);
} else {
elemet["on" + type] = handler; //假如上面两种都不可,就运用DOM 0级要领处置惩罚,直接在元素上增添onclick事宜
}
}, removeHandler: function (element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.detachEvent) {
element.detachEvent("on" + type, handler);
} else {
element["on" + type] = null; ////假如上面两种都不可,就运用DOM 0级要领处置惩罚,直接赋值为null作废事宜
}
}
};

定义好了,怎样运用呢?看下面~~~

var btn = document.getElementById("myBtn");
var handler = function(){
alert("你又点我了!!!");
};
//增添事宜
EventUtil.addHandler(btn,"click",handler);
//移除事宜
EventUtil.removeHandler(btn,"click",handler);

以上代码并没有斟酌IE中的作用域题目,而且DOM 0级只支撑一个事宜处置惩罚递次,但也不是什么题目,现在只卖早饭的饭铺不多了~~~

此次没有源代码,以上~


推荐阅读
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • Java学习第10天:深入理解Map接口及其应用 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • Java环境中Selenium Chrome驱动在大规模Web应用扩展时的性能限制分析 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
author-avatar
Z-RZI
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有