脚本化文档

DOM概览

文档对象模型是表示和操作HTML和XML文档内容的基础API。

HTML文档的树状表示.png

Document和Element是两个重要的DOM类。

文档结点的部分层次结构.png

commit节点代表HTML或XML的注释。

选取文档元素

为了操作文档中的元素,必须通过某种方式获得或选取这些引用文档元素的Element对象。
查询文档的一个或多个元素的方法:

  1. 用指定的id属性;
  2. 用指定的name属性;
  3. 用指定的标签名字;
  4. 用指定的CSS类;
  5. 匹配指定的CSS选择器。
通过ID选取元素

可以用Document对象的getElementByID()方法选取一个基于唯一id的元素。
<code>var section1 = dosument.getElementById("section1");</code>
如果需要通过ID查询多个元素,那么getElements()函数非常有用。

通过名字选取元素

HTML的name属性最初打算为表单元素分配名字,在表单数据提交到服务器时使用该属性的值。
基于name属性的值选取HTML元素,可以使用Document对象的getElementsByName()方法,返回一个NodeList对象。
<code>var radiobuttons = document.getElementsByName("favorite_color");</code>

通过标签名选取元素

Document对象的getElementsByTagName()方法可用来选取指定类型的所有HTML和XML元素,返回一个NodeList对象。
<code>var spans = document.getElementsByTagName("p");</code>
上述代码在文档中获得包含所有<span>元素的只读的类数组对象。
Document类的documentElement属性指代文档的根元素,在HTML文档中,它总是指代<html>元素。

通过CSS类选取元素

HTML元素的class属性值是一个以空格隔开的列表。
HTML定义了getElementByClassName()方法,它基于class属性值中的标识符来选取成组的文档元素,它的返回值是一个NodeList对象,包含文档或元素所有匹配的后代节点。

通过CSS选择器选取元素

选择器用来描述文档中的若干或多组元素。

文档结构和遍历

文档从概念上可以看做是一颗节点对象树。

作为节点树的文档

Document对象、它的Element对象和文档中表示文本的Text对象都是Node对象。

作为元素树的文档

将文档看做是element对象树。
子元素的数量,返回的值和children.length值相等。

属性

HTML属性作为Element的属性

表示HTML文档元素的HTMLElement对象定义了读/写属性,他们映射了元素的HTML属性。
特定的Element子类型为其元素定义了特定的属性,例如查询一张图片的URL,可以使用表示img元素的HTMLElement对象的src属性:
<code>
var image = document.getElementById("myimage");
var imgurl = image.src;
image.id === "myimage";
</code>
有些HTML属性名在JavaScript中是保留字。对于这些属性,一般的规则是为属性名加前缀"html"。例如HTML的for属性,在JS中变为htmlfor属性。
而"class"在JS中变成"className"。

获取和设置非标准的HTML属性

Element类型定义了getAttribute()和setAttribute()方法来查询和设置非标准的HTML属性,也可以用来查询和设置XML文档中元素上的属性。
<code>
var image = document.images[0];
var width = parseInt(image.getAttribute("WIDTH"));
image.setAttribute("class","thumbnail");
</code>
hasAttribute()和removeAttribute()用来检测命名属性是否存在和完全删除属性。

数据集属性

在HTML5文档中,任意以“data-”为前缀的额小写的属性名字都是合法的。
HTML5在Element对象上定义了dataset属性,该属性指代一个对象,它的各个属性对应于去掉前缀的data-属性。
<code>dataset.x =========== data-x
data-jquery-test =========== dataset.jqueryTest</code>

作为Attr节点的属性

Node类型定义了Attributes属性,针对非Element对象的任何节点,该属性为null。
对于Element对象,Attributes属性是只读的类数组对象,它代表元素的所有属性。
<code>document.body.attributes[0]
document.body.attributes.bgcolor</code>
当索引Attributes对象时得到的是Attr对象,Attr的name和value属性返回该属性的名字和值。

元素的内容

读取Element的innerHTML属性作为字符串标记返回那个元素的内容。

作为纯文本的元素内容

有时需要查询纯文本形式的元素内容,或者在文档中插入纯文本,标准的方法就是用Node的textContent属性来实现:
<code>
var para = document.getElementsByTagName("p")[0];
var text = para.textContent;
para.textContent = "Hello World!";
</code>
textContent属性在除了IE浏览器中都支持,在IE中,可以用Element的innerText属性来代替。
textContent属性就是将指定元素的所有后代Text节点简单地串联在一起。
innerText没有一个明确指定的行为,innerText不返回<script>元素的内容。

