JavaScript基础知识总结——DOM

DOM

  • DOM的全称叫做文本对象模型(Document Object Model);是w3c定义的一种访问html和xml文档的标准,它提供了一系列接口,为程序和脚本动态地访问和更新文档的内容,结构和样式。
  • DOM将html或者xml文档描绘成了一个由多节点构成的结构。如下便是DOM的节点层次图
DOM节点层次图

Node

  • 说到DOM,有一个不得不说的概念叫做node。什么是node?DOM将html中的整个文档(document),每个元素,注释,每个元素的属性(特性)等等都看作是文档中的一个个节点,而这些节点都属于node类型,就是说这些节点有着共同的属性和方法(nodeType,nodeName,nodeValue),但是又有其自己独立的属性和方法。
    node总共有如下几个类型(加粗的类型后面会详细讲解):
    1.Node.ELEMENT_NODE(1); 元素节点
    2.Node.ATTRIBUTE_NODE(2); 属性节点
    3.Node.TEXT_NODE(3); 文本节点
    4.Node.CDATA_SECTION_NODE(4); CDATA 区段
    5.Node.ENTITY_REFERENCE_NODE(5); 实体引用元素
    6.Node.ENTITY_NODE(6); 实体
    7.Node.PROCESSING_INSTRUCTION_NODE(7); 表示处理指令
    8.Node.COMMENT_NODE(8); 注释节点
    9.Node.DOCUMENT_NODE(9); 最外层的Root element,包括所有其它节点
    10.Node.DOCUMENT_TYPE_NODE(10); <!DOCTYPE………..>
    11.Node.DOCUMENT_FRAGMENT_NODE(11); 文档碎片节点
    12.Node.OTATION_NODE(12); DTD 中声明的符号节点
var firstChild1 = someNode.childNodes[0];
var firstChild2 = someNode.childNodes.item(0);
var childCount = someNode.childNodes.length;//指的是访问NodeList时其中包含的节点数量
var hasChild = someNode.hasChildNodes()
var parentNode = someNode.parentNode
var dNode  = someNode.ownerDocument

someNode.nodeName
someNode.nodeType  //IE中是数字(例如1,2,3...);其他浏览器是字符串(例如Node.DOCUMENT_FRAGMENT_NODE)
someNode.nodeValue
  • nodeList对象
    一种类数组对象,可以通过[1,2,3...]来索引得到里面的元素,也可以使用item()索引,同时具备length属性;但是nodeLIst对象和数组不一样的是,这个对象是时刻更新的,而不是某一个时刻获取它的时候得到的快照。
//将nodeList对象转换成数组
var nodes = somenode.childNode;    //childNode属性可以返回一个nodeList对象来标识节点的子节点
var array = [];
try{
      array = Array.prototype.slice.call(nodes,0)  
} catch (ex) {  //针对ie
       for(var i=0;i<nodes.length;i++){
            array.push(nodes[i]);
        }
}
  • 节点操作
somenode.appendChild(othernode)   //向末尾添加某个节点
somenode.insertBefore(newnode,innernode,null)  //向指点位置插入某个节点
somenode.replaceChild(newnode,innernode)   //替换某个节点
somenode.remove(innernode)    //移除某个节点

Document类型

  • 概念
    js中通过Document类型表示文档。doucment对象是HTMLDocument(继承自Document类型)的一个实例,表示整个HTML页面。
    Dcument节点的特征:
    1.nodeType值为9
    2.nodeName为"#document"
    3.nodeValue为null
    4.parentNode为null
    5.ownerDocument为null
    6.其子节点可能是一个DocumentType(最多一个)、Element(最多一个)、processingInstruction或Comment。
  • 子节点
    1.documentElement和childNodes内置的访问文档子节点的快捷方式。
    2.documentElement始终指向HTML页面中的<html>元素。
    3.作为HTMLDocument实例,document对象还有一个body属性,直接指向<body>元素。
    4.Document另一个可能的子节点是DocumentType。通常将<!DOCTYPE>标签看成一个与文档其它部分不同的实体,可以通过doctype属性访问。
var html = document.documentElement;  //取得对html 引用
     alert(html == document.childNodes[0]);//true
     alert(html == document.firstChild);//true
