JavaScript DOM 高级程序设计读书笔记二

本文介绍了事件处理机制,包括事件的类型、事件流的概念及如何注册事件侦听器。同时,详细探讨了如何通过JavaScript动态修改元素样式,包括使用style属性、setProperty方法以及通过更改className实现样式切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

响应用户操作和事件

事件就是操作检测与脚本执行的组合,或者基于检测到的操作类型在某个对象上调用事件侦听器(事件处理程序)。

事件的类型

事件可以分为几种类型:对象事件,鼠标事件,键盘事件(只适用于document对象),表单事件,自定义事件。
943694-20190406154717153-122026917.png

控制事件流和注册事件侦听器

事件流描述的是从页面中接收事件的顺序;事件侦听器,就是一个常规的JavaScript函数。

三个阶段和三个模型

事件冒泡:指的是目标元素的事件方法优先并且会被首先执行,然后,事件会向外传播到每个祖先元素,直至document对象。由Microsoft IE提出的冒泡型事件流;
事件捕获:把优先权赋予最外层的祖先元素,事件相应地被由外向内传播,直至抵达目标元素。由Netscape提出的捕获型事件流;
在W3C DOM2 事件模型中,当目标元素被单击时,首先是经过事件捕获阶段,接着是处于目标阶段,最后是事件冒泡阶段;
943694-20190407111625363-594555726.png
阻止冒泡
可以在事件对象上调用stopPropagation()方法,对于IE, 需要将事件的cancelBubble属性设置为true。
取消默认动作
与事件流有关的最后一个问题就是默认动作。DOM2 事件规范中提供了使用事件的preventDefault()方法取消默认动作的方式。

注册事件的四种事件模型

1. 嵌入式注册模型
例如:

<a href="http://www.google.com" onclick = "alert('11'); return false;">ie</a>

缺点:使标记混乱不堪
2. 传统的事件模型
例如:

window.onload = function(){}

传统的方法从属于浏览器默认的事件流,没有办法指定是在捕获阶段还是在冒泡阶段调用事件。
3. IE事件模型
例如:

window.attachEvent('onload', function(){});

缺点:只对IE有效,对其他浏览器毫无用处;其次,this 引用的是原始JavaScript函数,而不是附加事件侦听器的那个对象。
4. W3C DOM2 事件模型
DOM2事件规范中包含addEventListener()和removeEventListener()方法,这两个方法接受3个参数(事件,事件侦听器,事件阶段),第三个参数是true表示事件侦听器在捕获阶段内执行,否则,如果为false,则会在冒泡阶段发生(默认是false)。此外,W3C 采取了去掉on前缀的方案,因此所有事件都必须使用事件名称而非传统的方法名称来标识。例如:

window.addEventListener('load', function(e){}, false);
//在W3C的模型中,事件侦听器会取得一个表示事件自身的参数。但在IE中,事件对象被保存在window.event中。
DOM2 事件规范中的Event对象属性和方法
  • type: 是一个包含事件名称的字符串值;
  • target: 是DOM文档中最早调用事件序列的目标对象,IE浏览器提供的是srcElement属性;
  • currentTarget: 是当前正在处理的事件侦听器所在的事件流中的DOM元素;
  • preventDefault(): 取消对象的默认动作,比如:浏览器重定向到一个锚元素的href属性的动作;
  • stopPropagation(): 用于停止事件流的进一步执行,包括捕获阶段,目标对象和冒泡阶段;
DOM2 事件规范中的MouseEvent对象属性

943694-20190406230052341-320185118.png
处理鼠标相对于文档原点的位置的兼容性处理:

function getPointerPositionInDocument(event) {
  let e = event || window.event;
  let x = e.pageX || (e.clientX + 
    document.documentElement.scrollLeft || document.body.scrollLeft);
  let y = e.pageY || (e.clientY + 
    document.documentElement.scrollTop || document.body.scrollTop);
  return { 'x': x, 'y': y };
}

处理文档/页面水平/垂直方向滚动的像素值:

/*pageXOffset, pageYOffset 属性是 scrollX, scrollY 属性的别名。window.pageXOffset == window.scrollX; // 总是 true
为了跨浏览器兼容性,请使用 window.pageXOffset 代替 window.scrollX。另外,旧版本的 IE(<9)两个属性都不支持,必须通过其他的非标准属性来解决此问题。
完整的兼容性代码如下:
*/
var supportPageOffset = window.pageXOffset !== undefined;
var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");
var x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft;
var y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;
//代码来自MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/scrollY