作为Text节点的元素内容

另一种方法处理元素的内容是当做一个子节点列表,每个子节点可能有它自己的一组子节点。当考虑元素的内容时,通常感兴趣的是它的Text节点。

创建、插入和删除节点

Document类型定义了创建Element和Text对象的方法,Node类型定义了在节点树中插入、删除和替换的方法。

创建节点
  • 创建新的Element节点可以使用Document对象的createElement()方法。给方法传递元素的标签名:
    <code>
    var newnode = document.createTextNode("text node content");
    </code>
  • 另一种创建新文档节点的方法是复制已存在的节点,每一个节点有一个cloneNode()方法来返回该结点的一个全新副本。
    给方法传递参数true能够递归的赋值所有的后代节点,传递false会进行浅复制。
插入节点

appendChild()或insertBefore()可以将新的节点插入到文档中。

  • appendChild()是在需要插入的Element节点上调用的,他插入指定的节点使其成为那个节点的最后一个子节点。
  • insertBefore()是在新节点的父节点上调用,方法的第二个参数必须是该父节点的子节点,如果参数为null,则和appendChild()方法一样,将节点插入在最后。

如果调用appendChild()和insertBefore()将已存在文档中的一个节点在此插入,那个节点将自动从它当前的位置删除并在新的位置重新插入。

删除和替换节点
  • removeChild()方法是从文档树中删除一个节点。该方法是在待删除节点的父节点上使用,并将需要删除的子节点作为方法参数传递给它。
    例如,在文档中删除m节点,代码为:
    <code>n.parentNode.removeChild(n);</code>
  • replaceChild()方法删除一个子节点并用一个新的节点取代它。在父节点上调用它,第一个参数是新节点,第二个参数是需要代替的结点。
    例如,用一个文本字符串来替换节点n,代码为:
    <code>n.parentNode.replaceChild(document.createTextNode("[REDACTED]"),n);</code>
使用DocumentFragment

DocumentFragment是一种特殊的Node,它作为其他节点的一个临时容器。像这样创建一个DocumentFragment:
<code>
var frag = docuemnt.createDocumentFragment();
</code>
它的parentNode总是为null。
它的特点是使得一组节点被当做一个结点看待:如果给appendChild()、insertBefore()、replaceChild()传递一个DocumentFragment,其实是将该文档片段的所有子节插入到文档中,而非片段本身。

文档和元素的集合形状和滚动

文档坐标和视口坐标
  • 查询窗口滚动条的位置
    scrollLeft 、scrollTop
  • 查询窗口的视口尺寸
    clientWidth 、clientHeight(他们对于i、code、span等内联元素返回值为0)
查询元素的几何尺寸

判定一个元素的尺寸和位置最简单的方法是调用getBoundingClientRect()方法。没有参数,返回一个由left、right、top和bottom属性的对象。
<code>
var box = e.getBoundingClientRect();
var offsets = getScrollOffsets();
var x= box.left + offsets.x;
var y = box.top + offsets.y;
</code>
返回height和width属性:
<code>
var box = e.getBoundingClientRect();
var w = box.width || (box.right-box.left);
var h = box.height || (box.bottom - box.top);
</code>

判定元素在某点

用Document对象的elementFromPoint()方法来判定元素在某个点。
传递x和y坐标,返回一个在指定位置的一个元素,如果指示的点在视口以外,elementFromPoint()返回Null.

滚动

Window对象的scroll()方法接收一个点的x和y坐标,并作为滚动条的偏移量设置它们。
<code>
var documentHeight = document.documentElement.offsetHeight;
var viewportHeight = window.innerHeight;
window.scrollTo(0,documentHeight-viewportHeight);
</code>

关于元素尺寸、位置和溢出的更多信息

offsetParent属性指定offsetLeft和offsetTOP属性所相对的额父元素,如果offsetParent为null,这些属性都是文档坐标。

HTML表单

HTML表单元素
HTML常用表单元素.png
选取表单和表单元素

表单和他们所包含的元素可以用如getElementById()和getElementsByTagName()等方法从文档中来选取:
<code>
var fields = document.getElementById("address").getElementsByTagName("input");
</code>

表单和元素的属性