var body = document.body; //取得对<body>引用
var doctype = document.doctype; //取得对<!DOCTYPE>引用
  • 文档信息
    1.title属性:包含着<title>元素中的文本。可以取得当前页面的标题也可以修改。
    2.对网页的请求有关的3个属性:URL、domain和referrer。URL属性包含页面完整的URL,domain属性中只包含页面的域名,referrer属性保存着谅解到当前页面的那个页面的URL。在没有来源页面的情况下,referrer属性中可能会包含空字符串。所有这些信息都存在于HTTP头部,只不过通过这些属性让我们能够在JavaScript中访问它们而已。
      var originalTitle = document.title;
      document.title = "New page title"

      var url = document.URL;
      var domain = document.domain;
      var referrer = document.referrer;
  • 查找元素
    1.getElemengById()接收一个参数,要取得的元素的ID。找到相应元素放回该元素,否则返回null。如果页面中多个元素的ID值相同,则返回文档中第一次出现的元素。
    2.getElementsByTagName()接收一个参数,要取得的元素的标签名,返回0或多个元素的NodeList。在HTML文档中,这个方法会返回一个HTMLCollection对象,最为一个动态集合,该对象与NodeList非常相似。HTMLCollection对象有一个叫做namedItem()的方法。使用这个方法可以通过元素的name特性取得集合中的项。
var div = document.getElementById("divId");

var images = document.getElementsByTagName("img");
alert(images.length);
alert(images[0].src);
alert(images.item(0).src);
var myImage = images.namedItem("myImage");
  • 特殊集合
    除了属性和方法,document对象还有一些特殊的集合,这些集合都是HTMLCollection对象,包括:
    1.document.anchors,包含所有带name特性的元素;
    2.document.forms:包含文档中所有<form>元素
    3.document.images:包含文档中所有图像元素
    4.document。links:包含文档href特性的元素

  • 文档写入
    document对象将输出流写入到网页中的能力体现在下列4个方法中:write()、writeln()、open()和close()。
    1.open() 打开网页的输出流
    2.write() 接收一个字符串参数,要写入到输出流中的文本。write()原样写。
    3.writeln() 接收一个字符串参数,要写入到输出流中的文本。与write()不同的是,writeln()会在字符串末尾添加换行符(\n)。
    4.cloes()关闭网页的输出流。

Element类型

  • 概念
    js中通过Document类型表示文档。doucment对象是HTMLDocument(继承自Document类型)的一个实例,表示整个HTML页面。
    Dcument节点的特征:
    1.nodeType值为1
    2.nodeName的值是元素的标签名
    3.nodeValue的值为null;
    4.parentNode可能是Doucment或Element;
    5.ownerDocument为null
    6.子节点可能是Element、Text、Comment、ProcessingInstruction、CDATASection或EntityReference。
  • HTML元素
    所有HTML元素都由HTMLElement类型或者更具体的子类表示。HTMLElement直接继承自Element并添加了一些属性,分别对应于每个HTML元素中都存在的标准特性
    1.id,元素在文档中的唯一标识符
    2.title,有关元素的附加说明信息。
    3.lang,元素内容的语言代码。
    4.dir,语言的方向,值为“ltr”(left-to-right)或“rtl”。
    5.className,与元素的class特性对应(class是ECMAScript的保留字)。
    可以通过上面的属性获取和修改相应的特性。
var id = element.id;
var title = element.title;
var lang = element.lang;
var dir = element.dir;
var className = element.className;
  • 特性
    每个元素都有一个或多个特性,这些特性的用途是给出相应元素或其内容的附加信息。
    1.getAttribute()可以获得所有特性,包括自定义的特性,但是传入的参数必须和特性的名称相同(不区分大小写)。
    2.有两类特殊的属性,他们虽然有对应属性名,但是属性值和getAttribute()返回的不相同。第一类是style属性,getAttribute()返回css文本,而属性则是一个对象。第二类是时间处理程序,getAttribute()返回js代码而属性是一个js函数。(IE7-返回的值与属性相同)
    3.任何元素的所有特性也都可以通过DOM元素本身的属性来访问,但是只有公认的特性才会以属性的形式添加到DOM对象中(IE除外)。
    4.一般只在获取自定义特性时才用getAttribute().
    5.setAttribute()方法接两个参数,第一个是特性名,第二个是特性值。通过这个方法设置的特性名会同一转换为小写。
    6.removeAttribute()彻底删除元素的特性(IE6-不支持)。
    7.atrributes()属性包含一个NamedNodeMap,与NodeList类似,也是一个“动态”的集合。元素的每一个特性都用一个Attr节点表示,每个节点都保存在NamedNodeMap中。
