javascript中DOM0,DOM2,DOM3级事件模型解析

简介: DOM 即 文档对象模型。文档对象模型是一种与编程语言及平台无关的API(Application programming Interface),借助于它,程序能够动态地访问和修改文档内容、结构或显示样式。

DOM 即 文档对象模型。

文档对象模型是一种与编程语言及平台无关的API(Application programming Interface)借助于它程序能够动态地访问和修改文档内容、结构或显示样式。

 

DOM3级顾名思义有三种DOM。

W3C协会早在1988年就开始了DOM标准的制定W3C DOM标准可以分为DOM1,DOM2,DOM3三个版本。 DOM1级主要定义的是HTML和XML文档的底层结构。

 

DOM1

主要定义的是HTML和XML文档的底层结构。其实世上本来没有DOM0级叫的人多了就有了DOM0级。在1998 年 10 月 DOM1级规范成为 W3C 的推荐标准在此之前的实现我们就习惯称为DOM0级其实本是没有这个标准的。

 

DOM2&DOM3

DOM2和DOM3级别则在这个结构的基础上引入了更多的交互能力也支持了更高级的XML特性。为此DOM2和DOM3级分为许多模块模块之间具有某种关联分别描述了DOM的某个非常具体的子集。

这些模块如下

1、DOM2级核心DOM Level 2 Core在1级核心的基础上构建为节点添加了更多方法和属性

2、DOM2级视图DOM Level 2 Views为文档定义了基于样式信息的不同视图

3、DOM2级事件DOM Level 2 Style定义了如何以编程方式来访问和改变CSS样式信息

4、DOM2级遍历和范围DOM Level 2 Traversal and Range引入了遍历DOM文档和选择其特定部分的新接口。

5、DOM2级HTMLDOM Level 2 HTML在1级HTML基础上构建添加了更多属性、方法和新接口。

6、DOM3级又增加了XPath模块和加载与保存Load and Save模块。

DOM2级和3级的目的在于扩展DOM API以满足操作XML的所有需求同时提供更好的错误处理及特性检测能力。 DOM0就是直接通过 onclick写在html里面的事件; DOM2是通过addEventListener绑定的事件, 还有IE下的DOM2事件通过attachEvent绑定; DOM3是一些新的事件。

 

DOM的变化一方面是对命名空间的支持另一方面是对方便操作其他web元素的支持。

我们可以通过下列代码来确定浏览器是否支持这些DOM模块

var supportsDOM2Core = document.implementation.hasFeature("Core","2.0");

var supportsDOM3Core = document.implementation.hasFeature("Core","3.0");

var supportsDOM2HTML = document.implementation.hasFeature("HTML","2.0");

var supportsDOM2Views = document.implementation.hasFeature("Views","2.0");

var supportsDOM2XML = document.implementation.hasFeature("XML","2.0");

 

DOM0级事件处理方式

一开始浏览器处理事件的时候只有原始事件模型事件处理程序被设置为js代码串作为html的性质值例如

<input id="myButton" type="button" value="Press Me" onclick="alert('thanks');" >
    通过javascript制定事件处理程序的传统方式。就是将一个函数赋值给一个事件处理属性。第四代web浏览器出现至今为所有浏览器所支持。优点简单且具有跨浏览器的优势。
    例var btn = document.getElementById("btn");
            btn.onclick = function(){
                alert(this.id);//this指定当前元素btn
            }
删除DOM0事件处理程序只要将对应事件属性置为null即可。
btn.onclick = null;
缺点一个事件处理程序只能对应一个处理函数。

 

DOM2级事件处理方式

2级DOM包含3个事件事件捕获阶段、处于目标阶段和事件冒泡阶段
   DOM2级事件处理方式指定了添加事件处理程序和删除事件处理程序的方法。分别是
    addEventListener(eventName,func,isPuhuo);
    removeEventListener(eventName,func,isPuhuo);
    例如
    var btn = document.getElementById("btn");
    handler = function(){
        ……
    }
    addEventListener("click",handler,false/true);
    removeEventListener("click",handler,false/true);
参数分别是事件处理属性名称处理函数是否在捕获时执行事件处理函数。

      a)  eventName的值均不含on,例如注册鼠标点击事件eventName为“click”
      b)  处理函数中的this依然指的是指当前dom元素
      c)  通过addEventListener添加的事件处理程序只能通过removeEventListener来删除也就是说通过addEventListener添加的匿名函数将无法被删除。
