DOM基础教程之使用DOM


Posted in Javascript onJanuary 19, 2015

在了解DOM(文本对象模型)的框架和节点后,最重要的是使用这些节点处理html网页

对于一个DOM节点node,都有一系列的属性和方法可以使用。常用的有下表。

DOM基础教程之使用DOM

完善:http://www.w3school.com.cn/xmldom/dom_element.asp

1.访问节点

BOM提供了一些边界的方法访问节点,常用的就是getElementsByTagName(),和getElementById()

<script type="text/javascript">

    function searchDOM(){

        var oLi = document.getElementsByTagName("li");

       var j =oLi.length;

       var j2 =oLi[5].tagName;

        var j3 =oLi[0].childNodes[0].nodeValue;

        document.write(j+"<br>"+j2+"<br>"+j3+"<br>");

    }

</script>

<body>

<body onload="searchDOM()">

<div id-"in"></div>

<ul>客户端语言

    <li>HTML</li>

    <li>JavaScript</li>

    <li>CSS</li>

</ul>

<ul>服务器端语言

    <li>ASP.NET</li>

    <li>JSP</li>

    <li>PHP</li>

</ul>

</body>

document.getElementById()

<script type="text/javascript">

    window.onload = function(){

        function findid(){

            var j4 =oli2.tagName;

            document.write(j4);

        }

        var oli2 = document.getElementById("inn");

        oli2.onclick = findid;

    }

</script>

<li id="inn">PHP</li>

 
<html>

<body id="myid" class="mystyle">

<div class="myid2"></div>

<script type="text/javascript">

x=document.getElementsByTagName('div')[0];

document.write("div CSS class: " + x.className);

document.write("<br />");

document.write("An alternate way: ");

document.write(document.getElementById('myid').className);

</script>
</body>

</html>

//id获得className

 2.检测节点类型

 通过节点的nodeType可以检测到节点的类型,该参数一个返回12个整数值。

表达格式如 document.nodeType

正真有用的,还是DOM(一)模型中的模型节点 提到的三种类型

元素节点,文本节点和属性节点

1.元素节点 element node 返回值为 1

2.属性节点 attribute node 返回值为 2

3.文本节点 text node 返回值为 3

<script type="text/javascript">

    window.onload = function(){

        function findid(){

            var j5 =oli2.nodeType;

            document.write("nodeType:"+ j5 +"<br>");

        }

        var oli2 = document.getElementById("inn");

        oli2.onclick = findid;

    }

</script>

<li id="inn">CSS</li>

返回:nodeType:1

这意味着可以对某种节点做单独处理,在搜索节点时非常实用。后面会讲到。

3.利用父子兄关系查找节点

在第一小节访问节点上,利用节点的childNodes属性来访问元素节点包含的文本节点。

本小节利用节点的父子兄关系来查找节点

*利用hasChildNodes和childNodes属性获取该节点包含的所有节点

<head>

    <title>childNodes</title>

    <script language="javascript">

       window.onload = function myDOMInspector(){

            var oUl = document.getElementById("myList");    //获取<ul>标记

            var DOMString = "";

            if(oUl.hasChildNodes()){                        //判断是否有子节点

                var oCh = oUl.childNodes;

                for(var i=0;i<oCh.length;i++)                //逐一查找

                    DOMString += oCh[i].nodeName + "<br>";

            }

            document.write(DOMString);

        }

    </script>

</head>

<body>

<ul id="myList">

    <li>糖醋排骨</li>

    <li>圆笼粉蒸肉</li>

    <li>泡菜鱼</li>

    <li>板栗烧鸡</li>

    <li>麻婆豆腐</li>

</ul>

</body>

 4.DOM获取节点的父节点

    <script language="javascript">

       window.onload = function(){

     var food = document.getElementById("mydearfood");

      document.write(food.parentNode.tagName)

        }

    </script>

</head>

<body>