<div a="xxx" 
  id="div" class="div" 
  style="width:40px;height:40px;background:red" 
  onclick="handler">
</div>
var element = document.getElementById("div")

//getAttribute()不区分大小写
var class2 = element.getAttribute("CLASS") //获取class属性
var class1 = element.getAttribute("class");  //获取class属性

//getAttribute()和属性返回的值不一样
var style1 = element.getAttribute("style"); //文本字符串
var style2 = element.style;  //对象
function handler (argument) {
    alert("xxx");
    return "xxx";
}
var handler1 = element.getAttribute("onclick");   //function handler(){handler};
var handler2 = element.onclick;   //handler

//getAttribute()可以获取自定义属性
var a = element.getAttribute("a");  //xxx
var a1 = element.a  //undefined

//setAttribute()可以设置属性
element.setAttribute("style", "width:40px;height:40px;background:blue");

//removeAttribute()可以删除属性
element.removeAttribute("a");  //彻底删除了属性a

//attributes()获取属性集合
var a = element.attributes;  //获取属性集合
  • 创建元素
    可以通过document.createElement()来创建一个元素节点。有两种方法:
    1.接收你所要创建的元素的标签名
    2.接收一个字符串;
var element = document.createElement("div")  //创建一个div标签
var element = document.createElement("<div></div>") //创建一个div标签
  • 元素的子节点
    对元素的子元素节点进行操作的正确方法应该是:
for(var i=0;i<element.childNodes.length;i++){
    if(element.childNodes[i].nodeType==1){
    }
}

Text类型

  • 概念
    文本节点由 Text 类型表示,包含的是可以照字面解释的纯文本内容。纯文本中可以包含转义后的 HTML 字符,但不能包含 HTML 代码。Text 节点具有以下特征:
    1.nodeType 3
    2.nodeName '#text'
    3.nodeValue 节点所包含的文本
    4.parentNode Element
  • 操作
    1.document.createTextNode() 接收一个参数:要创建的文本节点中的文本。
    2.normalize()合并相邻文本节点
    3.plitText() 将一个文本节点分成两个文本节点,接收一个参数代表切割开始的地方。
var element = document.createElement('div');
element.className = 'message';
var textNode = document.createTextNode('Hello');  //创建第一个文本节点
var anotherTextNode = document.createTextNode('World');  //创建另一个文本节点
element.appendChild(textNode);
element.appendChild(anotherTextNode);

element.normalize();   //合并文本节点
var newNode = element.firstChild.splitText(5);  //以第五个字符为分界切割文本

Attr类型

  • 概念
    元素的特性在 DOM 中以 Attr 类型来表示。在所有浏览器中都可以访问 Attr 类型的构造函数和原型。从技术角度来讲,特性就是存在于元素的 attributes 属性中的节点。特性节点具有下列特征:
    1.nodeType 2
    2.nodeName 特性名称
    3.nodeValue 特性的值
    4.parentNode null
  • 操作
    1.Attr 对象有三个属性,name value specified。其中,name 是特性名称,value 是特性的值,specified 是布尔值,用以区别特性是代码中指定的还是默认的。
    2.使用 document.createAttribute() 并传入特性的名称可以创建新的特性节点。
var attr = document.createAttribute('align');
attr.value = 'left';
element.setAttributeNode(attr);

最后最后最后介绍一下:动态脚本

function loadScript(url) {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    document.body.appendChild(script);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 尽管DOM作为API已经十分完善了,但是为了更多的功能,仍然会有一些专有的扩展。 选择符API 为了让让浏览器原生...
    More_5897阅读 191评论 0 0
  • 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西...
    微醺岁月阅读 4,472评论 2 62
  • 本章内容 理解包含不同层次节点的 DOM 使用不同的节点类型 克服浏览器兼容性问题及各种陷阱 DOM 是针对 HT...
    闷油瓶小张阅读 638评论 0 1
  • 我不知道 風往哪裡吹, 雪往哪裡下, 雨滴將落往何處。 我不知道, 花朵向哪裡開, 蝴蝶向哪裡飛, 蜜蜂將在何處停...
    许雅茉阅读 219评论 0 2
  • 中国特色社会主义进入了新时代,青年兴则国家兴,青年强则国家强。 青年一代有理想、有本领、有担当,国...
    二苗_5c0f阅读 154评论 0 1