DOM基础教程之使用DOM

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

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

完善: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>

(0)

相关推荐

  • 深入dom4j使用selectSingleNode方法报错分析

    我有一段代码,使用dom4j 正则表达式解析gml , 代码如下:List<Element> featureMembers= root.selectNodes("featureMember");发生以下异常:java.lang.NoClassDefFoundError: org/jaxen/JaxenException    at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)    at or

  • java使用xpath和dom4j解析xml

    1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).DOM.Xanan文档.另外一种是DOM4J,是一个非常非常优秀的Java XML API,

  • javascript dom操作之cloneNode文本节点克隆使用技巧

    true:完全的复制一个节点,什么叫完全呢,就是复制一切,包括他的子节点,以至于文本节点,凡是有的,一律克隆,所谓完全 false:只克隆当前节点,不克隆任何的子节点,当然也不会克隆他所包裹的文本,因为任何文本都有指向他的节点(文本节点) 当然有时候两者是可以通用的哦,如果要复制的节点没有任何的子节点,这是二者全等:比如 img... 为了让大家理解的更为深刻,举个小例子吧: 复制代码 代码如下: <div> <span>Shadow</span> |No Shadow

  • php中使用DOM类读取XML文件的实现代码

    主要功能:php中使用DOM类读取XML文件 设计知识点: 1.XML节点循环读取 2.用iconv()函数实现编码转换,防止中文乱码 holiday.xml文件如下 复制代码 代码如下: <?xml version="1.0" encoding="UTF-8"?> <daysOff-overTime> <year> <yearName>2012</yearName> <holiday> <

  • 基于simple_html_dom的使用小结

    复制代码 代码如下: <P>简单范例<?phpinclude "simple_html_dom.php" ;    //加载simple_html_dom.php文件$html = file_get_html('http://www.google.com/');  //获取html$dom = new simple_html_dom();    //new simple_html_dom对象$dom->load($html)      //加载html// Fi

  • jQuery使用手册之二 DOM操作

    属性我们以<img id="a" scr="5.jpg"/>为例,在原始的javascript里面可以用var o=document.getElementById('a')取的id为a的节点对象,在用o.src来取得或修改该节点的scr属性,在jQuery里$("#a")将得到jQuery对象[ <img id="a" scr="5.jpg"/> ],然后可以用jQuery提供的很多

  • DOM基础教程之使用DOM控制表格

    表格的css控制就先不说了,首先分享下表格常用的DOM 表格添加操作的方法常用的为insertRow()和insertCell()方法. row是从零开始计算起的,例如: 复制代码 代码如下: var oTr = document.getElementById("member").insertRow(2) 是指将新行添加到第二行. 复制代码 代码如下: var aText = new Array(); aText[0] = document.createTextNode("f

  • DOM基础教程之使用DOM

    在了解DOM(文本对象模型)的框架和节点后,最重要的是使用这些节点处理html网页 对于一个DOM节点node,都有一系列的属性和方法可以使用.常用的有下表. 完善:http://www.w3school.com.cn/xmldom/dom_element.asp 1.访问节点 BOM提供了一些边界的方法访问节点,常用的就是getElementsByTagName(),和getElementById() 复制代码 代码如下: <script type="text/javascript&qu

  • DOM基础教程之使用DOM控制表单

    1.表单简介 表单<form>是网页中交互最多的形式之一,它通过各种形式接收用户的数据,包括下拉列表框,单选按钮,复选框和文本框,本篇主要介绍表单中常用的属性和方法 javascript中可以很方便的操作表单,例如获得表单数据进行有效验证,自动给表单域赋值,处理表单事件等. 此时每个form都解析为一个对象,即form对象,可以通过document.forms集合来引用这些对象,例如一个nama属性为form1的表单可以使用 复制代码 代码如下: document.forms["fo

  • DOM基础教程之使用DOM设置文本框

    1.控制用户输入的字符个数 对于单行文本框和密码输入框,可以利用maxlength属性控制用户输入的字符个数. 对于多行文本,maxlength为自定义属性,其值最多输入的字符的个数,在onkeypress事件发生时则调运返回LessThan()函数返回值,函数如下 <textarea name="comments" id="comments" cols="40" rows="4" maxlength="50&

  • DOM基础教程之使用DOM + Css

    1.使用getElementsByTagName修改class类别或者追加类别 复制代码 代码如下: <ul class="name1" onclick="clickz()">     <p>第一个</p>     <p>第一个</p>     <p>第一个</p>     <p>第一个</p> </ul> <script type=&quo

  • DOM基础教程之模型中的模型节点

    <html>位于网页的顶端 它没有父辈,称之为根节点 1.元素节点(element node) 可以说,整个DOM模型都是由元素节点(element node)组成 比如文本段落元素"<p>",无序清单的名称"<ul>",元素节点包含其他元素. 2.文本节点(text node) 例如<h2>中的文本"标题1",<li>中的文字内容,这些具体文本在DOM称为(text node) 3.属

  • DOM基础教程之事件对象

    浏览器中的事件都是以对象的形式存在的,同样ie浏览器与标准dom浏览器之间存在获取事件对象上也存在差别.在ie浏览器中事件对象是windows对象的一个属性event,访问通常采用如下方法. 复制代码 代码如下: oP.onclick = function(){ var oEvent = window.event; } 尽管它是window对象属性,但event对象还是只能在事件发生时被访问,所有的事件处理函数执行完之后,该对象就消失了. 而标准的dom规定event对象必须作为唯一的参数传给事

  • DOM基础教程之事件类型

    对于用户事件类型而言,最常用的是鼠标.键盘.浏览器. 1.鼠标事件: 鼠标的事件都频繁使用,下面例子就测试各种鼠标事件 复制代码 代码如下: <script language="javascript">             function handle(oEvent) {                 var disp = document.getElementById("display");                 if (window

  • Javascript & DHTML 实例编程(教程)DOM基础和基本API

    一.什么是DOM? 什么叫DOM,DOM是文档对象模型(Document Object Model,是基于浏览器编程(在本教程中,可以说就是DHTML编程)的一套API接口,W3C出台的推荐标准,每个浏览器都有一些细微的差别,其中以Mozilla的浏览器最与标准接近.单纯的Javascript要结合DOM才能做DHTML编程,才能做出漂亮的效果.应用于WEB.这点几乎与其它的语言无异,正如C/C++需要库支持是一样的道理.否则就是单纯的在语法上做研究了.因此,必须要对DOM有一定的认识,才能把J

  • DOM基础及php读取xml内容操作的方法

    本文实例讲述了DOM基础及php读取xml内容操作的方法.分享给大家供大家参考.具体分析如下: DOM(Document Object Model):文档对象模型.核心思想是:把 xml文件看作是一个对象模型,然后通过对象的方式来操作 xml 文件. php对xml文档进行增删改查(curd)操作,具体分析如下: xml文档:class.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <c

随机推荐