有关DOM的小总结

  一直以为DOM(文档对象模型)是JS中最简单的一部分。不可否认,它确实很简单,因为DOM的思维模式有点固定,只需要简单地记住一些固定的方法,所以DOM可以说是所有js(这里指的是客户端的js)入门的起手点。

  最近我在做一些有用到DOM的练习时,发现自己的DOM知识非常零散(一直以为掌握的很好),可能有很多朋友都觉得,DOM嘛,也就调用调用几个方法,或者我直接使用jQuery,根本不用考虑DOM的细节。是,这也没错,jQuery对DOM的封装可谓前无古人,但是正如成长一样,跑之前是一定要会走的,所以我认为对DOM必须要有比较详细的了解,于是我总结了如下的关于DOM的一些使用方法。

  在W3C总结跪DOM规范中,有一些十分常用的,也有些不怎么有用的,这里我们主要讨论常用一些DOM操作(有关DOM的基本概念在此就不介绍了):

  节点层次

  所谓节点层次,指的是html文档中存在具有各自特点,数据,方法的节点(例如标签),节点之间的关系构成了层次(其实可以想象成树状结构)。W3C的DOM1级规范中定义了一个NODE接口。这个接口有一些方法是非常有用的:

  Node.ELEMENT_NODE;(元素节点)

  Node.TEXT_NODE;(文本节点)

  Node.DOCUMENT_NODE(文档节点)

  而每个节点都有自己的节点类型标志,也就是NodeType属性,例如元素节点的nodeType == ‘1‘;文本节点的nodeType == ‘3‘;文档节点的nodeType == ‘9‘;

  

  1.文档节点

    文档节点在一个文档中用document对象表示,它的基本特征如下:

console.log(document.nodeType); // 9
console.log(document.nodeName); // #document
console.log(document.nodeValue); // null
console.log(document.parentNode); // null(它已经是最顶层的节点,树的根节点)

  tip one (文档的子节点):

    1.document.documentElement可以取到html对象,同样可以通过document.childNodes[0]以及document.firstchild取到。然而    documentElement可以更快,更直接访问元素。

  

  tip two (文档的相关信息):

    1.取得文档标题 : document.title;

    2.取得完整的url : document.URL;

    3.取得域名(ip) : document.domain;

    4.取得页面的URL : document.referrer;

  

  tip three (文档查找元素):

    1.通过id : document.getElementById("xxx");  一般页面id会不同,若有多个相同id,则取到第一个有该id的元素。

    2.通过tagName : document.getElementsByTagName("xxx"); 返回标签名为"xxx"的元素集合!

    3.通过name : document.getElementByName();

  理解document对象非常简单,兼容性做的也比较靠前。

  2.元素节点

  元素节点提供了对元素标签名,子节点及特性的访问。它的基本特征如下:

var ele = document.getElementById("element"); //通过document取到一个标签对象
console.log(ele.nodeType); // 1
console.log(ele.nodeName); // 返回元素的标签名
console.log(ele.nodeValue); //永远返回null!

  tip one (html元素) :

    <div id="myDiv" class="bd" title="Body text" lang="en" dir="ltr"></div>

    var div = document.getElementById("div");

    1. console.log(div.id); // "myDiv"

    2. console.log(div.className); // "bd"

    3. console.log(div.title); // "Body text"

    4. console.log(div.lang); // "en"

    5. console.log(div.dir); // "ltr"

  tip two (取得,设置和删除特性):

    1.div.getAttribute("id"); // "myDiv"

    2.div.setAttribuye("id","yourDiv"); // id已变动

    3.div.removeAttribute("id"); //id已删除

    需要注意:  在IE7及以下的版本中,三种方法存在着一些异常行为,通过set设置class 和style特性,特别是事件处理程序时,没有任何效果,get也是同样的。因此一般开发要避免以上三种方法,推荐通过属性来设置特性。

  tip three (元素的子节点) :

    要重点提一下的就是这里了,有如下代码:

<ul id="myList">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
</ul>

var mL = document.getElementById("myList");
//很明显mL对象有三个元素节点,我们也知道用childNodes属性去找到节点数,然而陷阱随之而来

console.log(mL.childNodes); // 7
//?!怎么会有7个?

//原因在于childNodes中不仅包含了元素节点,还有4个文本节点。因此需要过滤

for(var i=0,len=ml.childNodes.length;i<len;i++){
     if(ml.childNodes[i].nodeType == "1"){ // 利用元素节点的特性
          // ....
     }
}//最好的方法可以这么做//如果元素对象内部标签名是一样的var items = ml.getElementsByTagName("li"); //能得到三个li节点对象

  

  3.文本节点

  文本节点包含的是可以照字面解释的纯文本内容,纯文本中可以包含转义后的HTML字符,但不能包含HTML代码。文本节点的基本特征如下:

<div id="myDiv">123</div>

var myDiv = document.getElementById("myDiv") //取到元素节点
var tx = myDiv.childNodes[0] //前面也提过childNodes的特性,这次取到了文本节点

console.log(tx.nodeType) // 3
console.log(tx.nodeName) // 所有文本节点的nodeName都是"#text";
console.log(tx.nodeValue) // 123(节点包含的文本),注意元素节点是不能取到它包含的文本节点的文本的