elements[]数组时Form对象中最有趣的属性。

  • action、encoding、method和target属性直接对应于<form>元素的action、encoding、method和target等HTML属性。
  • Form支持submit()和reset()方法来提交和重置表单。
表单和元素的事件处理程序

每个Form元素都有一个onsubmit事件处理程序来侦测表单提交,还有一个onreset事件处理程序来侦测表单重置。

  • <i>onsubmint事件处理程序只能通过单击"提交"按钮来触发。在表单提交前调用,通过返回false能够取消提交动作。</i>
  • <i>onreset事件处理程序在表单重置之前调用,通过返回false能够阻止表单元素被重置,并且只能通过单击“重置”按钮被触发”。</i>
按钮

按钮本身没有默认的行为,除非他有onclick事件处理程序。

  • 以<inout>元素定义的按钮会将value属性值以纯文本显示。
  • 以<button>元素定义的按钮会将元素的一切内容显示出来。
开关按钮

复选框和单选元素就是开关按钮。

文本域

value属性表示用户输入的文本,通过设置该属性值可以显式地指定应该再输入域中显式的文本。
在h5中,placeholder属性制定了用户输入前在输入域中显示的提示信息:
<code>
Arrival Stae:<input type = "text" name = "arrival" placeholder = "yyyy-mm-dd">
</code>
文本输入域的onchange事件处理程序是在用户输入新的文本或编辑已存在的文本时触发,他标明用户完成了编辑并将焦点移出了文本域。

选择框和选项元素

Select元素表示用户可以做出选择的一组选项。当其size大于1时,它将显示为列表中的选项。

  • 如果Select元素有mutiple属性,也就是Select对象的type属性值为"select-mutipe",那就允许用户选取多个选项
  • 否则,只能选取一个选项,它的type 属性值为"select-one".

其他文档属性

Document的属性
  • cookie
    允许JavaScript程序读、写HTTP cookie的特殊的属性。
  • domain
    该属性允许当Web页面之间交互时,相同域名下相互信任的Web服务器之间协作放宽同源策略安全限制。
  • lastModified
    包含文档修改时间的字符串
  • location
    与Window对象的location属性引用同一个Location对象。
  • referrer
    表示浏览器导航到当前连接的上一个文档。
  • URL
    文档的URL,只读字符串而不是Location对象。
Document.write()方法

document.write()会将其字符串参数连接起来,然后将结果字符串插入到文档中调用它的脚本元素的位置。当脚本执行结束,浏览器解析生成的输出并显示它。

只有在解析文档时才能使用write()方法输出HTML到当前文档中。在设置了defer和async属性的脚本中不要使用document.write()。

还可以使用write()方法在其他窗口或框架页中来创建整个全新文档。

Document.writeln()方法在参数的输出之后追加一个换行符。
查询选取的文本

标准的window.getSelection()方法返回一个Selection对象,后者描述了当前选取的一系列一个或多个Range对象。toString()方法是Selection对象中的特性,返回选取的纯文本内容。但是无法返回表单元素中的文本。
IE浏览器中使用createRange()方法返回IE特有的TextRange对象,它的text属性包含了选取的文本,可以返回文档中任意地方选取的文本。

可编辑的内容
  • 设置任何标签的HTML contenteditable属性
  • 设置对应元素的JavaScript contenteditable属性
    是元素的内容变成可编辑,当用户单击该元素的内容时就会出现插入光标,用户敲击键盘就可以插入其中。
  • 将Document对象的designMode属性设置为字符串"on"使得整个文档可编辑。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • DOM概览 上图的每个方框是文档的一个节点,它表示一个Node对象。 选择文档元素 获取文档的一个或多个元素有如下...
    kissLife阅读 671评论 0 0
  • DOM概览 文档对象模型(DOM)是表示和操作HTML和XML文档内容的基础API。 选取文档元素 用指定的id属...
    ForeverYoung20阅读 226评论 0 0
  • 文档和元素的几何形状和滚动 当浏览器在窗口中渲染文档时,它创建文档的一个视觉表现层,在那里每个元素有自己的位置和尺...
    kissLife阅读 751评论 0 0
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 2,721评论 0 8
  • 看完《少年巴比伦》心中竟情不自禁,对爱情产生了一丝丝的向往,我谈过一次不成功的恋爱,曾经向往着为这个人付出一切,可...
    文小梦阅读 497评论 0 0