JS 进阶 (六) 浏览器事件模型DOM操作(2)

简介: JS 事件事件是元素(或者浏览器)天生自带的行为,只要行为处罚,就会触发相关的事件xxx.onclick = function(){} 属于事件绑定,给这个事件行为绑定方法,行为触发的时候事件参考文档

JS 事件

事件是元素(或者浏览器)天生自带的行为,只要行为处罚,就会触发相关的事件

xxx.onclick = function(){} 属于事件绑定,给这个事件行为绑定方法,行为触发的时候

事件参考文档

【事件】

  • 鼠标事件
  • click 点击
  • dbclick 双击
  • mousedown/mouseup/mousemove
  • mouseover/mouseout
  • mouseenter/mouseleave
  • wheel 滚轮
  • 表单事件
  • focus/blur 获取、失去焦点
  • change 内容改变
  • 键盘事件
  • keyup/keydown
  • keyepress
  • 手势事件
  • touchstart/touchend/toucemove 单指
  • gesture 多指事件
  • 拖放事件
  • dragstart / drag / dragend
  • dragenter 进入投放区
  • dragover/dragover
  • drop 释放
  • 媒体事件
  • 值变化事件
  • hashchanghe 浏览器地址栏 hash 变化触发事件
  • input 表单正在输入内容。。。
  • 其他事件
  • offline/online 断网或者连网
  • animationstart/iteration CSS3Animation 动画事件
  • transitionstart/end。run CSSTranslation 动画事件
  • fullscreenchange 全凭切换事件
  • resize 窗口大小改变
  • scroll 滚动条滚动
  • load 加载完
  • error 加载失败
  • timeout 加载超时
  • progress 加载中

【事件绑定】

  • 1、DOM0 级事件绑定
    元素.onxxx = function(){...}
  • 2、DOM2 级事件绑定
    在 EventTarget.prototype 添加了 addEventListener/removeEventLister/dispatchEvent
    非标准浏览器(IE<=8)没有这个东西,只有 attachEvent/datachevent(里面 this 不是当前元素)
    xxx.addEventListener('xxx',function(){...})

【DOM 事件绑定原理】

每一个 DOM 元素对象内都有很多内置属性,其中包含 onxxx 这样的事件类型的私有属性

DOM0事件绑定原理就是给这些事件类私有属性赋值

特点: 如果不存在不绑定,只能绑定一个方法

DOM2 事件绑定

box.addEventListener('click',function(){})

DOM2 事件可以绑定多个,他是通过浏览器事件池机制来做的

问: window.onload 和 document.ready 区别($(document).ready())?

答: jq 中的 document.ready 的原理是使用了 DOM2 级事件绑定,通过

window.addEventlistener("DOMContentLoad", ()=>{...}) 可以在一个页面中执行多次这个方法,而且它是 DOM 加载完后执行

window.onload 是基于 DOM0 级事件绑定,只能在页面初始的时候执行一次,而且需要所有资源加载完后才执行,所以 window.addEventlistener("DOMContentLoad", ()=>{...})比 window.onload 执行的更快

事件对象和事件传播机制

  • 事件对象
    当事件触发、浏览器会把制定的方法执行,并且把全局下记录的当前操作信息的'事件对象'传递给这个函数 ,不管在哪个函数中,获取到的是同一个对象,存储的是当前操作的信息,和函数没关系
let n;
document.bofy.onclick = function (ev) {
  console.log("Body");
  console.log(ev === n);
};
box.onclick = function (ev) {
  console.log("Box");
  console.log(ev);
};

