DOM(《JavaScript 高级程序设计》第 10 章笔记)

本文介绍了文档对象模型(DOM)的基本概念,包括不同类型的节点及其属性,如Element、Text和Comment等,并详细阐述了如何利用DOM API进行动态脚本和样式的插入。

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

DOM

1、节点层次

文档元素是文档的最外层元素

1.1 Node 类型

每个节点都有一个 nodeType 属性,用于表明节点的类型。
为了确保跨浏览器兼容,最好还是将 nodeType 属性与数字值比较,

if(someNode.nodeType==1){  //适合所有的浏览器
    alert("Node is an element.");
}
1.1.1 nodeName 和 nodeValue 属性
  • 取决于节点的类型。使用前先检测一下节点类型。
  • 对于元素节点,nodeName 中保存的是元素的标签名,nodeVaue 的值始终是 null
1.1.2 节点关系
  • 每个节点都有一个 childNodes 属性,其中保存着 NodeList 对象。NodeList 是一种类数组的对象,有lenth 值,用于保存一组有序的节点,可以通过位置访问节点。
  • 可以使用方括号或者使用 item () 方法
  • 每个节点都有一个parentNode
1.1.3操作节点
  • 最常用的是 appendChild() ,用于向 childNodes 列表的末尾添加一个节点,返回新增的节点。
  • 使用 insertBefore() 方法放在 childNodes 列表中的某个特定位置。这个方法接受两个参数,要插入的节点和作为参照的节点。
    被插入的节点会变成参照节点的前一个同胞点,同时被方法返回。
  • replaceChild () 方法接受两个参数:要插入的节点和要替换的节点。要替换的节点将由这个方法返回并从文档树中被移除,同时插入的节点要占据其位置。
  • 移除节点 removeChild() 方法。
    ### 1.2 Document 类型
    1. nodeType 的值为 9;
    2. nodeName 的值为”#document”;
    3. nodeValue 的值为 null;
    4. parentNode 的值为 null;
    5. ownerDocument 的值为 null;
1.2.1 文档的子节点
  • 两个内置的访问其子节点的快捷方式,第一个 documentElement 属性,该属性始终指向 HTML 页面中的元素,另一个就是通过 childNodes 列表访问文档元素。
  • Document 另一个可能的子节点是 DocumentType.
1.2.2 文档信息(*)
1.2.3 查找元素
  • getElementById() 接收一个参数,要取得的元素的 ID.找得到该元素则返回该元素,找不到则返回 null;
  • getElementsByTagName().返回的是包含多个元素的NodeList。
  • getElementByName

1.3Element 类型

  1. nodeType 的值为 1;
  2. nodeName 的值为元素的标签名;
  3. nodeValue 的值为 null;
  4. parentNode 可能是Document 或 Element ;
    • 可以使用 nodeName 属性,也可以使用 tagName 属性访问属性元素;
1.3.1HTML 元素

所有 HTML 元素都由 HTMLElement 类型表示,不是直接通过这个类型。

1.3.2取得特性

有两类特殊的属性,通过 getAttribute() 返回的值并不相同。第一类特性是 stytle ,第二类是 onclick 这样的事件处理程序。

1.3.3设置特性

setAttribute() 接受两个参数:要设置的特性名和值

1.3.4attributes 属性

遍历元素的特性。

function outputAttributes(element){
    var pairs=new Array(),
        attrName,
        attrValue,
        i,
        len;
    for(i=0,len=element.attribute.length;i<len;i++){
        attrName=element.attribute[i].nodeName;
        attrValue=element.attribute[i].nodeValue;
        pairs.push(attrName+"=\""+attrValue+"\"");
    }
    return pairs.join(" ")
}
1.3.5 创建元素

使用 document.createElement() 方法创建新元素,参数为创建的元素的标签名。document.createElement();在创建新元素的同时也为新元素设置了 document.createElement() 属性。