IE中的DOM2级事件处理
      d)IE中的DOM2级事件处理使用了attachEvent和detachEvent来实现。这俩个方法接受俩个相同的参数事件处理名称和事件处理函数。IE8级更早版本只支持冒泡型事件所以attachEvent添加的事件都会被添加到冒泡阶段。
    例如
            var btn = document.getElementById("btn");
            btn.attachEvent("onclick",function(){
                alert(this);//此处this是window
            });
    注意;通过attachEvent添加的事件第一个参数是“onclick”而非标准事件中的“click”。在使用attachEvent方法和DOM0级事件处理程序的主要区别在于事件处理程序的作用域。采用DOM0级处理方式事件处理程序会在其所属元素的作用域内运行。使用attachEvent事件处理程序会在全局作用域内运行因此this等于window。

 

//将添加和删除事件处理程序封装到对象中并赋值给变量'eventUtil';

var eventUtil = {

//添加句柄

addHandler:function(element,type,handler){

//判断DOM2级事件处理程序;

if(element.addEventListener){

element.addEventListener(type,handler,false);

//判断IE浏览器;

}else if(element.attachEvent){

element.attachEvent("on"+type,handler);

//使用DOM0级事件处理程序;

}else{

element['on'+type] = handler;

}

};

//删除句柄

removeHandler:function(element,type,handler){

//判断DOM2级事件处理程序;

if(element.removeEventListener){

element.removeEventListener(type,handler,false);

//判断IE浏览器;

}else if(element.detachEvent){

element.detachEvent("on"+type,handler);

//使用DOM0级事件处理程序;

}else{

element['on'+type] = null;

};

};

};

//跨浏览器添加事件处理程序;

eventUtil.addHandler(btn3,'click',showMessage);

 

DOM3级事件处理方式

DOM浏览器中可能发生的事件有很多种不同事件类型具有不同的信息DOM3级事件规定了一下几种事件

UI事件当用户与页面上的元素交互时触发

焦点事件当元素获得或者失去焦点时触发

鼠标事件当用户通过鼠标在页面上执行操作时触发

滚轮事件当使用鼠标滚轮或类似设备时触发

文本事件当在文档中输入文本时触发

键盘事件当用户通过键盘在页面上执行操作时触发

合成事件当为IMEInput Method Editor输入法编辑器输入字符时触发

变动事件当底层Dom结构发生变化时触发

DOM3级事件模块在DOM2级事件的基础上重新定义了这些事件也添加了一些新事件。包括IE9在内的主流浏览器都支持DOM2级事件IE9也支持DOM3级事件。

DOM中的事件模拟自定义事件

DOM3级还定义了自定义事件自定义事件不是由DOM原生触发的它的目的是让开发人员创建自己的事件。要创建的自定义事件可以由createEvent("CustomEvent");

返回的对象有一个initCustomEvent方法接收如下四个参数。

1type字符串触发的事件类型自定义。例如 “keyDown”“selectedChange”;

2bubble布尔值标示事件是否应该冒泡

3cancelable(布尔值)标示事件是否可以取消

4detail对象任意值保存在event对象的detail属性中

可以像分配其他事件一样在DOM中分派创建的自定义事件对象。如

 

var  div = document.getElementById("myDiv");

EventUtil.addEventHandler(div,"myEvent", function () {

alert("div myEvent!");

});

EventUtil.addEventHandler(document,"myEvent",function(){

alert("document myEvent!");

});

if(document.implementation.hasFeature("CustomEvents","3.0")){

var e = document.createEvent("CustomEvent");

e.initCustomEvent("myEvent",true,false,"hello world!");

div.dispatchEvent(e);

}

这个例子中创建了一个冒泡事件“myEvent”。而event.detail的值被设置成了一个简单的字符串然后在div和document上侦听该事件因为在initCustomEvent中设置了事件冒泡。所以当div激发该事件时浏览器会将该事件冒泡到document。

IE中的事件模拟(IE8及之前版本中)

与DOM中事件模拟的思路类似先创建event对象再为其指定相应信息然后再使用该对象来触发事件。当然IE在实现以下每个步骤都不太一样。

例如

var btn = document.getElementById("myBtn");

//创建事件对象,不接受任何参数结果会返回一个通用的event对象你必须为该event对象指定所有必要的信息。

var event  = document.createEventObject();

//初始化事件对象

event.screenX = 100

event.screenY = 0;

event.clientX = 0;

event.clientY =0;

event.ctrlKey = false;

event.altKey = false;

event.shiftKey = false;

event.button = 0;

 

//触发事件

btn.fireEvent("onclick",event);

 

事件对象

DOM中的事件对象

//在触发DOM上的事件时都会产生一个对象==event;

type == 获取事件类型;

target == 获取事件目标;

stopPropagation() == 停止事件冒泡;

preventDefault() == 阻止事件的默认行为;

 

