DOM基本操作

DOM

DOM是javascript操作网页的接口,全称为文档对象模型(Document Object Model)
首先来看dom中的一些常见的节点类型。

元素节点文本节点属性节点注释节点documentDocumentFragment
1328911

对元素节点的增删改查

  • 查询
    document.getElementById 。。。。
  • 增加
    document.createElement();创建元素节点
    document.createTextNode();创建文本节点
    document.createCommen();注释。。
  • 插入
    appendChild() 任意元素节点都有这个方法。移除操作。
    当将已有的元素插入到父节点时,首节点会到最后。
    insertBefore ,随心插入节点
    语法
    parentNode.insertBefore(A,B) 可以理解为insert A before B
    注意是父元素来选择。
  • 删除
    removeChild() 并没有真的消失。只是不在列表里 ,可以挽回
    remove() es5.0 中的方法,找不到了了了。
  • 替换
    replaceChild(new,old) 拿新的替换老的
  • 写入
    innerHTML可以写入HTML结构。
    innerText取文本内容.对 innerText 进行修改, 不仅会移除当前元素的子节点,
    而且还会永久性地破坏所有后代文本节点
    (所以不可能再次将节点再次插入到任何其他元素或同一元素中)。

一些简单的应用

  • 遍历某个元素下所有的元素节点
<div>
        <strong>
            <span>1</span>
        </strong>
        <span></span>
        <em></em>
    </div>
Element.prototype.tree = function(blanks){
            var blanks = blanks || [];
            var len = this.children.length;
            console.log(blanks.join("") + "|_" + (this.nodeType == 1 ? this.nodeName:this.nodeValue));
            if(len > 0){
                blanks.push("\t");
                for(var i = 0;i < len;i ++){
                    this.children[i].tree(blanks);
                }
                blanks.pop("\t");
            }
        };
     var div = document.getElementsByTagName('div')[0];
     div.tree();

输出是这样的
dom遍历元素
这个函数中用了递归的方法,由于效率问题,改成迭代比较好,未来完善。

  • 返回第n层祖先节点
<div>
    <strong>
        <span>
            <i></i>
        </span>
    </strong>
</div>
function retParent(elem,n){
            //循环
            while(n != 0 && elem != null){
                elem = elem.parentElement;   //当elem为null时,直接返回就好
                n --;
            }
            return elem;
        }
  • 封装函数,返回自己的兄弟节点。输入n,当n>0时,返回该元素后的兄弟元素;当n < 0 时,返回该元素前的兄弟元素。当n = 0时,返回自己。
function retSibling(e,n){
            while(n && e){        //排除e为null时的情况
                if(n > 0){
                    if(e.nextElementSibling)
                    e = e.nextElementSibling;     
                     //兼容垃圾IE,抛弃了nextElementSibling  and previousElementSibling
                    else{
                        while(e.nodeType != 1 && e){
                            e = e.nextSibling;
                        }
                        //for(e = e.nextSibling;e && e.nodeType != 1;e = e.nextSibling);  for循环执行句中没有代码是可以省略。。
                    }
                    n--;
                }
                else{
                    e = e.previousSibling;
                    n ++;
                }
            }
            return e;
        }
  • 用原生js写一个children函数
Element.prototype.myChildren = function(){
            var child = this.childNodes;
            var len = child.length;
            var result = [];
            for(var i = 0;i < len;i ++){
                if(child[i].nodeType == 1){
                    result.push(child[i]);
                }
            }
            return result;
        }
  • 类比insertBefor函数,封装insertAfter函数
Element.prototype.insertAfter = function(elem,sub){
            var newSub = sub.nextElementSibling;
            if(newSub == null){
                this.appendChild(elem);
            }else{
                this.insertBefore(elem,newSub);
            }
        }

主要思路还是基于原有的函数insertBefore,并做适当的修改。
但是上面代码不适用于IE9及以下,可以进一步修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值