热门标签 | 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级只支撑一个事宜处置惩罚递次,但也不是什么题目,现在只卖早饭的饭铺不多了~~~

此次没有源代码,以上~


推荐阅读
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 本文探讨了如何利用RxJS库在AngularJS应用中实现对用户单击和拖动操作的精确区分,特别是在调整区域大小的场景下。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 本文介绍了如何利用jQuery实现对网页上多个div元素的显示与隐藏控制,包括基本的toggle方法及更复杂的显示隐藏逻辑。 ... [详细]
  • JavaScript 页面卸载事件详解 (onunload)
    当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
  • 本文探讨了使用普通生成函数和指数生成函数解决组合与排列问题的方法,特别是在处理特定路径计数问题时的应用。文章通过详细分析和代码实现,展示了如何高效地计算在给定条件下不相邻相同元素的排列数量。 ... [详细]
  • 利用无代码平台实现高效业务应用开发
    随着市场环境的变化加速,全球企业都在探索更为敏捷的应用开发模式,以便快速响应新兴的商业机遇。然而,传统的软件开发方式不仅成本高昂,而且耗时较长,这往往导致IT与业务部门之间的合作障碍,进而影响项目的成功。本文将探讨如何通过无代码开发平台解决这些问题。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
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社区 版权所有