1.3.6 元素的子节点

1.4Text 类型

  1. nodeType 的值为 3;
  2. nodeName 的值为”#text”;
  3. nodeValue 的值为节点所包含的文本;
  4. parentNode 是一个 Element;
操作节点的方法
  • appendData(text)方法将text添加到节点的末尾,该方法无返回值;
  • deleteData(offset,count)方法从offset指定的位置开始删除count个字符,无返回值;
  • insertData(offset,text)方法在offset指定的位置插入text,无返回值;
  • replaceData(offset,count,text)方法用text替换从offset指定位置开始到offset+count为止的文本,无返回值;
  • splitText()方法将一个文本节点分成两个文本节点,即按照指定的位置分割nodeValue值。原来的文本节点将包含从开始到指定位置之前的内容。这个方法会返回一个新文本节点,包含剩下的文本。splitText()方法返回的节点与原节点的parentNode相同 ;
  • 除了这些方法之外,文本节点还有一个 length 属性,保存着节点中字符的数目。
1.4.1 创建文本节点
  • 使用document.createTextNode()创建新文本节点,这个方法只接收一个参数————要插入节点中的文本。
  • 在创建新文本节点的同时,也会为其设置 ownerDocument 属性。除非把新节点添加到文档树中已经存在的节点,否则不会再浏览器窗口中看到新节点。

1.5 Comment 类型

  1. nodeType 的值为 8;
  2. nodeName 的值为”#comment”;
  3. nodeValue 的值是注释的内容;
  4. parentNode 是一个 Element 或Document;
    通过 nodeValue 或 data 属性取得注释的内容

1.6 CDATASection 类型

1.7 DocumentType 类型

1.8 DocumentFragment 类型

1.9 Attr 类型

2、DOM 的操作技术

2.1 动态脚本

  • 指的是在页面加载是不存在,但将来的某一刻通过修改 DOM 动态添加的脚本。
  • 创建动态脚本也有两种方式:插入外部文件和直接插入JS代码。

1.插入外部文件

//动态创建<script type="text/javascript" src="test.js"></script>
var script = document.createElement("script");
script.type = "text/javascript";
script.src= "test.js";
//这句放哪都可以
document.body.appendChild(script);

在执行最后一行代码把

function loadScript(url){
   var script = document.createElement('script');
   script.type= "text/javascript";
   script.src = url;
   document.body.appendChild(script);
}

loadScript("test.js");

2、行内直接插入 JS 代码(IE8 以上浏览器可运行)

var script  = document.createElement('script');
script.type = 'text/javascript';
script.text = "function sayHi(){alert('hi')}";
document.body.appendChild(script);

兼容所有浏览器

function loadScriptString(code){
  var script = document.createElement('script');
  script.type = "text/javascript";
  try{
   //除过<=IE8和Safari3及之后版本
   script.appendChild(document.createTextNode(code));
  }catch(e){
    script.text = code;
  }
  document.body.appendChild(script);
}

2.2 动态样式

能够把CSS样式包含到HTML页面中的元素有和

function loadStyles(url){
  var link = document.createElement("link");
  link.rel = "stylesheet";
  link.type = "text/css";
  link.href = url;
  var head = document.getElementsByTagName('head')[0];
  head.appendChild(link);
}

2、使用

var style = document.createElement('style');
style.type = "text/css";
style.appendChild(document.createTextNode("body{background-color: red}"));
var head = document.getElementsByTagName('head')[0];
head.appendChild(style);

兼容所有浏览器代码

function loadStyleString(css){
   var style = document.createElement('style');
   style.type = "text/css";
   try{
      style.appendChild(document.createTextNode(css));
   }catch(e){
      style.styleSheet.cssText = css;
   } 
   var head = document.getElementsByTagName("head")[0];   
   head.appendChild(style);
}

操作表格(*)

第一部分 深入理解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、付费专栏及课程。

余额充值