JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)

利用节点间的层次关系获取节点:

上一节讲了3中获取的方式:

* ※※一、绝对获取,获取元素的3种方式:—Element

* 1、getElementById(): 通过标签中的id属性值获来取该标签对象

* 2、getElementsByName(): 通过标签中的name属性值来获取该标签对象集合

* 3、getElementsByTagName(): 通过标签名来获取该标签对象集合

现在来看看相对获取的方式:

※※二、相对获取(利用节点之间的层次关系),获取节点:—Node

1、父节点:parentNode–属性

2、子节点:childNodes–集合

3、上一个兄弟节点:previousSibling–属性

4、下一个兄弟节点:nextSibling–属性

5、使用以上属性时,要小心空白符节点(#Text)的存在。对于表格,还要注意有一个隐含的父节点。

*/

演示代码:

<html>
<head>
<title>Dom模型演示3---利用节点间的层次关系获取节点</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
    /*
     * ※※一、绝对获取,获取元素的3种方式:---Element
     * 1、getElementById(): 通过标签中的id属性值获来取该标签对象
     * 2、getElementsByName(): 通过标签中的name属性值来获取该标签对象集合
     * 3、getElementsByTagName(): 通过标签名来获取该标签对象集合

       ※※二、相对获取(利用节点之间的层次关系),获取节点:---Node
       1、父节点:parentNode--属性
       2、子节点:childNodes--集合
       3、上一个兄弟节点:previousSibling--属性
       4、下一个兄弟节点:nextSibling--属性
       5、使用以上属性时,要小心空白符节点(#Text)的存在。对于表格,还要注意<tr>有一个隐含的父节点<tbody>。
     */

    //通过节点间的层次关系来获取节点
    function getNodeByLevel() {
        var tabNode = document.getElementById("table1");
        //获取父节点

        var node = tabNode.parentNode;
        //alert(node.nodeName);//BODY,如果是IE6则是:TBODY
        //alert( tabNode.parentNode.parentNode.nodeName);//HTML

        //获取子节点
        /*
           使用childNodes时,需注意几点:
           1,<table>标签下还隐藏一个<tbody>标签,<tbody>下面才是<tr>
           2,空白符(空格或换行符)是被看成是一个文本节点的。例如,如果<table>和<tr>之间有换行或空格,则<table>的第一个孩子节点nodeName是:#text
           3, 上面的<tbody>和#text节点是兄弟关系
         */
        //需求:显示出表格中的所有姓名
        var children = tabNode.childNodes;
        //alert(children[0].nodeName);//#text
        //alert(children[1].nodeName);//<tbody>
        var trNodes = children[1].childNodes;
        alert(trNodes.length);
        var str="";

        for(var x=0;x<trNodes.length;x++){
            //用卫条件把<tr>与<td>之间的空白符过滤掉
            if(trNodes[x].nodeType==3){
                continue;
            }

            //注意,trNodes[x].childNodes[0]是空白符即#text节点,trNodes[x].childNodes[1]才是<td>节点
            //str=str+trNodes[x].childNodes[1].innerText+" ";
            //上面是偷懒写法,如果想写得兼容性好些,应该还用for循环遍历strNodes[x]的所有孩子节点且过滤掉#text节点,获取第一个非空白子节点的innerText

            for(var i=0;i<trNodes[x].childNodes.length;i++){
                if(trNodes[x].childNodes[i].nodeType==3){
                    continue;
                }
                str=str+trNodes[x].childNodes[i].innerText+" ";
                break;
            }

        }
        alert(str);

        //获取兄弟节点

        //上一个
        var node  = tabNode.previousSibling;
        alert(node.nodeName);//#text
        node = node.previousSibling;
        alert(node.nodeName);//BR

        //下一个
        var node = tabNode.nextSibling;
        alert(node.nodeName);//#text
        node = node.nextSibling;
        alert(node.nodeName);//HR
    }
</script>

</head>

<body>
    <div id="divId1">div区域1中的文字</div>
    <br/>
    <table id="table1">
        <tr>
            <td>Jack</td>
            <td>20</td>
        </tr>
        <tr>
            <td>张三</td>
            <td>23</td>
        </tr>
        <tr>
            <td>李四</td>
            <td>22</td>
        </tr>
        <tr>
            <td>罗斯</td>
            <td>22</td>
        </tr>
    </table>
    <hr />

    <input type="button" value="获取元素" onclick="getNodeByLevel()" />
</body>

</html>

部分演示结果:

节点的增、删、改操作–查有6种,在前面已经讲过

演示代码:

<html>
    <head>
        <title>Dom模型演示4---节点的增、删、改操作--查有6种,在前面已经讲过</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <style type="text/css">
            div{
                border: #0000ff solid 1px;
                width: 200px;
                padding: 30px;/*内补丁*/
                margin: 10px;/*外补丁*/
            }
            #div1{  background-color:#00ccff;   }/*设置或检索对象的背景颜色。*/
            #div2{  background-color:#ffccff;   }
            #div3{  background-color:#ffff00;   }
            #div4{  background-color:#00cc00;   }
        </style>
    </head>

    <body>
        <div id="div1"> </div>
        <div id="div2"> div区域2中的文字 </div>
        <div id="div3"> div区域3中的文字 </div>
        <div id="div4"> div区域4中的文字 </div>

        <hr/>

        <input type="button" value="添加一个文本节点" onclick="creataAndadd1()" >
        <input type="button" value="添加一个按钮节点" onclick="creataAndadd2()" >
        <input type="button" value="第三种添加方式" onclick="creataAndadd3()" >
        <br/>
        <input type="button" value="删除节点" onclick="delNode()" />
        <br/>
        <input type="button" value="移动替换节点" onclick="updateNode1()" />
        <input type="button" value="克隆替换节点" onclick="updateNode2()" />

        <script type="text/javascript">
            //添加一个文本节点
            function creataAndadd1(){
                //createTextNode 从指定值中创建文本字符串。
                //创建一个文本节点
                var oTextNode = document.createTextNode("新添加的文本内容");
                //获取div1节点
                var oDivNode1 = document.getElementById("div1");
                //让div1节点把oTextNode节点添加为孩子
                oDivNode1.appendChild(oTextNode);
                //appendChild 给对象追加一个子元素。
            }

            //添加一个按钮节点---基于对象,dom
            function creataAndadd2(){
                //创建一个按钮节点
                var oBtnNode = document.createElement("input");
                //createElement 为指定标签创建一个元素的实例。 

                oBtnNode.type="button";
                oBtnNode.value="一个按钮";

                //获取div1节点
                var oDivNode1 = document.getElementById("div1");
                //让div1节点把oBtnNode节点添加为孩子
                oDivNode1.appendChild(oBtnNode);
            }

            //第3种添加节点的方式---html的方式
            function creataAndadd3(){
                //获取div1节点
                var oDivNode1 = document.getElementById("div1");

                //innerHTML 设置或获取位于对象起始和结束标签内的 HTML。
                //添加文本节点
                oDivNode1.innerHTML = "湖南城院";//只赋一个
                //oDivNode1.innerHTML +="湖南城院";//追加

                //继续添加按钮
                //oDivNode1.innerHTML = "<input type=‘button‘ value=‘按钮a‘/> ";
                oDivNode1.innerHTML += "<input type=‘button‘ value=‘按钮a‘/> ";
                //继续添加链接
                oDivNode1.innerHTML += "<a href=‘http://www.baidu.com‘/>百度一下</a>";
            }

            //删除节点
            function delNode(){
                //获取div2节点
                var oDivNode2 = document.getElementById("div2");
                //oDivNode2.removeNode();//只删当前节点-removeNode 从文档层次中删除对象。
                //360-8.1浏览器中无效-IE支持
                //oDivNode2.removeNode(true);//删当前节点及子节点--子树-
                //360-8.1浏览器中无效-IE支持
                //※removeNode()方法不建议使用,因为这种删除不彻底!---建议使用父节点来删除
                //因为-自己删除自己,怎么可能删除干净嘛

                oDivNode2.parentNode.removeChild(oDivNode2);//都支持
                //removeChild 从元素上删除子结点。
            }

            //修改节点1---移动替换
            function updateNode1(){
                var oDivNode1 = document.getElementById("div1");

                var oDivNode3 = document.getElementById("div3");
                //oDivNode1.replaceNode(oDivNode3);//自己替换,
                //不建议-360-8.1浏览器中无效-IE支持
                //replaceNode 用其它元素替换对象。 

                oDivNode1.parentNode.replaceChild(oDivNode3,oDivNode1);
                //replaceChild 用新的子元素替换已有的子元素。
            }

            //修改节点2---克隆替换
            function updateNode2(){
                var oDivNode1 = document.getElementById("div1");
                var oDivNode3 = document.getElementById("div3");

                //var oDivNode3Clone = oDivNode3.cloneNode();//不包含子节点的克隆
                //cloneNode 从文档层次中复制对对象的引用。
                var oDivNode3Clone = oDivNode3.cloneNode(true);//包含子节点的克隆
                oDivNode1.parentNode.replaceChild(oDivNode3Clone, oDivNode1);
            }

        </script>

    </body>

</html>

演示结果:

一开始:

点第一个按钮:

再点第二个按钮:

再点第三个按钮:

再点第四个按钮:

点第五个按钮:

点第六个按钮;

时间: 2024-08-04 23:22:26

JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)的相关文章