事件对象

  • 【鼠标事件对象】MouseEvent
    clientX/clientY: 鼠标触发点距离当前窗口左上角x/y坐标
    pageX/pageY:鼠标触发点距离当前页面Body的左上角x/y坐标
    path:[...]: 存储的是冒泡阶段传播的路径,(值是捕获阶段获得的)
    srcElement/target: 事件源,当前操作的元素,在哪触发的
    type: 事件类型
  • 【键盘事件对象】KeyboardEvent
    which/keyCode 键盘码
    altKey/shiftKey/ctrlKey 记录是否在按键的时候按了,组合按键,属性是布尔
  • 【常规事件对象】Event
    e.preventDefault()  / e.returnValue  阻止事件默认行为
     ```js
        // 设置点击ctrl+f 刷新
        document.onkeydown = function (ev) {
          console.log(ev);
          ev.preventDefault() || ev.returnValue;
          let { ctrlKey, keyCode } = ev;
          if (ctrlKey && keyCode === 70) {
            window.location.reload();
          }
        };
        // 禁止右键打开菜单
        document.oncontextmenu = function (ev) {
            ev.preventDefault()
            // return false
        };
     ```
  • e.stopPropagation() / e.cancelBubble 阻止事件的冒泡
// 事件具备传播机制
+ 捕获阶段 CAPTURING_PHASE: 1
+ 目标  AT_TARGET: 2
+ 冒泡  BUBBLING_PHASE
1、当我们触发当前元素的事件行为的时候,首先从最外层window开始,一层层的按照结构向里层查找 —— 捕获阶段(目的是为冒泡提供传播路径)
2、找到当前的事件源,触发当前的相关行为 —— 目标阶段
3、不仅当前事件源的相关行为被触发,其所有祖先元素的相关事件行为都会被触发,(由里向外) —— 冒泡阶段
⚠️注意:DOM0级事件中只有冒泡事件,DOM2级事件中xxx.addEventListener('click',function(){}, false) , 第三个参数是可以控制在冒泡还是捕获阶段触发,默认false,冒泡,改成true为捕获阶段,但是很少用
⚠️:大部分时间默认就存在冒泡机制,但是少部分事件天生就自己阻止了冒泡传播
  mouseenter/mouseleave // 进入离开 默认阻止了冒泡传播
  mouseover/mouseout  // 悬浮 没有阻止冒泡 很恶心 最好不用 或者阻止冒泡事件
  • 【手指事件对象】TouchEvent
  • ...
  • 事件对象中常用的属性
  • target & srcEvent
  • type
  • code & key
  • keyCode & which
  • which/keyCode
  • clientY/clientX
  • pageX/pageY
  • preventDefault
  • stopPropagation

相关文章
|
7月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
200 23
|
7月前
|
JavaScript 前端开发 Java
【Java进阶】详解JavaScript事件
总的来说,JavaScript事件是JavaScript交互设计的核心,理解和掌握JavaScript事件对于编写高效、响应式的网页应用至关重要。
126 15
|
10月前
|
Web App开发 前端开发 JavaScript
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
2015年,JavaScript之父Brendan Eich再次创业,推出Brave浏览器和加密货币Basic Attention Token(BAT),旨在颠覆传统广告行业。Brave屏蔽广告、保护隐私,加载速度快;BAT则通过奖励机制让用户、内容创作者和广告主三方受益。尽管面临用户习惯和巨头竞争的挑战,Brave已拥有超4000万月活跃用户,成为全球增长最快的隐私浏览器,引领Web3生态发展。
355 22
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
|
8月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
12月前
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
315 57
|
10月前
|
JavaScript 前端开发 测试技术
盘点原生JavaScript中直接触发事件的方式
本文全面探讨了原生JavaScript中触发事件的多种方式,包括`dispatchEvent`、`Event`构造函数、`CustomEvent`构造器、直接调用事件处理器以及过时的`createEvent`和`initEvent`方法。通过技术案例分析,如模拟点击事件、派发自定义数据加载事件和实现提示框系统,帮助开发者掌握这些方法在实际开发中的应用,提升灵活性与兼容性。
341 3
|
12月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
412 5
|
12月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
274 63
|
JSON 移动开发 JavaScript
在浏览器执行js脚本的两种方式
【10月更文挑战第20天】本文介绍了在浏览器中执行HTTP请求的两种方式:`fetch`和`XMLHttpRequest`。`fetch`支持GET和POST请求,返回Promise对象,可以方便地处理异步操作。`XMLHttpRequest`则通过回调函数处理请求结果,适用于需要兼容旧浏览器的场景。文中还提供了具体的代码示例。
194 5
在浏览器执行js脚本的两种方式
|
12月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
1554 1