<ul>

    <li>糖醋排骨</li>

    <li>圆笼粉蒸肉</li>

    <li>泡菜鱼</li>

    <li id="mydearfood">板栗烧鸡</li>

    <li>麻婆豆腐</li>

</ul>

//返回 ul

使用父节点,成功的获得了指定节点的父节点

 5.使用parentNode属性

<head>

    <title>childNodes</title>

    <script language="javascript">

       window.onload = function(){

     var food = document.getElementById("mydearfood");

           var parentElm = food.parentNode;

           while(parentElm.className != "colorful" && parentElm != document.body)

               parentElm = parentElm.parentNode;    //一路往上找

           document.write("tageName:"+parentElm.tagName+"<br>");

           document.write("claaName:"+parentElm.className+"<br>");

           document.write("typeOf:"+typeof(food)+"<br>");

        }

    </script>

</head>

<body>

<div class="colorful">

<ul>

    <span>

    <li>糖醋排骨</li>

    <li>圆笼粉蒸肉</li>

    <li>泡菜鱼</li>

    <li id="mydearfood">板栗烧鸡</li>

    <li>麻婆豆腐</li>

    </span>

</ul>

    </div>

</body><br>//输出<br>//tageName:DIV<br>claaName:colorful<br>typeOf:object

从某个子节点开始,一直向上搜索父节点,直到节点的类名为“colorful”

6.dom的兄弟关系

<head>

    <title>childNodes</title>

    <script language="javascript">

       window.onload = function(){

     var foods = document.getElementById("mydearfood");

     var nextF = foods.nextSibling;

     alert("nextSibling:"+nextF.tagName +"<br>");

        }
    </script>

</head>

<body>

<div class="colorful">

<ul>

    <span>

    <li>糖醋排骨</li>

    <li>圆笼粉蒸肉</li>

    <li>泡菜鱼</li>

    <li id="mydearfood">板栗烧鸡</li>

    <li>麻婆豆腐</li>

         <li>麻婆豆腐</li>

         <li>麻婆豆腐</li>

    </span>

</ul>

    </div>

</body>

利用nextsibling和previousSibling属性访问兄弟节点看上去很好。

但仅仅适用于ie浏览器

为了使用代码有良好的兼容性,就必须使nodeType进行判断

以下做兼容性处理:

<head>

<title>Siblings</title>

<script language="javascript">

function nextSib(node){

    var tempLast = node.parentNode.lastChild;

    //判断是否是最后一个节点,如果是则返回null

    if(node == tempLast)

        return null;

    var tempObj = node.nextSibling;

    //逐一搜索后面的兄弟节点,直到发现元素节点为止

    while(tempObj.nodeType!=1 && tempObj.nextSibling!=null)

        tempObj = tempObj.nextSibling;

    //三目运算符,如果是元素节点则返回节点本身,否则返回null

    return (tempObj.nodeType==1)?tempObj:null;

}

function prevSib(node){

    var tempFirst = node.parentNode.firstChild;

    //判断是否是第一个节点,如果是则返回null

    if(node == tempFirst)

        return null;

    var tempObj = node.previousSibling;

    //逐一搜索前面的兄弟节点,直到发现元素节点为止

    while(tempObj.nodeType!=1 && tempObj.previousSibling!=null)

        tempObj = tempObj.previousSibling;

    return (tempObj.nodeType==1)?tempObj:null;

}

function myDOMInspector(){

    var myItem = document.getElementById("myDearFood");

    //获取后一个元素兄弟节点

    var nextListItem = nextSib(myItem);

    //获取前一个元素兄弟节点

    var preListItem = prevSib(myItem);

    alert("后一项:" + ((nextListItem!=null)?nextListItem.firstChild.nodeValue:null) + " 前一项:" + ((preListItem!=null)?preListItem.firstChild.nodeValue:null) );

}

</script>

</head>