//所以其父节点显然是个元素节点.

  Tip one :

    创建文本节点的两个方法:document.createTextNode(),document.createText();

    创建好后不会直接嵌入文档中,需要引用。

    var a = document.createTextNode("p");

    var b = document.createText("123");

    a.appendChild(b);

    document.body.appendChild(a);

    这样在body末尾会出现<p>123</p>这样的标签

  个人认为DOM肯定是学习js的入门点,但是也需要很长时间的打磨。我看了DOM不少于三遍,仅仅是DOM1级规范,每次都有些新东西。如果你学习DOM,那么就一定要注意一些陷阱,同时也要多花时间琢磨。 

  

  

时间: 2025-01-19 21:27:27

有关DOM的小总结的相关文章

DOM的小疑问收集

1.DOM,Doncument object model 文档对象模型 页面中的所有内容都是对象,包括所有的文字,标签,属性,就是说,DOM就是页面中大对象中有很多小对象,树形结构. 1.1xml文件是用来存储信息的,而且xml的好处是不会跟随软件的消失消失,可以在电脑中直接打开 2.js的作用最初的目的就是验证密码,后来加入了js对页面html中元素的操作,就是---DOM. 3.页面中的顶级对象是document,不是浏览器中的顶级对象,标签可以叫做节点(node==标签==元素),文档元素

DOM的小疑问收集(2)

1.获取元素的四种方式document.getElementsBy/Id(),TagName,Name,ClassName;2.添加事件的三种方式第一种:<input type="button" value="按钮" onclick="f1();">function f1(){    alert("第一种写法"):}第二种:<input type="button" value="

jQuery的DOM操作小案例

案例一:下拉列表左右选择 <body> <div> <select style="width:60px" multiple size="10" id="leftID"> <option>选项A</option> <option>选项B</option> <option>选项C</option> <option>选项D</o

如何使用微信小程序制作banner轮播图?

在前端工程师的工作中,banner是必不可少的,那缺少了DOM的小程序是如何实现banner图的呢?如同其他的框架封装了不同的banner图的方法,小程序也封装了banner的方法,来让我一一道来: 一:准备工作 我用两张图吧,如下所示: 1.jpg                                                                                       2.jpg 二:编写xsml代码(即html) 在这里我们要是用<swipe

Dojo自定义小部件样例

样例一: <html> <head>     <meta charset="UTF-8">     <link rel="stylesheet" href="dijit/themes/soria/soria.css">     <script type="text/javascript" src="dojo/dojo.js" djConfig="

JavaScript DOM编程艺术-学习笔记(第三章、第四章)

第三章: 1.js的对象分为三种:①用户自定义对象 ② 内建对象(js提供的对象) ③宿主对象(js寄宿的环境-浏览器,提供的对象) 2.文档是由节点组成的集合,即dom树,html元素是根元素,是唯一一个没有被其它元素包含的元素. 3.元素节点并非直接包含文本节点,例如:<ul><li>你好</li><ul>    ul元素并没有直接包含文本元素 4.获取元素的方法: ①getElementById() ②getElementsByTagName ()  

HTML5 DOM元素类名相关操作API classList简介(转载自张鑫旭大神)

一.其实事情的发展就像切水果 如果我们把元素的类名操作比作“切水果”游戏的话,其中一个单独的类名就好比“水果”或“炸弹”! DOM Level 2时代,类名的获取与设置,多半使用className属性,className的生效近似切水果的“一刀切”.在web的初期,交互什么的其实很简单的来:就像切水果刚开始的时候,一次就一个水果飞上来,一刀“咔嚓”切了就好,就像使用className赋个类名值,就算偶尔冒出2个水果,className也可以一刀切搞定的. 但是,随着web的发展,交互的逐渐复杂,

微信小程序爬坑日记

新公司上手小程序.30天,从入门到现在,还没放弃... 虽然小程序发布出来快一年了,爬坑的兄弟们大多把坑都踩平了.而我一直停留在"Hello World"的学习阶段.一来没项目,只有项目才是实践学习的根本:二来刚出来,总是有很多坑.爬坑总是痛并快乐着. 再多的借口,产品项目需求拍在桌前,都得缴械投降.不要怂撸起袖子,就是干. 初识小程序 微信推出小程序,想要实现即开即用,用完即走的用户体验.免去APP下载安装繁琐的流程.听起来像谷歌推出的PWA,不过PWA普及到国内还有段时间.而小程序

移动端页面性能探究

一.背景: 智能终端的普及改变了人们对互联网的使用习惯,终端环境对页面性能有更高的要求,接下来以一张图来分析:1s内渲染一个移动页面 网络整体消耗来分析: 1.服务器响应应该小于200ms 2.尽量少的重定向 3.尽量少的第一次渲染的请求 4.避免过多堵塞的js和css堵塞 js执行效率和渲染效率: 1.给浏览器留的200ms渲染时间 2.优化我们的js执行效率和渲染时间 二.主要的web性能优化 页面请求:DNS Lookup.减少重定向.并行请求.压缩.缓存.按需加载.前端模块化 运行环境: