DOM节点操作方法

只读的关系指针

  DOM中的关系指针都是只读的

<div class="box" id="box"></div>
<script>
var oBox = document.getElementById(‘box‘);
console.log(oBox.parentNode.nodeName);//BODY
//在IE8-浏览器下会报错,在其他浏览器下忽略此条语句
oBox.parentNode = document;
console.log(oBox.parentNode.nodeName);//BODY
</script>

操作方法

【appendChild()】

  appendChild()方法用于向childNodes列表的末尾添加一个节点,并返回新增节点。添加节点后,childNodes中的新增节点、父节点和以前的最后一个子节点的关系指针都会相应地得到更新。

<div class="box" id="box"></div>
<script>
var oBox = document.getElementById(‘box‘);
var newNode = document.createElement(‘ul‘);
var returnedNode = oBox.appendChild(newNode);
console.log(returnedNode.nodeName);//UL
console.log(returnedNode == newNode);//true
console.log(returnedNode == oBox.lastChild);//true
</script>

【insertBefore()】

  insertBefore()方法接收两个参数:要插入的节点和作为参照的节点。插入节点后,被插入的节点会变成参照节点的前一个兄弟节点(previousSibling),同时被方法返回。如果参照节点是null,则insertBefore()与appendChild()方法执行相同的操作。

<ul class="list" id="list">
    <li class="in">1</li>
    <li class="in">2</li>
    <li class="in">3</li>
    <li class="in">4</li>
    <li class="in">5</li>
    <li class="in">6</li>
</ul>
<script>
var oList = document.getElementById(‘list‘);
//新增一个li元素
var oAdd = document.createElement(‘li‘);
//设置新增元素的css样式
oAdd.className = "in";
oAdd.style.cssText = ‘background-color:red;border-radius:50%‘;
//添加到oList中
oList.insertBefore(oAdd,null);
var num = -1;
var max = oList.children.length;
function incrementNumber(){
    num++;
    //oList.getElementsByTagName(‘li‘)[max]相当于null,所以不报错
    oList.insertBefore(oAdd,oList.getElementsByTagName(‘li‘)[num]);
    if(num == max){
        num = -1;
    }
    if(num == 0){
        num = 1;
    }
    setTimeout(incrementNumber,1000);
}
setTimeout(incrementNumber,1000);
</script>

【insertAfter()封装】

  原生JavaScript中并没有insertAfter()方法,但是可以用insertBefore()和appendChild()封装方法

function insertAfter(newElement,targetElement){
    var parent = targetElement.parentNode;
    if(parent.lastChild == targetElement){
        parent.appendChild(newElement);
    }else{
        parent.insertBefore(newElement,targetElement.nextSibling)
    }
}
<ul class="list" id="list">
    <li class="in">1</li>
    <li class="in">2</li>
</ul>
<script>
function insertAfter(newElement,targetElement){
    var parent = targetElement.parentNode;
    if(parent.lastChild == targetElement){
        parent.appendChild(newElement);
    }else{
        parent.insertBefore(newElement,targetElement.nextSibling)
    }
}
var oList = document.getElementById(‘list‘);
var oLi2 = oList.getElementsByTagName("li")[1];
var newElement = document.createElement("li");
insertAfter(newElement,oLi2);
console.log(oList.childNodes);//在标准浏览器下返回[text, li.in, text, li.in, li, text],在IE8-浏览器下不包含空白文本节点
</script>

【replaceChild()】

  replaceChild()接收的两个参数是要插入的节点和要替换的节点,要替换的节点将由这个方法返回并从文档树中移除,同时由要插入的节点占据其位置

<ul class="list" id="list">
    <li class="in">1</li>
    <li class="in">2</li>
    <li class="in">3</li>
    <li class="in">4</li>
    <li class="in">5</li>
    <li class="in">6</li>
</ul>
<script>
var oList = document.getElementById(‘list‘);
function incrementNumber(){
    //获取oList中子元素的个数
    var len = oList.getElementsByTagName(‘li‘).length;
    //如果长度不为0
    if(len){
        //删除最后一个子元素
        oList.removeChild(oList.getElementsByTagName(‘li‘)[len-1]);
        //再次调用计时器
        setTimeout(incrementNumber,1000);
    }
}
//1s后执行函数incrementNumber
setTimeout(incrementNumber,1000);
</script>

【removeChild()】

  removeChild()方法接收一个参数,即要移除的节点,被移除的节点成为方法的返回值。

<ul class="list" id="list">
    <li class="in">1</li>
    <li class="in">2</li>
    <li class="in">3</li>
    <li class="in">4</li>
    <li class="in">5</li>
    <li class="in">6</li>
</ul>
<script>
var oList = document.getElementById(‘list‘);
function incrementNumber(){
    //获取oList中子元素的个数
    var len = oList.getElementsByTagName(‘li‘).length;
    //如果长度不为0
    if(len){
        //删除最后一个子元素
        oList.removeChild(oList.getElementsByTagName(‘li‘)[len-1]);
        //再次调用计时器
        setTimeout(incrementNumber,1000);
    }
}
//1s后执行函数incrementNumber
setTimeout(incrementNumber,1000);
</script>

【cloneNode()】

  cloneNode方法用于创建调用这个方法的节点的一个完全相同的副本,该方法接收一个布尔值参数,表示是否执行深复制。在参数为true时,执行深复制,也就是复制节点及整个子节点树。在参数为false的情况下,执行浅复制,即复制节点本身。复制后返回的节点副本属于文档所有,但并没有为它指定父节点。若参数为空,也相当于false

  [注意]cloneNode()方法不会复制添加到DOM节点中的JavaScript属性,例如事件处理程序等。这个方法只复制特性、(在明确指定的情况下复制)子节点,其他一切都不会复制。

<ul class="list" id="list">
    <li class="in">1</li>
    <li class="in">2</li>
    <li class="in">3</li>
    <li class="in">4</li>
    <li class="in">5</li>
    <li class="in">6</li>
</ul>
<script>
var oList = document.getElementById(‘list‘);
var deepList = oList.cloneNode(true);
/*IE8-与其他浏览器在处理空白字符的方式不一样,IE8-不会为空白符创建节点*/
console.log(deepList.childNodes.length);//IE8-为6,其他浏览器为11
document.body.insertBefore(deepList,oList);
var shallowList = oList.cloneNode();
console.log(shallowList.childNodes.length);//0
</script>

【insertAdjacentHTML()】

  insertAdjacentHTML()方法接收两个参数:插入的位置和要插入的HTML文本。

  第一个参数必须是下列值之一,且这些值都必须是小写形式:
  "beforebegin",在当前元素之前插入一个紧邻的同辈元素
  "afterbegin",在当前元素之下插入一个新的子元素或在第一个子元素之前再插入新的子元素
  "beforeend",在当前元素之下插入一个新的子元素或在最后一个子元素之后再插入新的子元素
  "afterend",在当前元素之后插入一个紧邻的同辈元素
  第二个参数是一个HTML字符串,如果浏览器无法解析字符串,就会抛出错误

<div class="box" id="box">我是初始元素</div>
<script>
var oBox = document.getElementById(‘box‘);
oBox.insertAdjacentHTML("beforebegin","<p>我是新的前兄弟元素</p>")
oBox.insertAdjacentHTML("afterbegin","<p>我是新的前子元素</p>")
oBox.insertAdjacentHTML("beforeend","<p>我是新的后子元素</p>")
oBox.insertAdjacentHTML("afterend","<p>我是新的后兄弟元素</p>")
</script>
/*
屏幕结果显示为

我是新的前兄弟元素
我是新的前子元素
我是初始元素
我是新的后子元素
我是新的后兄弟元素
*/

注意事项

【注意事项1】如果传入到appendChild()、replaceChild()、insertBefore()中的节点已经是文档的一部分了,则将该节点从原来的位置转移到新位置

<ul class="list" id="list">
    <li class="in">0</li>
    <li class="in" id="test">test</li>
    <li class="in">2</li>
</ul>
<script>
var oList = document.getElementById(‘list‘);
var oTest = document.getElementById(‘test‘);

document.onclick = function(){
    //点击document文档后,三个li的顺序从0 test 2 变成 0 2 test
    oList.appendChild(oTest);
    setTimeout(function(){
        //1s后,三个li的顺序变成 2 0 test
        oList.insertBefore(document.getElementsByTagName(‘li‘)[0],oTest);

        setTimeout(function(){
            //又过1s后,只有两个li,且顺序为test 0
            oList.replaceChild(oTest,document.getElementsByTagName(‘li‘)[0]);
        },1000);
    },1000);
}
</script>    

【注意事项2】动态性的注意事项

  【1】存变量的情况

<ul class="list" id="list">
    <li class="in">1</li>
    <li class="in">2</li>
    <li class="in">3</li>
</ul>
<script>
var oList = document.getElementById(‘list‘);
//oIn0指向的是第0个对象,而并不是第0个位置
var oIn0 = oList.getElementsByTagName("li")[0];
console.log(oIn0.innerHTML);//1
//oIn0指向的是原来的第0个对象,只不过从第0个位置变化到第2个位置,
oList.appendChild(oIn0);
console.log(oIn0.innerHTML);//1
</script>

  【2】不存变量的情况

<ul class="list" id="list">
    <li class="in">1</li>
    <li class="in">2</li>
    <li class="in">3</li>
</ul>
<script>
var oList = document.getElementById(‘list‘);
//获取第0个位置的对象
console.log(oList.getElementsByTagName("li")[0].innerHTML);//1
//将第0个位置的对象变化到第2个位置
oList.appendChild(oList.getElementsByTagName("li")[0]);
//重新获取第0个位置的对象
console.log(oList.getElementsByTagName("li")[0].innerHTML);//2
</script>
时间: 2024-12-26 15:57:51

DOM节点操作方法的相关文章

jquery和DOM节点操作方法和属性记录

网上找了份jquery的操作节点方法清单.如下: 方法 源包装集/字串 目标包装集体 特性描述 A.append(B) B A 若目标包装集只匹配一个元素,则源(也包括同源包装集匹配的所有元素)将被移动到目标位置:若目标包装集包含多个元素,则源将保留在原来的位置,但同时复制一份相同的副本到目标位置. 由此,若目标只匹配一个元素时,使用前述方法后源将被删除. B.appendTo(A) A.prepend(B) B.prependTo(A) A.before(B) B.insertBefore(A

深入理解DOM节点操作

× 目录 [1]创建节点 [2]插入节点 [3]移除节点[4]替换节点[5]复制节点 前面的话 一般地,提起操作会想到“增删改查”这四个字,而DOM节点操作也类似地对应于此,接下来将详细介绍DOM的节点操作方法 前提 DOM提供节点操作的方法是因为DOM节点关系指针都是只读的 下列代码中想通过修改myUl的父级节点来修改其节点关系,但由于parentNode属性是只读的,所以修改无效,在IE8-浏览器下甚至会报错 <div id="myDiv"></div> &

jacascript DOM节点——节点关系与操作

前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 节点关系 DOM可以将任何HTML描绘成一个由多层节点构成的结构.每个节点都拥有各自的特点.数据和方法,也与其他节点存在某种关系.节点之间的关系构成了层次,而所有页面标签则表现为一个以特定节点为根节点的树形结构,也就是DOM树.下图为各节点之间的关系: 父级属性 parentNode 和 parentElement 每个节点都有一个 parentNode 属性,该属性指向文档树中的父节点.对于一个节点来

javascript学习笔记:DOM节点关系和操作

0x01:前面的话 DOM可以将任何HTML描绘成一个由多层节点构成的结构.节点分为12种不同类型,每种类型分别表示文档中不同的信息及标记.每个节点都拥有各自的特点.数据和方法,也与其他节点存在某种关系.节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构.本文将详细描述DOM间的节点关系和基础的DOM操作.节点中的各种关系可以用传统的家族关系来描述,相当于把文档树比喻成家谱.接下来,将把DOM节点关系分为属性和方法两部分进行详细说明. 0x02:属性 父级属性par

js中DOM 节点的一些操作方法

什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定的一个规范. DOM就是由节点组成的. 解析过程 HTML加载完毕,渲染引擎会在内存中把HTML文档,生成一个DOM树,getElementById是获取内中DOM上的元素节点.然后操作的时候修改的是该元素的属性. DOM树(一切都是节点) DOM的数据结构如下: 上图可知,在HTML当中,一切都是节点:(非常重要) 元素节点:HMTL标签. 文本

jQuery DOM 节点操作

DOM 中有一个非常重要的功能,就是节点模型,也就是 DOM 中的“M”.页面中的元素结构就是通过这种节点模型来互相对应着的,我们只需要通过这些节点关系,可以创建.插入.替换.克隆.删除等等一些列的元素操作. 一.创建节点 为了使页面更加智能化,有时我们想动态的在 html 结构页面添加一个元素标签,那么 在插入之前首先要做的动作就是:创建节点. $('div').append('<strong>节点</strong>'); //向 div 内部插入 strong 节点 $('di

DOM 节点操作

DOM 中有一个非常重要的功能,就是节点模型,也就是 DOM 中的“M”.页面中的元 素结构就是通过这种节点模型来互相对应着的,我们只需要通过这些节点关系,可以创建. 插入.替换.克隆.删除等等一些列的元素操作. 一.创建节点 为了使页面更加智能化,有时我们想动态的在 html 结构页面添加一个元素标签,那么 在插入之前首先要做的动作就是:创建节点. //创建一个节点  var box=$('<div id="box">节点</div>'); //将节点插入到&

Jquery6 DOM 节点操作

学习要点: 1.创建节点 2.插入节点 3.包裹节点 4.节点操作 DOM 中有一个非常重要的功能,就是节点模型,也就是 DOM 中的"M".页面中的元素结构就是通过这种节点模型来互相对应着的,通过这些节点关系,可以创建.插入.替换.克隆.删除等等一些列的元素操作. 一.创建节点 为了使页面更加智能化,有时想动态的在 html 结构页面添加一个元素标签,那么在插入之前首先要做的动作就是:创建节点. var box = $('<div id="box">节

DOM节点创建(jQuery)

1DOM创建节点及节点属性 通过JavaScript可以很方便的获取DOM节点,从而进行一系列的DOM操作.但实际上一般开发者都习惯性的先定义好HTML结构,但这样就非常不灵活了. 试想下这样的情况:如果我们通过AJAX获取到数据之后然后才能确定结构的话,这种情况就需要动态的处理节点了 本文向大家介绍一下如何使用JavaScript创建div节点元素,主要包括创建div节点元素的属性和创建div节点元素的样式两大部分内容,相信本文介绍一定会让你有所收获. 先介绍下需要用到的浏览器提供的一些原生的