<body onload="myDOMInspector()">

    <ul>

        <li>糖醋排骨</li>

        <li>圆笼粉蒸肉</li>

        <li>泡菜鱼</li>

        <li id="myDearFood">板栗烧鸡</li>

        <li>麻婆豆腐</li>

    </ul>

</body>

7.设置节点属性

<head>

    <title>childNodes</title>

    <script language="javascript">

       window.onload = function(){

           //获取图片

           var imgDataBe = document.getElementsByTagName("img")[0];

           //取得图片的title属性

           imgDataBe.setAttribute("src","02.gif");

           imgDataBe.setAttribute("title","人情坡");

           document.write(imgDataBe.getAttribute("title"));

           document.write(imgDataBe.getAttribute("alt"));

           document.write(imgDataBe.getAttribute("node-data"));

           document.write(imgDataBe.getAttribute("node_data"));

        }

    </script>

</head>

<body>

<div class="colorful">

<img src="01.jpg" title="情人坡" alt="111" node-data="222" node_data="3333">

<img src="01.jpg" title="情人坡22">

</body>

用setAttribute()方法设置节点属性

<head>

        <title>childNodes</title>

        <meta charset="utf-8" />

        <script language="javascript">

            window.onload = function() {

                var bkk = document.getElementById("new5");

                var clickbk = document.getElementById("qiehuan");

                clickbk.onclick = dsqiehuan;

                function dsqiehuan() {

                    bkk.setAttribute("class", "xxx")

                }

            }

        </script>

        <style>

            .xxx{color:#ddd}

        </style>

    </head>

    <body>

        <div id="new5">

            555

        </div>

        <em id="qiehuan">切换</em>

    </body>

8.createElement() 创建节点

    <head>

        <title>childNodes</title>

        <meta charset="utf-8" />

        <script language="javascript">

            window.onload = function() {

        var oP = document.createElement("p");

        var oText = document.createTextNode("使用dom创建节点");

        var oText1 = document.createTextNode("使用dom创建节点123");

        oP.appendChild(oText);

        oP.appendChild(oText1);

        document.body.appendChild(oP);

            }

        </script>

    </head>

    <body>

    <p>这里本来有个P,测试createElement()</p>

    </body>

 9.removeChild移除节点

<head>

        <title>childNodes</title>

        <meta charset="utf-8" />

        <script language="javascript">

            window.onload = function() {

        var oP = document.getElementsByTagName("p")[0];

        oP.parentNode.removeChild(oP);//结尾为 .removeChild(oP),不是.removeChild("oP")

            }

        </script>

    </head>

    <body>

    <p>这里本来有个P,测试createElement()</p>

    </body>

 10.insertBefore() 在特定节点前插入节点

    <head>

        <title>childNodes</title>

        <meta charset="utf-8" />

        <script language="javascript">

            window.onload = function() {

        var oPold = document.getElementsByTagName("p")[0];

        var oPnew = document.createElement("p");

        var oText = document.createTextNode("新节点")

       oPnew.appendChild(oText) ;

        oPold.parentNode.insertBefore(oPnew,oPold);//接收两个参数,一个是新参数,一个是旧节点参数

            }

        </script>

    </head>

    <body>

    <p>这里本来有个P</p>

    </body>

11.在特定的节点之后插入新元素(2015年1月9日补充)

DOM提供的方法只能用insertBefore()在目标元素前加入新的元素,或者利用appendchild()方法在父元素的childNodes末尾加入新的元素(示例:地址)。

而实际中常常用到在某个特定的元素末尾加入新的元素。而DOM方法并没有insertBefore()方法,但是利用现有的知识,完全可以利用现有知识进行编写。

 代码思路如下

    function insertAfter(newElement, targetElement) {

                var oparent = targetElement.parentNode; //找到目标元素的父元素

                if (oparent.lastChild == targetElement) //如果目标是最后一个元素了

                oparent.appendChild(newElement); //直接添加到最后一个元素的后面

                else //插入到下一个元素的父元素节点之前      

                    oparent.insertBefore(newElement, targetElement.nextSibling)

实例:(元素外追加)原来实例:地址

<head>

        <meta charset="utf-8">

        <title></title>

    </head>

    <body onload="interP()">

        <p>第一个</p>

        <p id="target">第二个</p>

        <script type="text/javascript">

            function insertAfter(newElement, targetElement) {

                var oparent = targetElement.parentNode; //找到目标元素的父元素

                if (oparent.lastChild == targetElement) //如果目标是最后一个元素了

                oparent.appendChild(newElement); //直接添加到最后一个元素的后面

                else //插入到下一个元素的父元素节点之前      

                    oparent.insertBefore(newElement, targetElement.nextSibling)

            }

            function interP() {

                var ooParent = document.getElementById("target");

                var oonewP = document.createElement("a");

                oonewP.setAttribute("href","http://www.qq.com");

                var ootextP = document.createTextNode("链接");

                oonewP.appendChild(ootextP);

                insertAfter(oonewP, ooParent);

            }

        </script>

    </body>

 实例:元素内添加

12.添加文档碎片提高执行效率

    <head>

        <title>childNodes</title>

        <meta charset="utf-8" />

        <script language="javascript">

            window.onload = function() {

    var oPold = document.getElementsByTagName("p")[0];

    var aColors = ["red","green","blue","magenta","yellow","chocolate","black","aquamarine","lime","fuchsia","brass","azure","brown","bronze","deeppink","aliceblue","gray","copper","coral","feldspar","orange","orchid","pink","plum","quartz","purple"];

    var oFragment = document.createDocumentFragment();    //创建文档碎片

    for(var i=0;i<aColors.length;i++){

        var oP = document.createElement("p");

        var oText = document.createTextNode(aColors[i]);

        oP.appendChild(oText);

        oFragment.appendChild(oP);        //将节点先添加到碎片中

    }

    //document.body.appendChild(oFragment);    //最后一次性添加到页面

     oPold.parentNode.insertBefore(oFragment,oPold);//结合insertBefore使文档碎片添加到节点之前

            }

        </script>

    </head>

    <body>

    <p>这里本来有个P</p>

    </body>
Javascript 相关文章推荐
javascript一些不错的函数脚本代码
Sep 10 Javascript
超轻量级的基于jquery的三级展开列表
Apr 26 Javascript
JS获取DropDownList的value值与text值的示例代码
Jan 07 Javascript
在JS中解析HTML字符串示例代码
Apr 16 Javascript
AngularJS实现单独作用域内的数据操作
Sep 05 Javascript
JavaScript对象创建模式实例汇总
Oct 03 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
Dec 14 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
JavaScript实现获取远程的html到当前页面中
Mar 26 Javascript
webpack项目使用eslint建立代码规范实现
May 16 Javascript
微信小程序服务器日期格式化问题
Jan 07 Javascript
微信小程序实现搜索框功能及踩过的坑
Jun 19 Javascript
DOM基础教程之模型中的模型节点
Jan 19 #Javascript
javascript正则表达式使用replace()替换手机号的方法
Jan 19 #Javascript
javascript正则表达式之search()用法实例
Jan 19 #Javascript
jQuery中delegate()方法用法实例
Jan 19 #Javascript
jQuery中die()方法用法实例
Jan 19 #Javascript
jQuery中live()方法用法实例
Jan 19 #Javascript
jQuery中unbind()方法用法实例
Jan 19 #Javascript
You might like
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
详解js中Array的方法及技巧
2018/09/12 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
Python新手学习装饰器
2020/06/04 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
详解pandas赋值失败问题解决
2020/11/29 Python
python爬取youtube视频的示例代码
2021/03/03 Python
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
升职自荐信范文
2013/10/05 职场文书
电子信息专业学生自荐信
2013/11/09 职场文书
大学本科生的个人自我评价
2013/12/09 职场文书
个人租房协议书样本
2014/10/01 职场文书
Python实现简单的猜单词
2021/06/15 Python
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python