DOM操作

DOM(Document Object Model,文档对象模型),DOM定义了访问和操作HTML文档的标准方法。DOM 以树结构表达 HTML 文档。


Document树

获取标签(元素)

  1. document.getElementById("元素的ID名") 通过ID名字来获取元素(如果ID名重复了,只能获取到第一个)。如果页面没有该元素,返回null。
  2. document.getElementsByClassName("类名") 通过类名来获取元素。此方法将获取到同一类名的一个集合(HTMLCollection对象),可以通过下标访问(从0开始),length代表长度。即使页面只有一个元素或者没有元素,也会返回这个对象。
  3. document.getElementsByTagName("标签名") 通过标签名获取元素,使用方法和第二种相似
  4. document.getElementsByName("nameValue") 通过元素name获取元素,通常用于获取表单元素具有相同name的标签
  5. document.querySelector("CSS选择符") 通过CSS选择符来获取元素,返回匹配到的第一个元素
    document.querySelector("CSS选择符") 通过CSS选择符来获取元素,返回匹配到元素集合
  6. document.documentElement 获取HTML标签
    document.body 获取body标签
var ID = document.getElementById("ID");
var className = document.getElementsByClassName("class")[0];
var tagName = document.getElementsByTagName("div")[0];
var nameName = document.getElementsByName("input")[0];
var div1 = document.querySelector(".class");
var div2 = document.querySelectorAll("#ID");
var html = document.documentElement;
var body = document.body;

以上方法均可再页面中获取标签,document表示在全局下获取,在使用时也可以通过其他的节点来获取。其中document.getElementsByTagNamedocument.getElementsByTagName属于动态获取,即使页面上的内容是通过JavaScript后面动态添加的,也能获取到,而其他的方法是获取不到的。

获取节点

  • 获取子节点
  1. 父节点.children 返回保存子元素的集合,是一个HTMLcollection对象
<div>
    <p></p>
    <p></p>
    <p></p>
</div>

<script type="text/javascript">
    var div = document.querySelector("div");
    console.log(div.children);  //IE8以下会返回文本节点
</script>
  1. 父节点.childNodes 返回一个NodeList对象,NodeList是一种类数组对象,可以通过位置来访问这些节点。
<div>
    <p></p>
    <p></p>
    <p></p>
</div>

<script type="text/javascript">
    var div = document.querySelector("div");
    console.log(div.childNodes);  //IE9之前不会返回文本节点
</script>
  • 获取父节点
  1. 元素.parentNode 获取文档树中的父节点
  2. 元素.offsetParent 获取当前元素最近的有定位的父节点
<div class="parent">
    <div class="son"></div>
</div>

<script type="text/javascript">
    var son = document.querySelector(".son");
    console.log(son.parentNode);
    console.log(son.offsetParent);
</script>
  • 获取其他节点
  1. 元素.firstElementChild//(IE)元素.firstChild 获取元素的首个子节点
  2. 元素.nextSibling//(IE)元素.nextElementSibling 获取下一个兄弟节点
  3. 元素.previousSibling//(IE)元素.previousElementSibling获取上一个兄弟节点
<div class="parent">
    <div class="son1"></div>
    <div class="son2"></div>
    <div class="son3"></div>
</div>

<script type="text/javascript">
    var parent = document.querySelector(".parent");
    var son2 = document.getElementsByClassName("son2")[0];
    console.log(parent.firstElementChild);
    console.log(son2.nextElementSibling);
    console.log(son2.previousElementSibling);
</script>

  • 获取节点信息
  1. 节点.nodeName获取标签节点标签名字
  2. 节点.nodeValue获取文本节点内容
  3. 节点.nodeType获取文本类型(标签-1,属性-2,文本-3)
<div class="parent">hello world</div>

<script type="text/javascript">
    var parent = document.querySelector(".parent");
    console.log(parent.nodeName);
    console.log(parent.childNodes[0].nodeValue);
    console.log(parent.nodeType);
</script>

操作节点

  • 创建节点
  1. document.createElement("标签名") 创建一个标签对象
  2. document.createTextNode("文本") 创建一个文本对象
  • 添加节点
  1. 父元素.appendChild(节点对象) 向父元素末尾添加一个节点
  2. 父元素.insertBefore(子对象,参考节点)向参考节点前插入一个子节点
<div class="demo">
    <p class="p1">p1</p>
    <p class="p2">p2</p>
</div>

<script type="text/javascript">
    var demo = document.getElementsByClassName("demo")[0];
    var p2 = document.getElementsByClassName("p2")[0];
    
    //创建节点并添加文本
    var p3 = document.createElement("p");
    var text = document.createTextNode("text");
    p3.appendChild(text);
    
    //在p2之前插入p3
    demo.insertBefore(p3, p2);
    console.log(demo);
</script>
  • 删除节点
    父元素.removeChild(需要删除的节点)
<div class="demo">
    <p class="p1">p1</p>
    <p class="p2">p2</p>
</div>

<script type="text/javascript">
    var demo = document.getElementsByClassName("demo")[0];
    var p2 = document.getElementsByClassName("p2")[0];

    demo.removeChild(p2);
    console.log(demo);
</script>
  • 替换节点
    父元素.replaceChild(新节点,需要替换的节点)
<div class="demo">
    <p class="p1">p1</p>
    <p class="p2">p2</p>
</div>

<script type="text/javascript">
    var demo = document.getElementsByClassName("demo")[0];
    var p2 = document.getElementsByClassName("p2")[0];

    var p3 = document.createElement('p');
    p3.innerText = "p3";

    demo.replaceChild(p3, p2);
    console.log(demo);
</script>
  • 复制节点
    被复制节点.cloneNode(Boolean)复制节点并返回,参数代表是否复制节点内容
<div class="demo">div1</div>

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

推荐阅读更多精彩内容