DOM【介紹、HTML中的DOM、XML中的DOM】

来源:https://www.cnblogs.com/Java3y/archive/2018/03/02/8492782.html
-Advertisement-
Play Games

什麼是DOM? DOM(Document Object Model)文檔對象模型,是 語言和平臺的中立介面。。 允許程式和腳本動態地訪問和更新文檔的內容 。 為什麼要使用DOM? Dom技術使得 用戶頁面可以動態地變化,如可以動態地顯示或隱藏一個元素,改變它們的屬性,增加一個元素等 ,Dom技術使得 ...


什麼是DOM?

DOM(Document Object Model)文檔對象模型,是語言和平臺的中立介面。。

允許程式和腳本動態地訪問和更新文檔的內容

為什麼要使用DOM?

Dom技術使得用戶頁面可以動態地變化,如可以動態地顯示或隱藏一個元素,改變它們的屬性,增加一個元素等,Dom技術使得頁面的交互性大大地增強

HTML的DOM

HTML的DOM是一個記憶體對象樹,在瀏覽器中只保存一份,HTML的DOM修改HTML的內容會直接反應到瀏覽器中

這裡寫圖片描述

API

NODE對象API

在DOM眼中,HTML是由不同類型的節點組成的,這些節點都屬性NODE對象。

NODE對象有一個nodeType的屬性可用於判斷節點類型

這裡寫圖片描述


HTML不同類型的節點之間都是有聯繫的:

  • 位於一個節點之上的節點是該節點的父節點(parent)
  • 一個節點之下的節點是該節點的子節點(children)
  • 同一層次,具有相同父節點的節點是兄弟節點(sibling)
  • 一個節點的下一個層次的節點集合是節點後代(descendant)
  • 父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor)

於是乎,NODE對象也有訪問節點的屬性和方法

屬性:

這裡寫圖片描述

這裡寫圖片描述

總的來說就是:得到節點的信息(節點名字、節點值)以及訪問節點的兄弟、父親


方法:

這裡寫圖片描述

這裡寫圖片描述

總的來說就是:添加、替換、刪除子節點,判斷是否有子節點,克隆子節點


document

HTML的DOM中我們提到並大量使用了document這個Javascirpt的內置對象,請註意這個對象僅僅可以表示HTML的根節點

document的屬性:

  • documentElement【可以獲取得到<html>這個節點】

document方法:

  • createElement()【創建一個元素節點】
  • createComment()【創建註釋】
  • createAttribute()【創建屬性節點】
  • createTextNode()【創建文本節點】
  • getElementById()【通過id得到該元素節點】
  • getElementsByTagName()【通過標簽名,得到所有標簽名的數組】

Element介面

Element代表的是元素節點,是我們經常用到的一個介面!

Element屬性:

  • tagName【返回的是元素標簽的大寫名稱

Element方法:

  • getAttribute(String name)【得到屬性的值】
  • setAttribute(String name,String value)【設置屬性的名稱和值,不存在則創建】
  • getElementsByTabName()【返回該元素節點的子孫節點的數組
  • removeAttribute()【移除屬性】

當我們設置屬性的時候,我們不是調用方法來設置,而經常會這樣做:


    var input = document.createElement("input");
    input.value = "aa";
    input.name = "bb";

XML的DOM

我們可能會用XML文件作為客戶端和伺服器的傳輸文件。於是我們需要學習在JavaScript代碼中通過DOM操作XML文檔

XML和HTML的API是十分類似的,這裡就不贅述了。

裝載XML

客戶端和服務端如果是通過XML文件或者XML字元串進行交互數據的話。那麼,我們需要裝載伺服器的XML文件或XML字元串到JavaScript中的DOM對象。

現在問題就是,IE和fireFox的裝載XML方式是不一樣的。因此,我們最好封裝成一個方法來裝載XML

/**
 * @param flag true代表的是文件,false代表的是字元串
 * @param xmldoc 要封裝成DOM對象的字元串或文件
 * @return 返回的是根節點的元素節點
 *  重點放在高版本上!!
 * */


