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 相关文章推荐
破解Session cookie的方法
Jul 28 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
Oct 12 Javascript
JS正则表达式大全(整理详细且实用)
Nov 14 Javascript
jquery中get,post和ajax方法的使用小结
Feb 04 Javascript
使用javascript获取页面名称
Dec 23 Javascript
JavaScript中的bold()方法使用详解
Jun 08 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
Aug 25 Javascript
bootstrap快速制作后台界面
Dec 05 Javascript
jQuery实现轮播图及其原理详解
Apr 12 jQuery
详解微信小程序input标签正则初体验
Aug 18 Javascript
JavaScript实现无限级递归树的示例代码
Mar 29 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 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自动加载机制的深入分析
2013/06/08 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
早该知道的7个JavaScript技巧
2013/03/27 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
javascript基础知识
2016/06/07 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
清除输入框内的空格
2016/12/21 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
某公司Java工程师面试题笔试题
2016/03/27 面试题
食品安全责任书
2014/04/15 职场文书
员工生日会策划方案
2014/06/14 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
实习推荐信格式模板
2015/03/27 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL