zoukankan      html  css  js  c++  java
  • DOM树简单理解学习

    引用自:https://blog.csdn.net/qq_41328247/article/details/80074098

    为什么会提到Dom树呢,或许它对于我们很好地理解网页各个元素,标签和控件搭配,以及各种js,css等的加载会有一些帮助。笔者在工程中遇到了一些小问题,本质就是dom树的东西掌握的不扎实。所以借此来梳理一下。 

    1.HTML DOM 
    ok, 我们先来看一下W3school中怎么解释这个概念和结构的。W3school是一个很不错的网站,很适合初学者和基础不扎实的人。

    HTML DOM 定义了访问和操作 HTML 文档的标准方法。DOM 将 HTML 文档表达为树结构。 
    这里写图片描述

    W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。 
    W3C DOM 标准被分为 3 个不同的部分: 
    核心 DOM - 针对任何结构化文档的标准模型 
    XML DOM - 针对 XML 文档的标准模型 
    HTML DOM - 针对 HTML 文档的标准模型 
    我们主要来看HTML DOM 
    HTML DOM 是: 
    HTML 的标准对象模型 
    HTML 的标准编程接口 
    W3C 标准

    DOM 节点 
    根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点: 
    整个文档是一个文档节点 
    每个 HTML 元素是元素节点 
    HTML 元素内的文本是文本节点 
    每个 HTML 属性是属性节点 
    注释是注释节点 
    这里写图片描述

    2.获取节点的原生方法

    这里写图片描述

    innerHTML 属性

    获取元素内容的最简单方法是使用 innerHTML 属性。

    innerHTML 属性对于获取或替换 HTML 元素的内容很有用。

    document.write输出文本

    document.write(document.anchors.length); 锚的数量:  加入anchors[]  可以看成数值寻找索引

    document.write(document.forms[0].name);  表单数目

    document.write(document.images.length); 图像数目

    document.write(document.images[0].id); 图像id

    document.write(document.links.length); 链接数目

    document.write(document.domain); 返回区域名

    document.write(document.lastModified); 文档最后一次修改时间

    document.write(document.title); 返回文档标题

    document.writeln document write 不同  writeln 新增一行   write 在后面增加

    
    
    
    
    
    
    
    
    
    
    

    getElementById() 方法

    getElementById() 方法返回带有指定 ID 的元素引用:

    语法

    node.getElementById("id");
    1.  
      <p id="intro">Hello World!</p>
    2.  
       
    3.  
      <script>
    4.  
      var txt=document.getElementById("intro").innerHTML;
    5.  
      document.write(txt);

     getElementById 是一个方法,而 innerHTML 是属性。

    改变 HTML 样式

    通过 HTML DOM,您能够访问 HTML 元素的样式对象

    1.  
      <p id="p1">Hello world!</p>
    2.  
      <p id="p2">Hello world!</p>
    3.  
       
    4.  
      <script>
    5.  
      document.getElementById("p2").style.color="blue";
    6.  
      document.getElementById("p2").style.fontFamily="Arial";
    7.  
      document.getElementById("p2").style.fontSize="larger";
    8.  
      </script>

    getElementsByTagName() 方法

    getElementsByTagName() 返回带有指定标签名的所有元素。

    语法

    node.getElementsByTagName("tagname");
    1.  
      <p>Hello World!</p>
    2.  
      <p>DOM 是非常有用的!</p>
    3.  
      <p>这个实例演示了 <b>getElementsByTagName</b> 方法的使用。</p>
    4.  
       
    5.  
      <script>
    6.  
      x=document.getElementsByTagName("p");
    7.  
      document.write("第一个段落的文本为: " + x[2].innerHTML);
    8.  
      </script>

      根据X[ ]寻找索引 然后显示

    例子返回包含文档中所有 <p> 元素的列表,并且这些 <p> 元素应该是 id="main" 的元素的后代(子、孙等等)

    1.  
      <div id="main">
    2.  
      <p>DOM 是非常有用的。</p>
    3.  
      <p>这个实例演示了 <b>getElementsByTagName</b> 方法的使用。</p>
    4.  
      </div>
    5.  
       
    6.  
      <script>
    7.  
      var x=document.getElementById("main").getElementsByTagName("p");
    8.  
      document.write(x[0].innerHTML);
    9.  
      </script>

    The getElementsByClassName() Method

    如果您希望查找带有相同类名的所有 HTML 元素,请使用这个方法:

    document.getElementsByClassName("intro");

    如果您希望查找带有相同类名的所有 HTML 元素,请使用这个方法:

    document.getElementsByClassName("intro");

    上面的例子返回包含 class="intro" 的所有元素的一个列表:

    注意:getElementsByClassName() 在 Internet Explorer 5,6,7,8 中无效。

     

     

    appendChild() 方法  将新节点增加到指定节点

    creatElement() 方法 创建属性节点  

    creatTextNode() 方法 创建文本节点

    1.  
      <div id="div1">
    2.  
      <p id="p1">这是一个段落。</p>
    3.  
      <p id="p2">这是另一个段落。</p>
    4.  
      </div>
    5.  
      <script>
    6.  
      var para=document.createElement("p");
    7.  
      var node=document.createTextNode("这是一个新段落。");
    8.  
      para.appendChild(node);
    9.  
      var element=document.getElementById("div1");
    10.  
      element.appendChild(para);
    11.  
      </script>

    这段代码创建了一个新的 <p> 元素:

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

    如需向 <p> 元素添加文本,您首先必须创建文本节点。这段代码创建文本节点:

    var node=document.createTextNode("这是一个新段落。");

    然后您必须向 <p> 元素追加文本节点:

    para.appendChild(node);

    最后,您必须向已有元素追加这个新元素。

    这段代码查找到一个已有的元素:

    var element=document.getElementById("div1");

    这段代码向这个已存在的元素追加新元素:

    element.appendChild(para)

    创建新的 HTML 元素 - insertBefore()

    appendChild() 方法,将新元素作为父元素的最后一个子元素进行添加。

    1.  
      <div id="div1">
    2.  
      <p id="p1">这是一个段落。</p>
    3.  
      <p id="p2">这是另外一个段落。</p>
    4.  
      </div>
    5.  
       
    6.  
      <script>
    7.  
      var para=document.createElement("p");
    8.  
      var node=document.createTextNode("这是一个新段落。");
    9.  
      para.appendChild(node);
    10.  
       
    11.  
      var element=document.getElementById("div1");
    12.  
      var child=document.getElementById("p1");
    13.  
      element.insertBefore(para,child);
    14.  
      </script>

    删除已有的 HTML 元素removechild

    1.  
      <div id="div1">
    2.  
      <p id="p1">这是一个段落。</p>
    3.  
      <p id="p2">这是另一个段落。</p>
    4.  
      </div>
    5.  
      <script>
    6.  
      var parent=document.getElementById("div1");
    7.  
      var child=document.getElementById("p1");
    8.  
      parent.removeChild(child);
    9.  
      </script>

    查找 id="div1" 的元素:

    var parent=document.getElementById("div1");

    查找 id="p1" 的 <p> 元素:

    var child=document.getElementById("p1");

    从父元素中删除子元素:

    parent.removeChild(child);

     

    替换子节点属性 replacechild

    1.  
      <div id="div1">
    2.  
      <p id="p1">这是一个段落。</p>
    3.  
      <p id="p2">这是另外一个段落。</p>
    4.  
      </div>
    5.  
       
    6.  
      <script>
    7.  
      var parent=document.getElementById("div1");
    8.  
      var child=document.getElementById("p1");
    9.  
      var para=document.createElement("p");
    10.  
      var node=document.createTextNode("这是一个新的段落。");
    11.  
      para.appendChild(node);
    12.  
      parent.replaceChild(para,child);
    13.  
      </script>

    nodeValue 属性

    nodeValue 属性规定节点的值。

    • 元素节点的 nodeValue 是 undefined 或 null
    • 文本节点的 nodeValue 是文本本身
    • 属性节点的 nodeValue 是属性值

    childNodes 和 nodeValue

    除了 innerHTML 属性,您也可以使用 childNodes 和 nodeValue 属性来获取元素的内容。

    下面的代码获取 id="intro" 的 <p> 元素的值:

    1.  
      <p id="intro">Hello World!</p>
    2.  
       
    3.  
      <script>
    4.  
      txt=document.getElementById("intro").childNodes[0].nodeValue;
    5.  
      document.write(txt);
    6.  
      </script>

    使用事件

    HTML DOM 允许您在事件发生时执行代码。

    当 HTML 元素"有事情发生"时,浏览器就会生成事件:

    • 在元素上点击
    • 加载页面
    • 改变输入字段

    你可以在下一章学习更多有关事件的内容。

    下面两个例子在按钮被点击时改变 <body> 元素的背景色

    <input type="button"onclick="document.body.style.backgroundColor='lavender';"value="修改背景颜色">

    由函数执行相同的代码

    function ChangeBackground(){

    document.body.style.backgroundColor="lavender";

    }

    </script> <input type="button" onclick="ChangeBackground()" value="修改背景颜色" />

     

     

    <</p>

    <script>function ChangeText(){

    document.getElementById("p1").innerHTML="Hello Runoob!";

    }

    </script> <input type="button" onclick="ChangeText()" value="修改文本" />

    对事件作出反应

    当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时。

    如需在用户点击某个元素时执行代码,请把 JavaScript 代码添加到 HTML 事件属性中:

    onclick=JavaScript

    <h1 onclick="this.innerHTML='Ooops!'">点击文本!</h1>

     

     

    <script>function changetext(id){

    id.innerHTML="Ooops!";

    }

    </script>

    </head>

    <body>

    <h1 onclick="changetext(this)">点击文本!</h1>

     

    onload 和 onunload 事件

    当用户进入或离开页面时,会触发 onload 和 onunload 事件。

    onload 事件可用于检查访客的浏览器类型和版本,以便基于这些信息来加载不同版本的网页。

    onload 和 onunload 事件可用于处理 cookies

    1.  
      <body onload="checkCookies()">
    2.  
       
    3.  
      <script>
    4.  
      function checkCookies()
    5.  
      {
    6.  
      if (navigator.cookieEnabled==true)
    7.  
      {
    8.  
      alert("Cookie 可用")
    9.  
      }
    10.  
      else
    11.  
      {
    12.  
      alert("Cookie 不可用")
    13.  
      }
    14.  
      }
    15.  
      </script>
    16.  
       
    17.  
      <p>页面载入时,弹出浏览器 Cookie 可用状态。</p>

    onchange 事件

    onchange 事件常用于输入字段的验证。

    下面的例子展示了如何使用 onchange。当用户改变输入字段的内容时,将调用 upperCase() 函数。

    1.  
      function myFunction(){
    2.  
      var x=document.getElementById("fname");
    3.  
      x.value=x.value.toUpperCase();
    4.  
      }
    5.  
      </script>
    6.  
      </head>
    7.  
      <body>
    8.  
       
    9.  
      输入你的名字: <input type="text" id="fname" onchange="myFunction()">
    10.  
      <p>当你离开输入框后,函数将被触发,将小写字母转为大写字母。</p>

    onmouseover 和 onmouseout 事件

    onmouseover 和 onmouseout 事件可用于在鼠标指针移动到或离开元素时触发函数。

    1.  
      <div onmousedown="mDown(this)" onmouseup="mUp(this)" style="90px;height:20px;padding:40px;">Click Me</div>
    2.  
    3.  
      <script>
    4.  
      function mDown(obj)
    5.  
      {
    6.  
      obj.style.backgroundColor="#1ec5e5";
    7.  
      obj.innerHTML="Release Me"
    8.  
      }
    9.  
    10.  
      function mUp(obj)
    11.  
      {
    12.  
      obj.style.backgroundColor="#D94A38";
    13.  
      obj.innerHTML="Thank You"
    14.  
      }
    15.  
      </script>

    onmousedown、onmouseup 以及 onclick 事件

    onmousedown、onmouseup 以及 onclick 事件是鼠标点击的全部过程。首先当某个鼠标按钮被点击时,触发 onmousedown 事件,然后,当鼠标按钮被松开时,会触发 onmouseup 事件,最后,当鼠标点击完成时,触发 onclick 事件

    1.  
      <div onmouseover="mOver(this)" onmouseout="mOut(this)" style="120px;height:20px;padding:40px;">Mouse Over Me</div>
    2.  
       
    3.  
      <script>
    4.  
      function mOver(obj)
    5.  
      {
    6.  
      obj.innerHTML="Thank You"
    7.  
      }
    8.  
       
    9.  
      function mOut(obj)
    10.  
      {
    11.  
      obj.innerHTML="Mouse Over Me"
    12.  
      }
    13.  
      </script>

    HTML DOM 节点列表长度

    length 属性定义节点列表中节点的数量。

    您可以使用 length 属性来循环节点列表:

    1.  
      x=document.getElementsByTagName("p");
    2.  
      for (i=0;i<x.length;i++)
    3.  
      {
    4.  
      document.write(x[i].innerHTML);
    5.  
      document.write("<br>");
    6.  
      }
    • 获取所有 <p> 元素节点
    • 输出每个 <p> 元素的文本节点的值

    DOM 根节点

    这里有两个特殊的属性,可以访问全部文档:

    • document.documentElement - 全部文档
    • document.body - 文档的主体
    1.  
      <p>Hello World!</p>
    2.  
      <div>
    3.  
      <p>DOM 是非常有用的!</p>
    4.  
      <p>这个实例演示了 <b>document.body</b> 属性。</p>
    5.  
      </div>
    6.  
       
    7.  
      <script>
    8.  
      alert(document.body.innerHTML);
    9.  
      </script>

        

    3.JS中的节点操作 
    写几个常用的API, 来操作DOM节点。 
    (1)document.getElementById()这个是最基本的了。 
    (2)object.innerHTML该属性设置或返回object之间的HTML 
    (3)document.createElement()创建节点对象。 
    (4)document.body.appendChild()尾部插入结点。 
    (5)object.parentNode.removeChild(oChildNode);移除结点

    4.jQuery中的结点操作 
    (1)添加结点 
    a. append()和appendTo(), 两个方法刚好是对应的一对儿操作。

    $('#parentNodeId').append(childNode);
    • 1
    $('#childeNode').appendTo(parentNode);
    • 1

    b. prepend()和prependTo(), 这也是一对儿对应的操作方法。其作用是添加一个结点到父节点中并前置。用法和上一对儿一样。

    c. 与之对应的还有after, insertAfter; before, insertBefore等,其用法都和上面的相同。其效果是将新建的元素插入到指定的元素之后/前,并和目标元素紧邻,作为兄弟结点存在。

    (2)删除结点 
    a. remove() 
    remove()方法删除所有匹配的元素,传入的参数用于筛选元素,该方法可以删除元素中所有的子节点,当匹配的节点及后代被删除后,该方法返回值是指向被删除结点的引用,因此可以使用该引用,再使用被删除的元素。

    1.  
      $span = $('span').remove();
    2.  
      $span.insertAfter('ul');
    • 1
    • 2

    我们可以看到,该示例中,先删除所有的span元素,把删除的元素使用$span接收,把删除后的元素添加到ul后面,作为ul的兄弟结点。该操作产生的效果即把所有的span元素以及后代元素移到ul后面。 
    b. empty() 
    empty()方法严格来讲并不是删除元素,该方法只是清空节点,它能清空元素中的所有子节点。

    (3)修改DOM节点 
    a. 复制节点,当clone()方法有参数,并且为true时,表示同时复制该元素的属性,如果没有参数,表示不复制属性。

    $(element).clone(true);
    • 1

    b.替换节点 
    这两个方法都可以实现替换节点的问题。

    1.  
      $(element).replacewith();
    2.  
      $(element).replaceAll();
    • 1
    • 2

    c.包裹节点

    1.  
      $(element).wrap()
    2.  
      $(element).wrapAll()
    3.  
      $(element).wraplnner()
    • 1
    • 2
    • 3

    (4)属性操作 
    attr()和removeAttr()。 attr()方法能够获取元素属性,也能够设置元素属性。removeAttr()方法删除特定的属性,方法是在参数中指定属性名。

    1.  
      $('p').attr('title');
    2.  
      $('p').attr('title':'题目');
    3.  
      $('p').attr({'title':'题目','name':'水果'});
    • 1
    • 2
    • 3

    (5)样式操作 
    addClass()、removeClass()这对儿方法是添加和删除样式。 
    toggleClass()该方法用来切换目标元素的样式。 
    (6)其他常见操作 
    第一句是获取值,第二句是设置值。

    1.  
      $('id').val();
    2.  
      $('id').val('hello');
    • 1
    • 2

    css操作 
    设置添加css样式

    $('p').css('color','red');
    • 1

    至此,大概的Dom操作就已经梳理完了。

    按照惯例,列出一些可以参考的资料 
    http://www.cnblogs.com/ini_always/archive/2011/11/09/2243671.html 
    http://wenku.baidu.com/view/a6b9673783c4bb4cf7ecd119.html 
    http://www.nowamagic.net/librarys/posts/jquery/5 
    http://www.blogjava.net/DLevin/archive/2012/11/25/391933.html 
    http://www.w3school.com.cn/htmldom/dom_nodes.asp 
    http://www.2cto.com/kf/201205/130535.html 
    http://group.cnblogs.com/topic/39811.html 
    http://www.cnblogs.com/bro-ma/p/3063942.html

    分享支援  造福人间

  • 相关阅读:
    Gym 100801D Distribution in Metagonia (数学思维题)
    Gym 100801E Easy Arithmetic (思维题)
    GNOME编辑器--gedit 构建基本脚本
    linux默认编辑器 sublime
    su和su-命令的本质区别
    #ifdef #ifndef使用
    linux 安装软件程序
    linux命令行与shell脚本编程大全---更多bash shell命令
    预处理语句--#define、#error和#warning
    FW开发代码规范---小任性(2)
  • 原文地址:https://www.cnblogs.com/cjeandailynotes/p/10508623.html
Copyright © 2011-2022 走看看