function loadXML(flag, xmldoc) {

    //瀏覽器是低版本的IE
    var objXml;
    if (window.ActiveXObject) {

        //是IE的話,有兩種方式來創建ActiveXObject對象
        var name = ["MSXML2.DOMDocument", "Miscrosoft.XmlDom"];
        for (var i = 0; i < name.length; i++) {
            objXml = new ActiveXObject(name);
            break;
        }

        //設置為同步【裝載XML文件成DOM對象,我們都是同步操作】
        objXml.async = false;

        //如果是字元串
        if (flag == false) {
            objXml.loadXML(xmldoc);
        } else {
            //如果是文件
            objXml.load(xmldoc)
        }
        return objXml.documentElement;


        //瀏覽器是fireFox或者高版本的IE
    } else if (document.implementation.createDocument) {
        //字元串
        if (flag == false) {

            //創建對象,解析XML字元串
            objXml = new DOMParser();

            //解析到根節點
            var root = objXml.parseFromString(xmldoc, "text/xml");
            return  root.documentElement;


        } else {

            //由於安全問題,想要得到XML文件,需要通過XMLHttpRequest對象來獲取
            objXml = new XMLHttpRequest();

            //同步
            objXml.open("GET", "1.xml", false);

            objXml.send(null);

            //返回XML數據
            return objXml.responseXML.documentElement;

        }
        //解析不了啦
    } else {
        alert("解析不了了");
    }

}

測試

這裡寫圖片描述


去除空白字元

如果有需要就加這段功能吧!


function removeBlank(xml) {
    if (xml.childNodes.length > 1) {
        for (var loopIndex = 0; loopIndex < xml.childNodes.length; loopIndex++) {
            var currentNode = xml.childNodes[loopIndex];
            if (currentNode.nodeType == 1) {
                removeBlank(currentNode);
            }
            if (((/^\s+$/.test(currentNode.nodeValue))) && (currentNode.nodeType == 3)) {
                xml.removeChild(xml.childNodes[loopIndex--]);
            }
        }
    }
}

XPATH

XPATH技術其實我們已經接觸過了,在講解XML的時候,我們已經使用過了XPATH技術了。

可以參考我之前的XML博文:http://blog.csdn.net/hon_3y/article/details/55049184