动态修改样式和层叠样式表

CSSStyleDeclaration对象

这个对象用于表示一个元素的style属性。

  • cssText: 包含以字符串形式表示的全部规则;
  • parentRule: 将引用CSSStyleRule对象;
  • getPropertyValue(propertyName): 返回一个字符串形式的CSS样式属性值;
  • removeProperty(propertyName): 从声明中移除特定的属性;
  • setProperty(propertyName, value, priority): 用于设置特定CSS属性的值;

将样式置于DOM脚本之外

1. style 属性
当在小范围内修改表现时,你可能会经常使用 HTMLElement 元素的 style 属性来修改其表现。但修改style属性存在如下两个主要问题:

  • 使用 style 属性将设计样式嵌入到行为层的DOM脚本中,并不比在语义标记中使用 style 属性更好。
  • 通过 style 属性只能访问到在元素的style属性中以嵌入方式声明的CSS属性。换句话说,通过style属性无法访问由多重样式层叠表而来或者从父元素继承的任何css属性。

2. setProperty(propertyName, value, priority)
除了可以使用style属性直接设置css属性(例如:element.style.color = 'red';)外,DOM2样式规范为CSSStyleDeclaration对象定义了相应的方法,比如setProperty()就使用固有的带连字符的CSS属性名称和值:例如:element.style.setProperty('background-color', 'red');。但非标准的浏览器(例如IE)不支持这种方法。
3. 基于className切换样式
使用方法:element.className = 'newClassName';,此方法的优点是在所有浏览器中都有效。

访问计算样式

DOM2 样式规范在document.defaultView中包含了一个名叫getComputedStyle()的方法,恰好是为这个目的而设计的。该方法返回一个只读的CSSStyleDeclaration对象,其中包含特定元素的所有计算样式,而不仅仅是以嵌入方式定义的样式。

转载于:https://www.cnblogs.com/sunshine21/p/10660540.html

