最近要写一些八股文,上网一搜,好多范例,正想下载下来借鉴以下,可惜不让复制粘贴。不过难不倒我,直接使用文档对象模型(Document Object Model,DOM)提供编程接口,将整篇文章下来。
DOM概述
DOM简介
文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
一个web页面是一个文档。这个文档可以在浏览器窗口或作为HTML源码显示出来。但上述两个情况中都是同一份文档。文档对象模型(DOM)提供了对同一份文档的另一种表现,存储和操作的方式。 DOM是web页面的完全的面向对象表述,它能够使用如 JavaScript等脚本语言进行修改。
DOM 和 JavaScript
开始的时候,JavaScript和DOM是交织在一起的,但它们最终演变成了两个独立的实体。JavaScript可以访问和操作存储在DOM中的内容,因此我们可以写成这个近似的等式:
1 | API (web 或 XML 页面) = DOM + JS (脚本语言) |
DOM 被设计成与特定编程语言相独立,使文档的结构化表述可以通过单一,一致的API获得。尽管通常使用JavaScript操作DOM, 但DOM 也可以使用其他的语言来实现。
DOM访问
在使用DOM时,您不需要做任何其他特殊的操作。不同的浏览器都有对DOM不同的实现, 这些实现对当前的DOM标准而言,都会呈现出不同程度的一致性,每个web浏览器都会使用一些文档对象模型,从而使页面可以被脚本语言访问。
当您在创建一个脚本时-无论是使用内嵌 <script>元素或者使用在web页面脚本加载的方法— 您都可以使用 document或 window 元素的API来操作文档本身或获取文档的子类(web页面中的各种元素)。
您的DOM编程代码可能会像下面例子一样非常简单,如使用 window对象的alert()函数显示一个警告信息,或者使用比较复杂的方法来创建一个新的内容,如下面内容较长的实例所示。
1 | <body onload="window.alert('welcome to my home page!');"> |
重要的数据类型
为简单起见,在API参考文档中的语法实例通常会使用element(s) 指代节点,使用nodeList(s)或 element(s)来指代节点数组,使用 attribute(s)来指代属性节点。
数据类型 | 解释 |
---|---|
document | 当一个成员返回 document 对象 (例如,元素的 ownerDocument 属性返回它所属于 document ) ,这个对象就是root document 对象本身。 DOM document Reference 一章对 document 对象进行了描述。 |
element | element 是指由 DOM API 中成员返回的类型为 element 的一个元素或节点。 例如, document.createElement() 方法会返回一个 node 的对象引用,也就是说这个方法返回了在DOM中创建的 element。 element 对象实现了 DOM Element 接口以及更基本的 Node 接口,参考文档将两者都包含在内。 |
nodeList | nodeList 是一个元素的数组,如从 document.getElementsByTagName() 方法返回的就是这种类型。 nodeList 中的条目由通过下标有两种方式进行访问:list.item(1)和list[1]。两种方式是等价的,第一种方式中 item() 是 nodeList 对象中的单独方法。 后面的方式则使用了经典的数组语法来获取列表中的第二个条目。 |
attribute | 当 attribute 通过成员函数 (例如,通过 createAttribute()方法) 返回时,它是一个为属性暴露出专门接口的对象引用。DOM中的属性也是节点,就像元素一样,只不过您可能会很少使用它。 |
namedNodeMap | namedNodeMap 和数组类似,但是条目是由name或index访问的,虽然后一种方式仅仅是为了枚举方便,因为在 list 中本来就没有特定的顺序。 出于这个目的, namedNodeMap 有一个 item() 方法,你也可以从 namedNodeMap 添加或移除条目。 |
DOM 的最小组成单位叫做节点(node)。文档的树形结构(DOM 树),就是由各种不同类型的节点组成。每个节点可以看作是文档树的一片叶子。
节点的类型有七种。
- Document:整个文档树的顶层节点
- DocumentType:doctype标签(比如<!DOCTYPE html>)
- Element:网页的各种HTML标签(比如<body>、<a>等)
- Attribute:网页元素的属性(比如class=”right”)
- Text:标签之间或标签包含的文本
- Comment:注释
- DocumentFragment:文档的片段
浏览器提供一个原生的节点对象Node,上面这七种节点都继承了Node,因此具有一些共同的属性和方法。
DOM中核心接口
在DOM编程时,通常使用的最多的就是 Document 和 window 对象。简单的说, window 对象表示浏览器中的内容,而 document 对象是文档本身的根节点。Element 继承了通用的 Node 接口, 将这两个接口结合后就提供了许多方法和属性可以供单个元素使用。在处理这些元素所对应的不同类型的数据时,这些元素可能会有专用的接口,如上节中的 table 对象的例子。
下面是在web和XML页面脚本中使用DOM时,一些常用的API简要列表。
- document.getElementById(id)
- document.getElementsByTagName(name)
- document.createElement(name)
- parentNode.appendChild(node)
- element.innerHTML
- element.style.left
- element.setAttribute()
- element.getAttribute()
- element.addEventListener()
- window.content
- window.onload
- window.dump()
- window.scrollTo()
Element的尺寸
- scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大。
- clientWidth:对象内容的可视区的宽度,不包滚动条等边线,会随对象显示大小的变化而改变。
- offsetWidth:对象整体的实际宽度,包滚动条等边线,会随对象显示大小的变化而改变。
当元素内容没有超过可视区域
元素内无内容或者内容不超过可视区,滚动不出现或不可用的情况下。
scrollWidth=clientWidth,两者皆为内容可视区的宽度。
offsetWidth为元素的实际宽度。
文档下载实战
以示例范文为例,提取其中内容。
禁止复制粘贴的原理
- 阻止默认的事件响应
1 | <script type="text/javascript"> |
- CSS阻止用户选择
1 | element.style { |
破解禁止复制粘贴
使用chrome打开该网页,在使用快捷键ctrl+shift+i,打开开发者工具,找到文档节点DIV的id为article,使用如下代码提取文章内容:
1 | var node=document.getElementById('article') |
DOM事件机制
参考链接
- DOM 模型概述,by 阮一峰.
- DOM概述,by MDN web DOC.
- 网页上如何实现禁止复制粘贴以及如何破解,by 小茗同学.
- scrollWidth,clientWidth,offsetWidth等等的区别,by 南果梨.
- javascript中top、clientTop、scrollTop、offsetTop的讲解,by 小豆soybean.
- 令人头疼的clientTop、scrollTop、offsetTop,by 凌晨风.
- DOM的事件机制,以及事件的捕获与冒泡,by 墨城之左.
- DOM事件机制以及事件委托总结,by 余小兔.