function showMes(event){

alert(event.type);          //onclick;点击事件;

alert(event.target.nodeName);    //INPUT;input按钮被触发;

event.stopPropagation();      //停止事件冒泡;

}

<a href="event.html" onclick="stopGoto();">跳转</a>

function stopGoto(event){

event.preventDefault();       //阻止默认行为;

}

IE中的事件对象

type == 同上;

srcElement属性 == 获取事件目标;

cancleBubble属性 == 阻止冒泡;设置true表示阻止冒泡,false为不组织冒泡;

returnValue属性 == 用于阻止事件的默认行为;

 

 

 

 

相关文章
|
2月前
|
JavaScript 前端开发 开发者
Nest.js控制器深度解析:路由与请求处理的高级特性
以上就是对 NestJS 控制层高级特性深度解析:从基本概念到异步支持再到更复杂场景下拦截其与管道等功能性组件运用都有所涉及,希望能够帮助开发者更好地理解和运用 NestJS 进行高效开发工作。
308 15
|
2月前
|
JavaScript 前端开发 IDE
TypeScript vs. JavaScript:技术对比与核心差异解析
TypeScript 作为 JavaScript 的超集,通过静态类型系统、编译时错误检测和强大的工具链支持,显著提升代码质量与可维护性,尤其适用于中大型项目和团队协作。相较之下,JavaScript 更灵活,适合快速原型开发。本文从类型系统、错误检测、工具支持等多维度对比两者差异,并提供技术选型建议,助力开发者合理选择。
541 1
|
2月前
|
存储 JavaScript 前端开发
JavaScript 语法全面解析
JavaScript 语法体系丰富且不断更新,从基础的变量声明、数据类型,到复杂的函数、对象、异步语法,每个知识点都需要开发者深入理解并灵活运用。本文梳理的 JS 语法核心内容,可为开发者提供系统的学习框架,后续还需通过大量实践(如编写交互组件、实现业务逻辑)巩固知识,逐步提升 JS 编程能力,应对前端开发中的各类挑战。
|
6月前
|
机器学习/深度学习 数据采集 JavaScript
用深度学习提升DOM解析——自动提取页面关键区块
本文介绍了一次二手车数据爬虫事故的解决过程,从传统XPath方案失效到结合深度学习语义提取的成功实践。面对懂车帝平台的前端异步渲染和复杂DOM结构,通过Playwright动态渲染、代理IP隐藏身份,以及BERT模型对HTML块级语义识别,实现了稳定高效的字段提取。此方法抗结构变化能力强,适用于复杂网页数据采集,如二手车、新闻等领域。架构演进从静态爬虫到动态爬虫再到语义解析,显著提升效率与稳定性。
229 13
用深度学习提升DOM解析——自动提取页面关键区块
|
5月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
228 19
|
7月前
|
JavaScript 前端开发 Java
【Java进阶】详解JavaScript事件
总的来说,JavaScript事件是JavaScript交互设计的核心,理解和掌握JavaScript事件对于编写高效、响应式的网页应用至关重要。
137 15
|
6月前
|
JSON 前端开发 Serverless
Mock.js 语法结构全解析
Mock.js 的语法规范介绍,从数据模板定义规范和数据占位符定义规范俩部分介绍, 让你更好的使用 Mock.js 来模拟数据并提高开发效率。
|
8月前
|
数据采集 前端开发 JavaScript
金融数据分析:解析JavaScript渲染的隐藏表格
本文详解了如何使用Python与Selenium结合代理IP技术,从金融网站(如东方财富网)抓取由JavaScript渲染的隐藏表格数据。内容涵盖环境搭建、代理配置、模拟用户行为、数据解析与分析等关键步骤。通过设置Cookie和User-Agent,突破反爬机制;借助Selenium等待页面渲染,精准定位动态数据。同时,提供了常见错误解决方案及延伸练习,帮助读者掌握金融数据采集的核心技能,为投资决策提供支持。注意规避动态加载、代理验证及元素定位等潜在陷阱,确保数据抓取高效稳定。
253 17
|
7月前
|
机器学习/深度学习 数据采集 存储
深度学习在DOM解析中的应用:自动识别页面关键内容区块
本文探讨了如何通过深度学习模型优化东方财富吧财经新闻爬虫的性能。针对网络请求、DOM解析与模型推理等瓶颈,采用代理复用、批量推理、多线程并发及模型量化等策略,将单页耗时从5秒优化至2秒,提升60%以上。代码示例涵盖代理配置、TFLite模型加载、批量预测及多线程抓取,确保高效稳定运行,为大规模数据采集提供参考。
167 0
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

推荐镜像

更多
  • DNS