第一部分 深入理解DOM脚本编程  第1章 遵循最佳实践    1.1 不唐突和渐进增强    1.2 让JavaScript运行起来     1.2.1 把行为从结构中分离出来     1.2.2 不要版本检测     1.2.3 通过平稳退化保证可访问性     1.2.4 为重用命名空间而进行规划     1.2.5 通过可重用的对象把事情简化     1.2.6 一定要自己动手写代码    1.3 JavaScript语法中常见的陷阱     1.3.1 区分大小写     1.3.2 单引号与双引号      1.3.3 换行     1.3.4 可选的分号和花括号     1.3.5 重载(并非真正的重载)     1.3.6 匿名函数     1.3.7 作用域解析和闭包     1.3.8 迭代对象     1.3.9 函数的调用和引用(不带括号)    1.4 实例:WYSIWYGJavaScript翻转图    1.5 小结   第2章 创建可重用的对象    2.1 对象中包含什么     2.1.1 继承     2.1.2 理解对象成员     2.1.3 window对象中的一切     2.1.4 理解作用域和闭包是根本    2.2 创建你自己的对象     2.2.1 一变多:创建构造函数     2.2.2 添加静态方法     2.2.3 向原型中添加公有方法     2.2.4 公有、私有、特权和静态成员真那么重要吗     2.2.5 对象字面量    2.3 this是什么    2.4 try{}、catch{}和异常处理    2.5 实例:你自己的调试日志     2.5.1 为什么需要JavaScript日志对象     2.5.2 myLogger()对象    2.6 小结   第3章 DOM2核心和DOM2 HTML    3.1 DOM不是JavaScript,它是文档    3.2 DOM的级别     3.2.1 DOM 0 级     3.2.2 DOM 1 级     3.2.3 DOM 2 级     3.2.4 DOM 3 级     3.2.5 哪个级别适合你    3.3 创建示例文档     3.3.1 创建DOM文件     3.3.2 选择一个浏览器   3.4 DOM核心     3.4.1 继承在DOM中的重要性     3.4.2 核心Node对象     3.4.3 核心Element对象     3.4.4 核心Document对象     3.4.5 遍历和迭代DOM树    3.5 DOM HTML     3.5.1 DOM2 HTML 的HTMLDocument对象     3.5.2 DOM2 HTML 的HTMLElement对象    3.6 实例:将手工HTML代码转换为DOM代码     3.6.1 DOM生成工具的HTML文件     3.6.2 使用示例HTML片段进行测试     3.6.3 扩充ADS库     3.6.4 generateDOM对象的框架    3.7 小结   第4章 响应用户操作和事件    4.1 DOM2级事件    4.2 事件的类型     4.2.1 对象事件     4.2.2 鼠标移动事件     4.2.3 鼠标单击事件     4.2.4 键盘事件     4.2.5 表单相关的事件     4.2.6 针对W3C DOM的事件     4.2.7 自定义事件    4.3 控制事件流和注册事件侦听器     4.3.1 事件流     4.3.2 注册事件     4.3.3 在事件侦听器中访问事件对象     4.3.4 跨浏览器的事件属性和方法    4.4 小结   第5章 动态修改样式和层叠样式表    5.1 W3CDOM2样式规范     5.1.1 CSSStyleSheet对象     5.1.2 CSSStyleRule对象     5.1.3 CSSStyleDeclaration对象     5.1.4 支持的匮乏    5.2 当DOM 脚本遇到样式    5.3 把样式置于DOM脚本之外     5.3.1 style属性     5.3.2 基于className切换样式     5.3.3 切换样式表     5.3.4 修改CSS规则    5.4 访问计算样式    5.5 Microsoft的filter属性    5.6 实例:简单的渐变效果    5.7 小结   第6章 案例研究:图像裁剪和缩放工具    6.1 测试文件    6.2 imageEditor对象     6.2.1 调用imageEditor工具     6.2.2 imageEditor载入事件     6.2.3 创建编辑器标记和对象     6.2.4 向imageEditor对象添加事件侦听器     6.2.5 缩放图像     6.2.6 裁剪图像     6.2.7 未完成的图像编辑器    6.3 小结  第部分 浏览器外部通信  第7章 向应用程序中加入Ajax    7.1 组合的技术     7.1.1 语义化XHTML和DOM     7.1.2 JavaScript和XMLHttpRequest对象     7.1.3 XML     7.1.4 一个可重用的对象     7.1.5 Ajax是正确的选择吗    7.2 为什么Ajax会破坏网站及如何解决     7.2.1 依赖JavaScript生成内容     7.2.2 通过script标签绕过跨站点限制     7.2.3 后退按钮和书签功能     7.2.4 完成请求的赛跑     7.2.5 增加资源占用     7.2.6 问题解决了吗    7.3 实例:Ajax增强的相册    7.4 小结   第8章 案例研究:实现带进度条的异步文件上传功能    8.1 信息载入时的小生命    8.2 起点    8.3 完成整合:上传进度指示器     8.3.1 addProgressBar()对象的结构     8.3.2 载入事件     8.3.3 addProgressBar()对象    8.4 小结  第三部分 部分高级脚本编程资源  第9章 通过库来提高生产力    9.1 选择合适的库    9.2 增强DOM操作能力     9.2.1 连缀语法     9.2.2 通过回调函数进行过滤     9.2.3 操纵DOM文档    9.3 处理事件     9.3.1 注册事件     9.3.2 自定义事件    9.4 访问和操纵样式    9.5 通信    9.6 小结   第10章 添加效果增强用户体验    10.1 自己动手实现效果     10.1.1 让我看到内容     10.1.2 提供反馈    10.2 几个视觉效果库简介    10.3 视觉盛宴     10.3.1 MOO式的CSS属性修改     10.3.2 通过Script.aculo.us实现视觉效果     10.3.3 通过Moo.fx实现逼真的运动效果     10.3.4 圆角效果     10.3.5 其他库    10.4 行为增强    10.5 小结   第11章 丰富的Mashup!运用API添加地图、搜索及更多功能    11.1 API密钥    11.2 客户端API:离不开JavaScript     11.2.1 地图中的Mashup应用     11.2.2 Ajax搜索请求     11.2.3 地图与搜索的Mashup应用    11.3 服务器端API:需要代理脚本     11.3.1 通过Basecamp构建集成的To-Do列表     11.3.2 通过Flickr取得个性头像    11.4 小结   第12章 案例研究:用DOM设计选择列表    12.1 经典的感觉    12.2 构建更好的选择列表    12.3 策略?我们不需要臭哄哄的策略     12.3.1 相关的文件     12.3.2 FauxSelect对象     12.3.3 开始创建人造select元素     12.3.4 查找select元素     12.3.5 构建DOM元素    12.4 添加事件——为人造select赋予生命    12.5 让表单绽放光彩    12.6 行为修正     12.6.1 z-index来救急     12.6.2 键盘控制及其他细节     12.6.3 select太大了吗    12.7 最后的细节    12.8 继续替换select的冒险    12.9 小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值