XPATH總體可分為三種搜索:

  • 絕對路徑搜索(/根節點/子節點)
  • 相對路徑搜索(子節點/子節點)【與絕對路徑搜索的差別就是開頭有無"/"】
  • 全文搜索(//子節點)

如果我們要查找屬性節點、文本節點、多條件的節點是這樣寫XPATH的

  • 屬性節點:(先找到元素節點/@屬性名
  • 文本節點:(先找到元素節點/test())
  • 有條件查詢節點:(先找到元素節點/[條件])
  • 多條件查詢節點:(先找到元素節點/[條件][條件])【兩個條件同時吻合】
  • 多條件查詢節點:(先找到元素節點/[條件]|先找到元素節點/[條件])【或關係】

我們之前使用dom4j的時候,是調用selectSingleNode()和selectNodes()方法來獲取任意深度的節點或多個節點

我們想要在JavaScript中使用XPATH技術,那麼我們也實現這兩個方法,調用它就行了!

selectSingleNode()

IE10,IE11下無法使用selectSingleNode()方法。解決參考:http://wenda.so.com/q/1458453513726662

但是,我沒有解決掉該問題。。。。。

下麵是JavaScript代碼:


/**
 * 
 * @param xmldoc 代表的是XML的根節點
 * @param xpath 給出的XPATH表達式
 * @return 返回的是對應的節點或多個節點
 * 
 * 
 * 
 */
function selectSingleNode(xmldoc,xpath) {


    //如果是IE,IE10,IE11解決不了....會的人告訴我一聲!!
    if(navigator.userAgent.indexOf(".NET")>0) {
        var value = xmldoc.selectNodes(xpath)
        return value;

    }else {

        //如果是fireFox
        var xpathObj = new XPathEvaluator();
        var value = xpathObj.evaluate(xpath, xmldoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

        return value.singleNodeValue;
    }

}
 
  • 測試代碼:

    <script type="text/javascript" src="loadXML.js" ></script>
    <script type="text/javascript" src="xpath.js" ></script>

    <script type="text/javascript">

        function test() {

            var file = loadXML(true, "1.xml");

            var xpathValue = selectSingleNode(file, "//dd");
            var value = xpathValue;

            alert(value);

        }

    </script>
  • 在fireFox,Chrome瀏覽器可以正常獲取得到節點

這裡寫圖片描述


selectNodes()

由於上面IE問題我到現在還沒有解決,所以下麵直接測試FireFox瀏覽器了

等我複習到Jquery的時候,再把這裡的坑填了吧。。。

  • javaScript代碼:
/**
 *
 * @param xmldoc 代表的是XML的根節點
 * @param xpath 給出的XPATH表達式
 * @return 返回的是節點數組
 */
function selectNodes(xmldoc,xpath) {

    var xpathObj = new XPathEvaluator();

    //如果是多節點,返回的是迭代器
    var iterator = xpathObj.evaluate(xpath, xmldoc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

    //把迭代器的數據寫到數組中
    var arr = new Array();

    var node;
    while ((node=iterator.iterateNext())!=null) {
        arr.push(node);
    }

    return arr;

}
 
  • 測試代碼:

        function test() {

            var file = loadXML(true, "1.xml");

            var xpathValue = selectNodes(file, "//aa");
            var value = xpathValue;

            alert(value);
        }
  • 效果:

這裡寫圖片描述


如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關註微信公眾號:Java3y


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前學習了nodejs的基礎,今天安裝Express框架,在安裝的過程中出現的一些問題,在這裡記錄下來 1:安裝某個nodejs模塊,使用install子命令 2:檢測安裝的版本:一般來說 express -V 和express -v都是可以的,但是我的要用express --version(我的不 ...
  • 文檔流的概念指什麼?有哪種方式可以讓元素脫離文檔流? 文檔流,指的是元素排版佈局過程中,元素會自動從左往右,從上往下的流式排列。並最終窗體自上而下分成一行行,併在每行中按從左到右的順序排放元素。脫離文檔流即是元素打亂了這個排列,或是從排版中拿走。 讓元素脫離文檔流的方法有:浮動和定位。 在 CSS ...
  • 頁面HTML: css代碼: ...
  • 如題,以前都是給客戶提供安卓和iOS兩個二維碼,實在覺得麻煩,就是一勞永逸了一下。不會傳附件,需要相關素材的可以私我。 ...
  • 在大多數的瀏覽器中都有實現網頁全屏顯示的功能,並且大部分瀏覽器實現全屏顯示和退出全屏顯示的快捷鍵通常是F11和Esc兩個按鍵。如今,W3C已經制定了關於網頁全屏顯示的API,利用這個API 可以實現網頁的全屏顯示,並且還能將某個特定的元素設置為全屏顯示,在各瀏覽器的相容性:google chrome... ...
  • 看了網上很多資料,對vue的computed講解自己看的都不是很清晰,今天忙裡抽閑,和同事們又閑聊起來,對computed這個屬性才有了一個稍微比較清晰的認識,下麵的文章有一部分是轉自: https://www.w3cplus.com/vue/vue-computed-intro.html © w3 ...
  • 趕緊完結這個系列咯,webpack4都已經出正式版了。 之前的代碼搜索到js文件的對應loader,並添加到了對象中返回,流程如下: 這個對象的request將入口文件的路徑與loader拼接起來並用!分割,所有的屬性基本上都與路徑相關。 after-resolve事件流 這裡會觸發after-re ...
  • 因為JS可以多層嵌套代碼可能下麵還可以再嵌一個方法引用this就會變成子方法控制的對象如果需要上級的對象在沒有參數的情況下前面前提做了一個臨時變數_this可以保存上級對象子方法中就可以用_this來調用了,這才是目的。摘自百度問答:https://zhidao.baidu.com/question ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...