Unix 网络编程 I/O 模型 第六章

前提,也是重点是, 当接收收据.或者读取数据时,分两步 1 等待数据准备好. 2 从内核拷贝数据到进程. 对于一个network IO 即 socket(这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel).当一个read操作发生时,它会经历两个阶段: 1 等待数据准备 (Waiting for the data to be ready) 2 将数据从内核拷贝到进程中 (Copying the data

服务器端网络编程之线程模型

上一篇文章<服务器端网络编程之 IO 模型>中讲到服务器端高性能网络编程的核心在于架构,而架构的核心在于进程-线程模型的选择.本文将主要介绍传统的和目前流行的进程-线程模型,在讲进程-线程程模型之前需要先介绍一种设计模式: Reactor 模式,不明白的看这里<设计模式详解>,文中有一句话对 Reactor 模式总结的很好,引用下. Reactor 模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers:这个Ser

Python网络编程(OSI模型、网络协议、TCP)

前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象出来的模型 在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它把各个点.面.体的信息联系到一起,从而实现这些资源的共享. 网络是人类发展史来最重要的发明,提高了科技和人类社会的发展. 在1999年之前,人们一般认为网络的结构都是随机的.但随着Barabasi和Watts在1999年分别发现

unix网络编程几种模型比较

1.阻塞式IO:套接字默认是阻塞式的,该模型会一直阻塞在系统调用上,直到数据到达内核区并且完成从内核区到用户进程区的数据拷贝. 2.非阻塞式IO:该模型将套接字的状态设置为非阻塞,会一直轮询套接字的状态,直到数据到达内核区并且完成内核区到用户区的数据拷贝,个人感觉类似于linux下的自旋锁. 3.IO复用:该模型通常阻塞在select/poll系统调用,当内核区数据到达时,select系统调用返回,再次调用recvfrom等系统调用同步完成内核区到用户区的数据拷贝 4.信号驱动IO:当数据到达内

asp网络编程:Web程序中网页间数据传递方法小结

我们总是会遇到这样的情况,需要将数值从一个网页传递到另一个网页.在这篇文章中,向你展示了几种从一个网页向另一个网页传递数值的几种方法.在此例子中,创建的网页由一个文本控件和几个按钮控件组成.在文本框中输入的数据通过被标识在按钮控件中的不同方法从一个网页传递到另一个网页. Response.Redirect 让我们首先看一看如何使用Response.Redirect方法传递数据.这是它们之中最简单的方法.在文本框中输入一些数据,并且当你输入完成数据后,按下“Respose.Redirect”按钮.

UNIX网络编程1.7OSI模型

android 网络编程--socket tcp/ip udp http之间的关系

网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络层.链路层通信协议概图.我们经常接触到的一般是: http协议:应用层协议,并且http协议是基于tcp连接的,主要解决的是如何包装协议的 tcp协议:运输层协议,通常也叫做tcp/ip协议,主要解决数据如何在网络中传输 udp协议:运输层协议,用户数据报协议,不可靠的协议,只负责把应用层的协议的数

JDK中ClassLoader的分类以及ClassLoader间的层次关系

几个常见的ClassLoader: bootstrap  class  loader: 最早启动的class  loader,一般使用C语言,汇编语言,或是c++写的,用操作系统本地语言写的.这个class  loader你动不了,也没有名字,打印出来是空值. 1,负责先把其他的class loader   load进来,然后其他class  loader再load其他class 2,load  jre最核心的类,最核心的rt.jar拿出来把里边的class load进来. extension

Java网络编程和NIO详解6:Linux epoll实现原理详解

Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ Linux epoll实现原理详解 在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者pol