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>

时间: 2024-10-24 21:52:44

DOM基础教程之使用DOM_基础知识的相关文章

Javascript基础教程之变量_基础知识

javascript 中变量通过var关键字(variable)来声明的. 复制代码 代码如下: var school = "beijingyizhong" 也可以通过var 关键字给变量多个值. 复制代码 代码如下: var school = "beijingyizhong" , diqu = "beijing" , age = 100; 此外,与java不同,javascript可以在同一个变量中存储不同的数据类型.例如 复制代码 代码如下:

Photoshop基础教程:专色通道基础知识

专色通道,可以保存专色信息的通道--即可以作为一个专色版应用到图像和印刷当中,这是它区别于Alpha通道的明显之处.同时,专色通道具有Alpha通道的一切特点:保存选区信息.透明度信息.每个专色通道只是一个以灰度图形式存储相应专色信息. 一个形成很长时间,但平时很少被涉及的话题,就是专色通道. 我入行有几年了,一直都以印刷设计和印刷制版为主,但专色通道对我来说还是一个比较生疏的话题,平时很少接触,几乎不用(我说的是真话),因为即使做专色,用通常的手法也足以应付,而且很多专色是在CD中完成的(我用

C语言基础教程(一)基础篇(8)

七.Debug(调试)菜单按Alt+D可选择Debug菜单, 该菜单主要用于查错, 它包括以下内容:Evaluate Expression 要计算结果的表达式. Result 显示表达式的计算结果. New value 赋给新值. Call stack 该项不可接触.而在Turbo C debuger 时用于检 查堆栈情况. Find function 在运行Turbo C debugger时用于显示规定的函数. Refresh display 如果编辑窗口偶然被用户窗口重写了可用此恢复 编辑窗

php基础教程——5数据库总结

<?php //连接数据库,并选中 if ($dbc = @mysql_connect('localhost', 'root', '')){ if (@mysql_select_db('mydata')){ print ' selected! '; }else{ print 'can not select error: '. mysql_error().' '; } }else{ print 'can not connect. error: '. mysql_error().' '; } //创

Asp基础教程(上)

基础教程|基础教程 一.Asp基本知识 1.Asp是Active Server Pages的简称,是解释型的脚本语言环境:2.Asp的运行需要Windows操作系统,9x下需要安装PWS:而NT/2000/XP则需要安装Internet Information Server(简称IIS):3.Asp和JSP的脚本标签是"<%%>",PHP的则可以设定为多种:4.Asp的注释符号是"'":5.使用附加组件,可以扩展Asp的功能. 例子: HelloWorl

linux Crontab 使用基础教程

 cron来源于希腊单词chronos(意为"时间"),是linux系统下一个自动执行指定任务的程序.例如,你想在每晚睡觉期间创建某些文件或文件夹的备份,就可以用cron来自动执行. 服务的启动和停止 cron服务是linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond stop /sbin/service crond restart /sbin/service crond

json 入门基础教程 推荐_json

如果您阅读了本系列前面的文章,那么应已对数据格式有了相当的认识.前面的文章解释了在许多异步应用程序中如何恰当地使用纯文本和简单的名称/值对.可以将数据组合成下面这样的形式: firstName=Brett&lastName=McLaughlin&email=brett@newInstance.com   这样就行了,不需要再做什么了.实际上,Web 老手会意识到通过 GET 请求发送的信息就是采用这种格式. 然后,本系列讨论了 XML.显然,XML 得到了相当多的关注(正面和负面的评价都有

javascript asp教程错误处理_ASP基础

The ASPError Object has zero (0) Methods, nine (9) Properties, zero (0) Events, and zero (0) Collections. AspCode AspDescription Category Column Description File Line Number Source The way you access the ASPError Properties is with a Server Method. Y

Python基础教程之字符串

1 基本字符串操作 2 字符串格式化:精简版 2.1 用字符串格式化操作符 2.2 用string的Template格式化字符串 3 字符串格式化:完整版 3.1 转换说明符 3.2 简单转换 3.3 字段宽度和精度 3.4 符号,对齐和 0 填充 4 字符串方法 4.1 find 4.2 join 4.3 lower 4.4 replace 4.5 split 4.6 strip 4.7 translate 1 基本字符串操作 说明:字符串也是序列的一种,所以分片,乘法,索引,求长度,最大,