成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

《JavaScript高級程序設計》(第3版)讀書筆記 第10章 DOM

yearsj / 2644人閱讀

摘要:年月級規(guī)范成為的推薦標準,為基本的文檔結構及查詢提供了接口。這意味著中的對象與原生對象的行為或活動特點并不一致。結果第一條注釋就會成為中的第一個子節(jié)點。由于跨域安全限制,來自不同子域的頁面無法通過通信。

DOM(文檔對象模型)是針對HTML和XML文檔的一個API(應用程序編程接口)。DOM描繪了一個層次化的節(jié)點樹,允許開發(fā)人員添加、移除和修改頁面的某一部分。DOM脫胎于Netscape及微軟公司創(chuàng)始的DHTML(動態(tài)HTML),但現(xiàn)在它已經(jīng)成為表現(xiàn)和操作頁面標記的真正跨平臺、語言中立方式。

1998年10月DOM 1 級規(guī)范成為W3C的推薦標準,為基本的文檔結構及查詢提供了接口。本章主要討論與瀏覽器中的HTML頁面相關的DOM1級的特性和應用,以及JavaScript對DOM1級的視線。

IE中的所有DOM對象都是以COM對象的形式實現(xiàn)的。這意味著IE中的DOM對象與原生JavaScript對象的行為或活動特點并不一致。本章將較多的談及這些差異。

節(jié)點層次

  
    Sample Page
  
  
    

Hello World!

可以將這個簡單的HTML文檔視為一個層次結構,如圖10-1所示。

文檔節(jié)點是每個文檔的根節(jié)點。在這個例子中,文檔節(jié)點只有一個子節(jié)點,既元素,我們稱之為文檔元素。

文檔元素是文檔的最外層元素,文檔中的其他所有元素都包含在文檔元素中。每個文檔只能有一個文檔元素。在HTML頁面中,文檔元素始終都是元素。在XML中,沒有預定義的元素,因此任何元素都可能成為文檔元素。

Node 類型

DOM1級定義了一個 Node 接口,該接口將由 DOM 中所有節(jié)點類型實現(xiàn)。這個Node接口在JavaScript中是作為Node類型實現(xiàn)的;除了IE之外,在其他所有瀏覽器中都可以訪問到這個類型。

JavaScript中的所有節(jié)點類型都繼承自Node類型,因此所有節(jié)點類型都共享著相同的基本屬性和方法。

每個節(jié)點都有一個nodeType屬性,用于表明節(jié)點的類型。及誒單類型由在Node類型中定義的下列12個數(shù)值常量來表示,任何節(jié)點類型必居其一(編號為節(jié)點類型常量存儲的數(shù)值):

Node.ELEMENT_NODE

Node.ATTRIBUTE_NODE

Node.TEXT_NODE

Node.CDATA_SECTION_NODE

Node.ENTITY_REFERENCE_NODE

Node.ENTITY_NODE

Node.PROCESSING_INSTRUCTION_NODE

Node.COMMENT_NODE

Node.DOCUMENT_NODE

Node.DOCUMENT_TYPE_NODE

Node.DOCUMENT_FRAGMENT_NODE

Node.NOTATION_NODE

// 通過比較上面的常量,很容易的確定節(jié)點類型
// 在IE中無效
if (someNode.nodeType == Node.ELEMENT_NODE) {
  console.log("Node is an element");
}

// 由于IE沒有公開 Node 類型的構造函數(shù)
// 最好還是將 nodeType 屬性與數(shù)字比較
if (someNode.nodeType == 1) {
  console.log("Node is an element");
}

并不是所有節(jié)點類型都受到Web瀏覽器的支持。開發(fā)人員最常用的就是元素和文本節(jié)點。

nodeNamenodeValue 屬性

了解節(jié)點的具體信息,可以使用nodeNamenodeValue 兩個屬性。這兩個屬性的值完全取決于節(jié)點類型。在使用這兩個值以前,最好用上述的代碼檢查節(jié)點的類型。

if (someNode.nodeType == 1) {
  value = someNode.nodeName;            // nodeName的值是元素的標簽名
}
節(jié)點關系

每個節(jié)點都有一個childNodes屬性,其中保存著一個NodeList對象。注意,可以通過方括號語法來訪問NodeList的值,而且也有length屬性,但它并不是Array的實例。

NodeList對象的獨特之處在于,它實際上是基于DOM結構動態(tài)執(zhí)行查詢的結果,因此DOM結構的變化能夠自動反映在NodeList對象中。我們常說NodeList是有生命、有呼吸的對象,而不是我們第一次訪它的瞬間拍攝下來的一張快照。

// 方括號和 item() 語法結果是相同的
var firstChild = someNode.childNodes[0];
var secondChild = someNode.childNodes.item(1);
var count = comeNode.childNodes.length;

// 雖然不是Array的實例,但我們可以將它轉換成數(shù)組
// 在IE8及之前的版本中無效
var arrayOfNodes = Array.prototype.slice.call(someNode.childNodes, 0);
// 由于IE8及更早版本將 NodeList 實現(xiàn)為一個 COM 對象
// 必須手動枚舉所有成員,才能轉換成數(shù)組
function convertToArray(nodes) {
  var array = null;
  try {
    array = Array.prototype.slice.call(nodes, 0);      // 針對非IE瀏覽器
  } catch (ex) {
    array = new Array();
    for (var i=0, len=nodes.length; i < len; i++) {
      array.push(nodes[i]);
    }
  }

  return array;
}

每個節(jié)點都有一個parentNode屬性,指向文檔中的父節(jié)點。

包含在childNodes中的所有節(jié)點都具有相同的父節(jié)點,而相互之間是同胞節(jié)點。

通過每個節(jié)點的previousSiblingnextSibling 屬性可以訪問同一列表中的其他節(jié)點。列表第一個節(jié)點previousSiblingnull,列表最后一個nextSiblingnull,當然如果列表只有一個節(jié)點,那么兩個都是null。

父節(jié)點的firstChildlastChild屬性分別指向第一個和最后一個。如果列表沒有節(jié)點,那么兩個屬性都是null。

hasChildNodes()也是一個非常有用的方法,當查詢節(jié)點存在子節(jié)點時返回true,不存在返回false。這是比查詢childNodes.length更簡單的方法。

所有節(jié)點都有的最后一個屬性是ownerDocument,該屬性指向表示整個文檔的文檔節(jié)點。這種關系表示的是任何節(jié)點都屬于它所在的文檔,任何節(jié)點都不能同時存在兩個或更多個文檔中。通過這個屬性,我們可以不必在節(jié)點層次中通過層層回溯達到頂端,而是可以直接訪問文檔節(jié)點。

操作節(jié)點

因為關系指針都是只讀的,所以DOM提供了一些操作節(jié)點的方法 。

最常用的方法是appendChild(),用于向childNodes列表的末尾添加一個節(jié)點,執(zhí)行后,方法返回新增的節(jié)點。

var returnedNode = someNode.appendChild(newNode);
console.log(returnedNode == newNode);           // true
console.log(someNode.lastChild ==newNode);      // true

如果需要把節(jié)點放在childNodes列表中某個特定的位置上,而不是放在末尾,可以使用insertBefore()方法。這個方法接收兩個參數(shù):要插入的節(jié)點和作為參照的節(jié)點。插入節(jié)點后,被插入的節(jié)點會變成參照節(jié)點的前一個同胞節(jié)點(previousSibling),同時被方法返回。如果參照節(jié)點是null,則 insertBefore()appendChild() 執(zhí)行相同操作。

// 插入后成為最后一個子節(jié)點
var returnedNode = someNode.insertBefore(newNode, null);

// 插入后成為第一個子節(jié)點
var returnedNode = someNode.insertBefore(newNode, someNode.firstChild);

// 插入后在最后一個子節(jié)點前面
var returnedNode = someNode.insertBefore(newNode, someNode.lastChild);

replaceChild() 替換節(jié)點。同樣接收兩個參數(shù),插入的節(jié)點和參照節(jié)點。插入新的節(jié)點并將參照節(jié)點從文檔樹中移除,新的節(jié)點會從被替換的節(jié)點復制所有關系指針。盡管從技術上講,被替換的節(jié)點仍然在文檔中,但它在文檔中的位置已經(jīng)不存在了。

removeChild() 移除節(jié)點。被移除的節(jié)點仍然在文檔中,但它在文檔中的位置已經(jīng)不存在了。

以上四個方法必須先取得操作節(jié)點的父節(jié)點(代碼示例中是someNode)。在不存在子節(jié)點的節(jié)點上調(diào)用以上方法,會導致錯誤。

其他方法

還有兩個方法是所有節(jié)點都有的。

cloneNode() 用于創(chuàng)建調(diào)用這個方法的節(jié)點的一個完全相同的副本。接收一個布爾值參數(shù),表示是否執(zhí)行深復制。

傳入true。執(zhí)行深復制,復制節(jié)點及其整個子節(jié)點樹

傳入false。執(zhí)行淺復制,即只復制節(jié)點本身。

復制返回的節(jié)點副本屬于文檔所有,但并沒有為它制定父節(jié)點。因此這個節(jié)點副本就成為了一個“孤兒”,除非通過 appendChild() insertBefore() replaceChild() 將它添加到文檔中。

IE8及之前的版本不會為包含空白符的文字創(chuàng)建節(jié)點(TEXT)

clone() 方法不會復制添加到DOM節(jié)點中的JavaScript屬性,例如時間處理程序。這個方法只復制特性、(在明確指定的情況下也復制)子節(jié)點,其他一切都不會復制。

IE 會復制事件處理程序,所以我們建議在復制之前最好先移出事件處理程序。

  • item 1
  • item 2
  • item 3
var myList = document.getElementById("ul");
var deepList = myList.cloneNode(true);
// [text, li, text, li, text, li, text]
console.log(deepList.childNodes);
// 3 (IE < 9) 或 7 (其他瀏覽器)
// IE8及之前的版本不會為包含空白符的文字創(chuàng)建節(jié)點(TEXT)
console.log(deepList.childNodes.length);

var shallowList = myList.cloneNode(false);
console.log(shallowList.childNodes.length);     // 0

normalize() 方法唯一的作用就是處理文檔樹中的文本節(jié)點。由于解析器的實現(xiàn)或DOM操作等原因,可能會出現(xiàn)文本節(jié)點不包含文本,或者連接出現(xiàn)兩個節(jié)點的情況。當在某個節(jié)點上調(diào)用這個方法時,就會在該節(jié)點的后代節(jié)點中查找上述兩種情況。

如果找到了空文本節(jié)點,則刪除它

如果找到相鄰的文本節(jié)點,則將它們合并為一個文本節(jié)點

本章后面還將進一步討論方法

var html = document.documentElement;               // 取得對的引用
console.log(html == document.childNodes[0]);       // true
console.log(html == document.firstchild)           // true

所有瀏覽器都支持document.documentElementdocument.boyd 屬性

Document另一個可能的子節(jié)點是DocumentType。通常將標簽看成一個與文檔其他部分不同的實體,可以通過doctype屬性(在瀏覽器中是document.doctype)來訪問信息。

瀏覽器對document.doctype的支持差別很大,所以這個屬性的用途很有限:

IE8及之前版本,如果存在文檔類型聲明,會將其錯誤的解釋為一個注釋并把它當做Comment節(jié)點;而document.doctype的值始終為null

IE9+,如果存在文檔類型聲明,則將其作為文檔的第一個子節(jié)點;document.doctype是一個DocumentType節(jié)點,也可以通過document.firstChilddocument.childNodes[0]訪問同一個節(jié)點。

Safari, Chrome, Opera :如果存在文檔類型聲明,則將其解析,但不作為文檔的子節(jié)點。document.doctype是一個DocumentType節(jié)點,但該節(jié)點不會出現(xiàn)在document.childNodes中。

從技術上說,出現(xiàn)在元素外部的注釋應該是算是文檔的子節(jié)點。然而,不同的瀏覽器在是否解析這些注釋以及能否正確處理他們等方面,也存在很大差異。



  
  

看起來這個頁面應該有3個子節(jié)點:注釋、元素、注釋。從邏輯上講,我們會認為document.childNodes中應該包含與這3個節(jié)點對應的3項。但是實際上,瀏覽器存在以下差異:

IE8及之前版本、Safari3.1及更高版本、Opera和Chrome 只為第一條注釋創(chuàng)建節(jié)點,不為第二條注釋創(chuàng)建節(jié)點。結果第一條注釋就會成為document.childNodes中的第一個子節(jié)點。

IE9+,將會將兩條都創(chuàng)建節(jié)點。

Firefox 和 Safari3.1之前的版本會完全忽略這兩條注釋。

多數(shù)情況下,我們都用不著在document對象上調(diào)用appendChild() removeChild() replaceChild() 方法,因為文檔類型(如果存在的話)是只讀的,而且它只能有一個元素子節(jié)點(該節(jié)點通常早就已經(jīng)存在了)。

文檔信息

作為HMLTDocument的一個實例,document對象還有一些標準的Document對象所沒有的屬性。

title 包含著</b>元素中的文本。通過這個屬性可以取得當前頁面的標題,也可以修改當前頁面的標題并反映在瀏覽器的標題欄中。修改<b>title</b>屬性的值會改變<b><title></b>元素。</p> <pre>// 取得文檔標題 var originalTitle = document.title; // 設置文檔標題 document.title = "New page title";</pre> <p> <p>下面三個屬性與網(wǎng)頁的請求有關,所有這些信息都存在于請求的HTTP頭部,只不過是通過這些屬性讓我們能夠在JavaScript中訪問它們而已:</p> <p> <b>URL</b>屬性中包含頁面完整的URL(地址欄中的URL)</p> <p> <b>domain</b>屬性中值包含頁面的域名</p> <p> <b>referrer</b>屬性中可能會包含空字符串</p> <p> <b>URL</b>與<b>domain</b>屬性是相互關聯(lián)的。例如<b>document.URL</b>等于"http://www.wrox.com/WileyCDA/",那么<b>document.domain</b>就等于"www.wrox.com"。</p> <p>3個屬性中只有<b>domain</b>可以設置,但有安全方面的限制。如果URL中包含一個子域名,例如"p2p.wrox.com",那么就只能講<b>domain</b>設置為"wrox.com"(URL中包含"www",如"www.wrox.com"時,也是如此)。</p> <p>當頁面中包含來自其他子域的框架或內(nèi)嵌框架時,能夠設置<b>document.domain</b>就非常方便了。由于跨域安全限制,來自不同子域的頁面無法通過JavaScript通信。而通過將每個頁面的<b>document.domain</b>設置為相同的值,這些頁面就可以互相訪問對方包含的JavaScript對象了。</p> </p> <pre>// 取得完整的URL var url = document.URL; // 取得域名 var domain = document.domain; // 取得來源 頁面的URL var referrer = document.referrer;</pre> <p>瀏覽器對<b>domain</b>屬性還有一個限制,即如果域名一開始是“松散的”(loose),那么就不能將它再設置為“緊繃的”(tight)。</p> <pre>// 假設頁面來自于 p2p.wrox.com域 document.domain = "wrox.com"; // 松散的(成功) document.domain = "p2p.wrox.com"; // 緊繃的(出錯)</pre> <b>查找元素</b> <p> <p><b>getElementById()</b> 接收一個參數(shù):要取得的元素的ID。找到相應的元素則返回該元素,否則返回<b>null</b>。</p> <p>IE8及較低版本不區(qū)分ID大小寫</p> <p>如果頁面多個元素的ID相同,只會返回第一個匹配的元素。</p> <p>IE7及更早的版本添加了一個怪癖:name特性與給定ID匹配的表單元素也會被該方法返回。</p> <pre><input type="text" name="myElement" value="Text field"> <div class="6a22guqa" id="myElement">A div</div> </pre> </p> <p> <b>getElementsByTagName()</b> 接收一個參數(shù):要取得的元素的標簽名,而返回的是包含零或多個元素的<b>NodeList</b>。可以使用方括號語法或<b>item()</b>方法來訪問對象中的項。</p> <p> <b>namedItem()</b> 使用這個方法可以通過元素的name特性取得集合中的項?;蚍嚼ㄌ栒Z法能達到同樣的效果</p> <pre><img src="myimage.gif" name="myImage"> </pre> <p>要取得文檔中的所有元素,可以向<b>getElementsByTagName()</b>中傳入"*"。在JavaScript及CSS中,星號通常表示全部。</p> <p>雖然標準規(guī)定標簽名需要區(qū)分大小寫,但為了最大限度的與既有HTML頁面兼容,傳給<b>getElementsByTagName()</b>的標簽名是不需要區(qū)分大小寫的。但對于XML頁面而言(包括XHTML),<b>getElementsByTagName()</b>方法就會區(qū)分大小寫。</p> <p> <b>getElementByName()</b> 是只有HTMLDocument類型才有的方法,返回帶有給定name屬性的所有元素。最常使用的情況是取得單選按鈕;為了確保發(fā)送給瀏覽器的值正確無誤,所有單選按鈕必須具有相同的name特性</p> <pre><fieldset> <legend>Which color do you prefer?</legend> <ul> <li> <input type="radio" value="red" name="color" id="colorRed"> <label for="colorRed">Red</label> </li> <li> <input type="radio" value="green" name="color" id="colorGreen"> <label for="colorGreen">Green</label> </li> <li> <input type="radio" value="blue" name="color" id="colorBlue"> <label for="colorBlue">Blue</label> </li> </ul> </fieldset></pre> <p>上述例子使用<b>getElementsByName()</b>方法可以返回三個input元素。但是對于這里的單選按鈕來說<b>namedItem()</b>方法只會取得第一項(因為每一項的name特性都相同)。</p> <b>特殊集合</b> <p> <b>document.anchors</b> 包含文檔中所有帶name特性的<b><a></b>元素</p> <p> <b>document.applets</b> 包含文檔中所有的<b><form></b>元素,與<b>document.getElementsByTagName("form")</b>得到的結果相同</p> <p> <b>document.images</b> 包含文檔中所有的<b><img></b>元素,與<b>document.getElementsByTagName("img")</b>得到的結果相同</p> <p> <b>document.links</b> 包含文檔中所有帶 <b>href</b> 特性的<b><a></b>元素</p> <b>DOM一致性檢測</b> <p>由于DOM分為多個級別,也包含多個部分,因此檢測瀏覽器實現(xiàn)了DOM的哪些部分就十分必要。<b>document.implementation</b>屬性就是為此提供的,與瀏覽器對DOM的實現(xiàn)直接對應。</p> <p>DOM1級別只為<b>document.implementation</b>規(guī)定了一個方法,即<b>hasFeature()</b>。接收兩個參數(shù):要檢測的DOM功能的名稱及版本號。如果支持返回true</p> <pre>var hasXmlDom = docuemnt.implementation.hasFeature("XML", "1.0");</pre> <p>下表列出了可以檢測的不同值得版本號</p> <table> <thead><tr> <th>功能</th> <th>版本號</th> <th>說明</th> </tr></thead> <tbody> <tr> <td>Core</td> <td>1.0、2.0、3.0</td> <td>基本的DOM,用于描述表現(xiàn)文檔的節(jié)點樹</td> </tr> <tr> <td>XML</td> <td>1.0、2.0、3.0</td> <td>Core的XML拓展,添加了對CDATA、處理指令及實體的支持</td> </tr> <tr> <td>HTML</td> <td>1.0、2.0</td> <td>XML的HTML拓展,添加了對HTML特有元素及實體的支持</td> </tr> <tr> <td>Views</td> <td>2.0</td> <td>基于某些樣式完成文檔的格式化</td> </tr> <tr> <td>StyleSheets</td> <td>2.0</td> <td>將樣式表關聯(lián)到文檔</td> </tr> <tr> <td>CSS</td> <td>2.0</td> <td>對層疊樣式表1級的支持</td> </tr> <tr> <td>CSS2</td> <td>2.0</td> <td>對層疊樣式表2級的支持</td> </tr> <tr> <td>Events</td> <td>2.0, 3.0</td> <td>常規(guī)的DOM事件</td> </tr> <tr> <td>UIEvents</td> <td>2.0, 3.0</td> <td>用戶界面事件</td> </tr> <tr> <td>MouseEvents</td> <td>2.0, 3.0</td> <td>由鼠標引發(fā)的事件(click、mouseover等)</td> </tr> <tr> <td>MutationEvents</td> <td>2.0, 3.0</td> <td>DOM樹變化時引發(fā)的事件</td> </tr> <tr> <td>HTMLEvents</td> <td>2.0</td> <td>HTML4.01事件</td> </tr> <tr> <td>Range</td> <td>2.0</td> <td>用于操作DOM樹種某個范圍的對象和方法</td> </tr> <tr> <td>Traversal</td> <td>2.0</td> <td>遍歷DOM樹的方法</td> </tr> <tr> <td>LS</td> <td>3.0</td> <td>文件與DOM樹之間的同步加載和保存</td> </tr> <tr> <td>LS-Asnyc</td> <td>3.0</td> <td>文件與DOM樹之間的異步加載和保存</td> </tr> <tr> <td>Validation</td> <td>3.0</td> <td>在確保有效的前提下修改DOM樹的方法</td> </tr> </tbody> </table> <p> <b>hasFeature()</b> 方法確實方便,但也有缺點。因為實現(xiàn)者可以自行決定是否與DOM規(guī)范的不同部分保持一致。事實上,想讓<b>hasFearture()</b>針對所有值都有返回true很容易,但返回true有時候也不意味著實現(xiàn)與規(guī)范一致。</p> <p>為此我們建議,在使用<b>hasFreatrue()</b>之外,還同時使用能力檢測。</p> <b>文檔寫入</b> <p> <b>write()</b>和<b>writeln()</b>方法都接收一個字符串參數(shù),即要寫入到輸出流中的文本。<b>wirte()</b>會原樣寫入,而<b>writeln()</b>則會在字符串的末尾添加一個換行符(n)。在頁面加載的過程中,可以使用這兩個方法動態(tài)的加入內(nèi)容。</p> <p>在包含JavaScript文件時,必須注意不能像下面的例子那樣直接包含字符串"</script>",因為這會導致該字符串被解釋為腳本塊的結束,后面的代碼將無法執(zhí)行。使用轉義"</script>"可以避免這個問題。</p> <p> <b>open()</b>和<b>close()</b>分別用于打開和關閉網(wǎng)頁的輸出流。如果是在頁面加載期間使用<b>write()</b>或<b>writeln()</b>方法,則不需要用到這兩個方法。</p> <p>嚴格型XHTML文檔不支持文檔吸入。對于那些按照<b>application/xml+xhtml</b>內(nèi)容類型提供的頁面,這兩個方法也同樣無效。</p> <b>Element類型</b> <p> <b>Element</b>類型用于表現(xiàn)XML或XHTML元素,提供了對元素標簽名、子節(jié)點及特性的訪問。</p> <p> <p><b>Element</b>類型具有以下特征:</p> <p> <b>nodeType</b>的值為1</p> <p> <b>nodeName</b>的值為元素的標簽名</p> <p> <b>nodeValue</b>的值為<b>null</b> </p> <p> <b>parentNode</b>的值可能為Dcoment或Element</p> <p>其子節(jié)點可能是 <b>Element</b>、 <b>Text</b> 、 <b>Comment</b> 、 <b>ProcessingInstruction</b>、 <b>CDATASection</b>、 <b>EntityReference</b> </p> </p> <p>訪問元素的標簽名,可以使用<b>nodeName</b>屬性,也可以是使用<b>tagName</b>屬性,這兩個屬性會返回相同的值。</p> <pre>var div = document.getElementById("myDiv"); console.log(div.tagName); // "DIV" console.log(div.nodeName); // "DIV" console.log(div.tagName == div.nodeName); // true</pre> <pre>if (element.tagName == "div") { // 不能這樣比較,很容易出錯 } if (element.tagName.toLowerCase() == "div") { // 推薦這樣做(適用于任何文檔) }</pre> <b>HTML元素</b> <p> <p>所有HTML元素都由<b>HTMLElement</b>類型表示。<b>HTMLElement</b>類型直接繼承自Elment并添加了一些屬性。每個HTML元素中都存在的下列標準特性:</p> <p> <b>id</b> 元素在文檔中的唯一標識符</p> <p> <b>title</b> 有關元素的附加說明信息,一般通過工具提示條顯示出來</p> <p> <b>lang</b> 元素內(nèi)容的語言代碼,很少使用</p> <p> <b>dir</b> 語言的方向值為"ltr"(left-to-right 從左至右)或 "rtl"</p> <p> <b>className</b> 與元素的class特性對應,即為元素指定的CSS類。沒有將這個屬性命名為class是因為class是ECMAScript的保留字。</p> </p> <p>并不是對所有屬性的修改都會在頁面中直觀的表現(xiàn)出來。對id或lang的修改對用戶而言是透明不可見的。而對title的修改則只會在鼠標移動到這個元素之上時才會顯示出來。對dir的修改會在屬性重寫的那一刻,立即影響頁面中文本的左右對齊方式。修改className時,如果新類關聯(lián)了與此前不同的CSS樣式,就立即應用新的樣式。</p> <p>下面表格列出了所有HTML元素以及與之關聯(lián)的類型(以斜體印刷的元素表示不推薦使用了)。注意表中的這些類型在Opera、Safari、Chrome、Firefox中都可以通過JavaScript訪問,但在IE8之前的版本中,不能通過JavaScript訪問。</p> <p><br></p> <b>取得特性</b> <p>操作特性的DOM方法主要有三個,分別是<b>getAttribute()</b>、<b>setAttribute()</b>、 <b>removeAttribute()</b>。</p> <pre>var div = document.getElemntByid("myDiv"); console.log(div.getAttribute("id")); // "myDiv" console.log(div.getAttribute("class")); // "bd" console.log(div.getAttribute("title")); // "Body Text" console.log(div.getAttribute("lang")); // "en" console.log(div.getAttribute("dir")); // "ltr"</pre> <p>注意,傳遞給<b>getAttribute()</b>的特性名與實際的特性名相同。因此想要得到class特性值,應該傳入"class" 而不是"className",后者只在通過對象屬性訪問特性時才用。</p> <p>如果給定的特性不存在,<b>getAttribute()</b>返回<b>null</b>。</p> <p>也可以取得自定義特性,即標準HTML語言中沒有的特性的值。需要注意,特性的名稱不區(qū)分大小寫,即"ID" 和 "id" 代表的都是同一個特性。另外也要注意,根據(jù)HTML5規(guī)范,自定義特性應該加上data-前綴以便驗證。</p> <p>任何元素的所有特性,也都可以通過DOM元素本身的屬性來訪問。當然<b>HTMLElement</b>也會有5個屬性與相應的特性一一對應。不過只有公認的(非自定義)特性才會以屬性的形式添加到DOM對象中。例如可以通過<b>div.id</b>訪問div元素的id屬性。不過自定義特性在Safari、Opera、Chrome、Firefox中是不存在的,但IE卻會為自定義特性也創(chuàng)建屬性。</p> <p>CSS通過<b>getAttribute()</b>訪問時,返回的style特性值中包含的是CSS文本,而通過屬性來訪問它則會返回一個對象。由于style屬性是用于以編程方式訪問元素樣式的(本章后面討論),因此并沒有直接映射到style特性。</p> <p>時間處理程序(例如onclick)通過<b>getAttribute()</b>訪問,返回的是相應的代碼字符串。而在訪問onclick屬性時,則返回的是一個JavaScript函數(shù)(如果未在元素中指定相應特性,則返回<b>null</b>)。這是因為onclick及其他事件程序屬性本身就應該被賦予函數(shù)值。</p> <p>由于存在上述差別,在通過JavaScript以編程方式操作DOM時,開發(fā)人員不經(jīng)常使用 <b>getAttribute()</b>方法,而只是使用對象的屬性。只有在取得自定義特性值得情況下,才會使用<b>getAttribute()</b>方法。</p> <p>在IE7及以前版本中,通過<b>getAttribute()</b>訪問style特性或onclick,返回的值與屬性相同,都返回對象值或函數(shù)值。雖然IE8已經(jīng)修復了這個bug,但不同IE版本間的不一致性,也是導致開發(fā)人員不適用<b>getAttribute()</b>訪問HTML特性的一個原因。</p> <b>設置特性</b> <p>與<b>getAttribute()</b>對應的方法時<b>setAttribute()</b>這個方法接收兩個參數(shù):要設置的特性名和值。如果特性已經(jīng)存在,<b>setAttribute()</b>會以指定的值替換現(xiàn)有的值;如果特性不存在,則創(chuàng)建該屬性并設置相應的值。</p> <p> <b>setAttribute()</b>方法既可以操作HTML特性也可以操作自定義特性。通過這個方法設置的特性名會統(tǒng)一轉換為小寫形式,即"ID"最終變成"id"。</p> <pre>div.setAttribute("id", "someOtherId"); div.id = "someOtherId"; // 添加自定義屬性,該屬性不會自動成為元素的特性 div.mycolor = "red"; div.getAttribute("mycolor"); // null ie除外</pre> <p> <b>removeAttribute()</b> 用于徹底刪除元素的特性,調(diào)用這個方法不僅會清楚特性的值,而且也會從元素中完全刪除特性。這個方法并不常用,IE6及以前版本不支持。</p> <pre>div.removeAttribute("class");</pre> <b>attributes屬性</b> <p>Element 類型是使用 attributes 屬性的唯一一個DOM節(jié)點類型 。</p> <p>attributes屬性中包含一個<b>NamedNodeMap</b>,與<b>NodeList</b>類似,也是一個動態(tài)集合。元素的每一個 特性都由一個<b>Attr</b>節(jié)點表示,每個節(jié)點都保存在<b>NamedNodeMap</b>對象中。</p> <p> <p><b>NamedNodeMap</b>對象擁有以下方法</p> <p> <b>getNamedItem(name)</b>:返回<b>nodeName</b>屬性等于<b>name</b>的節(jié)點</p> <p> <b>removeNamedItem(name)</b>:從列表中移除<b>nodeName</b>屬性 等于name的節(jié)點</p> <p> <b>setNameItem(node)</b>:向列表中添加節(jié)點,以節(jié)點的<b>nodeName</b>屬性為索引</p> <p> <b>item(pos)</b>:返回位于數(shù)字pos位置處的節(jié)點</p> </p> <p> <b>attributes</b>屬性中包含一系列節(jié)點,每個節(jié)點的<b>nodeName</b>就是特性的名稱,而節(jié)點的<b>nodeValue</b>就是特性的值。</p> <pre>// 取得元素的id var id = element.attributes.getNamedItem("id").nodeValue; // 設置元素的id element.attributes["id"].nodeValue = "someOtherId"; // 刪除元素id,并返回被刪除特性的Attr節(jié)點 var oldAttr = element.attributes.removeNamedItem("id"); // 傳入一個新的特性節(jié)點 element.attributes.setNameItem(newAttr);</pre> <p>由于attributes的方法不夠方便,因此開啊人員更多的會使用<b>getAttribute()</b>、<b>removeAttribute()</b>、<b>setAttribute()</b>方法。如果想要遍歷元素特性,可以用attributes</p> <p>針對attributes對象中的特性,不同瀏覽器返回的順序不同。</p> <p>IE7及更早版本返回HTML元素中所有可能的特性,包括沒有指定的特性。返回100多個特性是常見的</p> <pre>// 迭代元素的每一個特性,然后構造成 name="value"字符串 function outputAttributes(element) { var pairs = new Array(), attrName, attrValue, i, len; for (i=0, len=elment.attributes.length; i < len; i++) { attrName = element.attributes[i].nodeName; attrValue = element.attributes[i].nodeValue; // 針對 IE7- 做兼容 // 根據(jù)specified屬性,只返回指定的特性 if (element.attributes[i].specified) { paris.push(attrName + "="" + attrValue + """); } } return pairs.join(" "); }</pre> <b>創(chuàng)建元素</b> <p> <b>document.createElement()</b>方法可以創(chuàng)建新元素。只接收一個參數(shù),即要創(chuàng)建元素的標簽名,在HTML文檔中不區(qū)分大小寫,而在XML(包括XHTML)文檔中,則是區(qū)分大小寫。</p> <p> <b>document.createElement()</b>創(chuàng)建元素的同時,也為新元素設置了<b>ownerDcoument</b>屬性。此時還可以操作元素的特性,為它添加更多子節(jié)點。</p> <p>由于新元素尚未被添加到文檔樹中,因此設置這些特性不會影響瀏覽器的顯示。要把新元素添加到文檔樹,可以使用<b>appendChild()</b> <b>insertBefore()</b> <b>replaceChild()</b>方法。</p> <pre>// 創(chuàng)建 var div = document.createElement("div"); // 操作元素特性,添加子節(jié)點 div.id = "myNewDiv"; div.className = "box"; document.body.appendChild(div);</pre> <p> <p>在IE中可以傳入完整的元素標簽,也可以包含屬性(僅IE支持)。這樣有助于避開在IE7及更早版本中動態(tài)創(chuàng)建元素的某些問題:</p> <p>不能設置動態(tài)創(chuàng)建的<b><iframe></b>元素的<b>name</b>特性</p> <p>不能通過表單的<b>reset()</b>方法重設動態(tài)創(chuàng)建的<b><input></b>元素(第13章討論reset()方法)</p> <p>動態(tài)創(chuàng)建的<b>type</b>特性值為“reset”的<b><button></b>元素重設不了表單</p> <p>動態(tài)創(chuàng)建的一批<b>name</b>相同的單選按鈕彼此毫無關系。</p> </p> <pre>if (client.browser.id && client.browser.ie <= 7) { var div = document.createElement("<div class="6a22guqa" id="myNewDiv" class="box"></div>"); }</pre> <b>元素的子節(jié)點</b> <p>元素可以有任意書目的子節(jié)點和后臺節(jié)點,因為元素可以是其他元素的子節(jié)點。元素的<b>childNodes</b>屬性中包含了它所有子節(jié)點,這些子節(jié)點可能是元素、文本節(jié)點、注釋或處理指令。不用瀏覽器在看待這些節(jié)點方面存在顯著的不同。</p> <pre><ul id="myList"> <li>item 1</li> <li>item 2</li> <li>item 3</li> </ul></pre> <p>IE解析,<b><ul></b>元素會有3個子節(jié)點,分別是3個<b><li></b>元素。但如果是其他瀏覽器,<b><ul></b>元素都會有7個元素,包括3個<b><li></b>元素和4個文本節(jié)點(表示<b><li></b>元素之間的空白符)。</p> <p>如果將元素間的空白符刪除,那么所有瀏覽器都會返回相同數(shù)目的子節(jié)點</p> <pre><ul id="myList"><li>item 1</li><li>item 2</li><li>item 3</li></ul></pre> <p>如果需要通過<b>childNodes</b>屬性遍歷子節(jié)點,那么一定不要忘記瀏覽器間的這一差別。這意味著在執(zhí)行某項操作以前,通常都要先檢查<b>nodeType</b>屬性</p> <pre>for (var i=0, len = element.childNodes.length; i < len; i++) { if (element.childNodes[i].nodeTpe == 1) { ... } }</pre> <p>如果想通過某個特性的標簽名取得子節(jié)點或后代節(jié)點,可以通過元素調(diào)用<b>getElementsByTagName()</b>方法,結果只會返回當前元素的后代。</p> <pre>var ul = document.getElementById("myList"); var items = ul.getElementsByTagName("li");</pre> <b>Text類型</b> <p>文本節(jié)點由Text類型表示,包含的是可以照字面量解釋的純文本內(nèi)容。純文本中可以包含轉義后的HTML字符,但不能包含HTML代碼。</p> <p> <p>Text節(jié)點具有以下特征:</p> <p> <b>nodeType</b>的值為3</p> <p> <b>nodeName</b>的值為"#text"</p> <p> <b>nodeValue</b>的值為節(jié)點所包含的文本</p> <p> <b>parentNode</b>是一個Element</p> <p>不支持(沒有)子節(jié)點</p> </p> <p>可以通過<b>nodeValue</b>屬性或<b>data</b>屬性訪問Text節(jié)點中包含的文本,這兩個屬性的值相同。對<b>nodeValue</b>的修改也會通過<b>data</b>反映出來,反之亦然。</p> <p> <p>使用下列方法可以操作節(jié)點中的文本</p> <p> <b>appendData(text)</b>:將text添加到節(jié)點的末尾</p> <p> <b>deleteData(offset, count)</b>:從offset指定的位置插入text</p> <p> <b>insertData(offset, text)</b>:在offset指定的位置插入text</p> <p> <b>replaceData(offset, count, text)</b>:用text替換從offset指定的位置開始到 offset+count為止處的文本</p> <p> <b>splitText(offset)</b>:從offset指定的位置將當前文本節(jié)點分成兩個文本節(jié)點。</p> <p> <b>substringData(offset, count)</b>:提取從offset指定的位置開始到 offset+count為止處的字符串</p> <p> <b>length</b>屬性:保存著節(jié)點中字符的書目。而且<b>nodeValue.length</b>和<b>data.length</b>中也保存著同樣的數(shù)值</p> </p> <p>在默認情況下,每個可以包含內(nèi)容的元素最多只能有一個文本節(jié)點,而且必須確實有內(nèi)容存在</p> <pre><!-- 沒有內(nèi)容,也就沒有文本節(jié)點 --> <div></div> <!-- 有空格,因為有一個文本節(jié)點 --> <div> </div> <!-- 有內(nèi)容,因為有一個文本節(jié)點 --> <div>Hello World!</div></pre> <pre>// 可以像這樣取得文本子節(jié)點 var textNode= div.firstChild; // 或者 div.childNodes[0] // 取得文本節(jié)點的引用后,就可以修改它了 div.firstChild.nodeValue = "Some other message";</pre> <p>如果這個文本節(jié)點當前存在于文檔樹中,那么修改文本節(jié)點的結果就會立即得到反映。</p> <p>修改文本節(jié)點時,字符串會經(jīng)過HTML(或XML,取決于文檔類型)編碼。換言之,小于號、大于號或引號都會像下面的例子一樣被轉義</p> <pre>div.firstChild.nodeValue = "Some <strong>other</strong> message"; // 輸出結果:"Some <strong>other</strong> message"</pre> <p>這是在向DOM文檔中插入文本之前,先對其進行HTML編碼的一種有效方式</p> <b>創(chuàng)建文本節(jié)點</b> <p> <b>document.createTextNode()</b>創(chuàng)建新的文本節(jié)點。與設置已有文本節(jié)點的值一樣,作為參數(shù)的文本也將按照HTML或XML的格式進行編碼。</p> <pre>var textNode = document.createTextNode("<strong>Hello</strong> World!");</pre> <p>在創(chuàng)建新文本節(jié)點的同時,也會為其設置<b>ownerDocument</b>屬性。不過除非把新節(jié)點添加到文檔樹中已經(jīng)存在的節(jié)點中,否則我們不會在瀏覽器窗口中看到新節(jié)點。</p> <pre>var element = document.createElement("div"); elment.className = "message"; var textNode = document.createTextNode("Hello world!"); element.appendChild(textNode); document.body.appendChild(element);</pre> <p>一般情況下,每個元素只有一個文本子節(jié)點。不過在某些情況下也可能包含多個文字子節(jié)點。相鄰的同胞文本節(jié)點,之間會連起來,中間不會有空格。</p> <pre>var element = document.createElement("div"); elment.className = "message"; var textNode = document.createTextNode("Hello world!"); element.appendChild(textNode); var anotherTextNode = document.createTextNode("Yippee!"); element.appendChild(anotherTextNode); document.body.appendChild(element);</pre> <b>規(guī)范化文本節(jié)點</b> <p>DOM文檔中存在相鄰的同胞文本節(jié)點很容易導致混亂,因為分不清文本節(jié)點之間的界限。于是催生了一個能夠將相鄰文本節(jié)點合并的方法。</p> <p> <b>normalize()</b>方法是由<b>Node</b>類型定義的(因而在所有節(jié)點類型中都存在)。如果在一個包含多個文本節(jié)點的父元素上調(diào)用<b>normalize()</b>方法,則會將所有文本節(jié)點合并成一個文本節(jié)點。</p> <pre>var element = document.createElement("div"); elment.className = "message"; var textNode = document.createTextNode("Hello world!"); element.appendChild(textNode); var anotherTextNode = document.createTextNode("Yippee!"); element.appendChild(anotherTextNode); document.body.appendChild(element); console.log(element.childNodes.length); // 2 element.normalize(); console.log(element.childNodes.length); // 1 console.log(element.firstChild.nodeValue); // "Hello World!Yippee!"</pre> <p>瀏覽器在解析文檔時永遠不會創(chuàng)建相鄰的文本節(jié)點,這種情況只會作為DOM操作的結果出現(xiàn)。</p> <p> <b>normalize()</b>有時候會導致IE6崩潰,IE7以上修復了此問題。</p> <b>分割文本節(jié)點</b> <p> <b>splitText()</b>方法會將一個文本節(jié)點分割成兩個。</p> <pre>var element = document.createElement("div"); elment.className = "message"; var textNode = document.createTextNode("Hello world!"); element.appendChild(textNode); document.body.appendChild(element); var newNode = element.firstChild.splitText(5); console.log(element.firstChild.nodeValue); // "Hello" console.log(newNode.nodeValue); // " World!" console.log(element.childNodes.length); // 2</pre> <b>Comment類型</b> <p> <p>注釋在DOM中是通過Comment類型來表示的。<b>Comment</b>節(jié)點具有以下特征:</p> <p> <b>nodeType</b>的值為8</p> <p> <b>nodeName</b>的值為 "#comment"</p> <p> <b>nodeValue</b>的值是注釋的內(nèi)容</p> <p> <b>parentNode</b>可能是Dcoment或Element</p> <p>不支持(沒有)子節(jié)點</p> </p> <p>Comment類型與Text類型繼承自相同的基類,因此它擁有除<b>splitText()</b>之外的所有字符串操作方法。</p> <pre><div class="6a22guqa" id="myDiv"><!--A comment--></div></pre> <pre>var div = document.getElementById("myDiv"); var comment = div.firstChild; console.log(comment.data); // "A comment"</pre> <p>使用<b>document.createComment()</b>并為其傳遞注釋文本也可以創(chuàng)建注釋節(jié)點</p> <pre>var comment = document.createComment("A comment ");</pre> <p>開發(fā)人員很少會創(chuàng)建和訪問注釋節(jié)點,此外瀏覽器也不會識別位于<b></html></b>標簽后的注釋。如果要訪問注釋節(jié)點,一定要保證它們是位于<b><html></b>和<b></html></b>之間。</p> <b>CDATASection類型</b> <p>CDATASection類型只針對基于XML的文檔,表示的是CDATA區(qū)域。與Comment類似、CDATASection類型繼承自Text類型,因此擁有除<b>splitText()</b>之外的所有字符串操作方法。</p> <p> <p>CDATASection節(jié)點具有下列特征:</p> <p> <b>nodeType</b>的值為4</p> <p> <b>nodeName</b>的值為"#cdata-section"</p> <p> <b>nodeValue</b>的值是CDATA區(qū)域中的內(nèi)容</p> <p> <b>parentNode</b>可能是<b>Document</b>或<b>Element</b> </p> <p>不支持(沒有)子節(jié)點</p> </p> <p>CDATA區(qū)域只會出現(xiàn)在XML文檔中,因此多數(shù)瀏覽器都會把CDATA區(qū)域錯誤的解析為Comment或Element。</p> <pre><div class="6a22guqa" id="myDiv"><![CDATA[This is some content.]]></div></pre> <p>這個例子中div元素應該包含一個CDATASection節(jié)點。但四大主流瀏覽器都不能正確解析。即使對于有效的XHTML頁面,瀏覽器也沒有正確的支持嵌入的CDATA區(qū)域。</p> <p>在真正的XML文檔中,可以使用<b>document.createCDataSection()</b>來創(chuàng)建CDATA區(qū)域。</p> <b>DocumentType類型</b> <p> <p>DocumentType類型在Web瀏覽器中并不常用,僅有 Firefox Safari 和 Opera支持它。</p> <p> <b>nodeType</b>的值為10</p> <p> <b>nodeName</b>的值為doctype的名稱</p> <p> <b>nodeValue</b>的值是<b>null</b> </p> <p> <b>parentNode</b>是<b>Document</b> </p> <p>不支持(沒有)子節(jié)點</p> </p> <p>通常,瀏覽器中的文檔使用的都是HTML或XHTML文檔類型,只有name屬性是有用的。</p> <pre><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"></pre> <pre>console.log(document.doctype.name); // "HTML"</pre> <p>IE不支持DocumentType,因此 <b>document.doctype</b>的值始終都是<b>null</b> </p> <b>DocumentFragment 類型</b> <p>所有節(jié)點類型中,只有DocumentFragment在文檔中沒有對應的標記。</p> <p> <p>DOM規(guī)定文檔片段(document fragment)是一種輕量級的文檔,可以包含和控制節(jié)點,但不會像完整的文檔那樣占用額外的資源。</p> <p> <b>nodeType</b>的值為11</p> <p> <b>nodeName</b>的值為"#document-fragment"</p> <p> <b>nodeValue</b>的值是<b>null</b> </p> <p> <b>parentNode</b>是<b>null</b> </p> <p>子節(jié)點可以是<b>Element</b> 、<b>ProcessingInstruction</b> 、<b>Comment</b> 、<b>Text</b>、 <b>CDATASection</b> 、<b>EntityReference</b> </p> </p> <p>雖然不能把文檔文段直接添加到文檔中,但可以將它作為一個倉庫來使用,在里面保存將來可能會添加到文檔中的節(jié)點。</p> <p> <b>document.createDocumentFragment()</b> 方法創(chuàng)建文檔片段</p> <pre><ul id="myList"></ul></pre> <pre>var fragment = document.createDocumentFragment(); var ul = document.getElementById("myList"); var li = null; // 如果直接向ul添加li元素會導致瀏覽器反復渲染 // fragment作為一個元素中轉的倉庫避免了這個問題 for (var i=0; i < 3; i++) { li = document.createElement("li"); li.appendChild(document.createTextNode("Item " + (i+1))); fragment.appendChild(li); } // 這里只會將fragment的所有子節(jié)點添加到ul上 // 而fragment本身永遠不會成為文檔樹的一部分 ul.appendChild(fragment);</pre> <b>Attr類型</b> <p> <p>元素的特性在DOM中以Attr類型來表示。在所有瀏覽器中(包括IE8),都可以訪問 Attr類型的構造函數(shù)和原型。</p> <p> <b>nodeType</b>的值為2</p> <p> <b>nodeName</b>的值就是特性的名稱</p> <p> <b>nodeValue</b>的值就是特性的值</p> <p> <b>parentNode</b>是<b>null</b> </p> <p>HTML中不支持(沒有)子節(jié)點</p> <p>XML中子節(jié)點可以是Text或EntityReference</p> </p> <p>盡管Attr是節(jié)點,但特性卻不被認為是DOM文檔樹的一部分。</p> <p>Attr對象有三個屬性:<b>name</b> <b>value</b> <b>specified</b>。</p> <p> <b>document.createAttribute()</b>傳入特性的名稱可以創(chuàng)建新的特性節(jié)點。</p> <pre>var attr = document.createAttribute("align"); attr.value = "left"; element.setAttribute(attr); console.log(element.attributes["align"].value); // left console.log(element.getAttributeNode("align").value); // left console.log(element.getAttribute("align")); // left</pre> <b>DOM操作技術</b> <b>動態(tài)腳本</b> <p>使用<b></pre> <p>遺憾的是,并沒有什么標準方式來探知腳本是否加載完成。</p> <p>從邏輯上講,使用行內(nèi)方式直接插入代碼是有效的。在Firefox Safari Chrome Opera中,都可以正常運行,但在IE中,會導致錯誤。IE將<b> </div> </div> </div> </div> </div> </section> <!-- wap拉出按鈕 --> <div id="6a22guqa" class="site-tree-mobile layui-hide"> <i class="layui-icon layui-icon-spread-left"></i> </div> <!-- wap遮罩層 --> <div id="6a22guqa" class="site-mobile-shade"></div> <!--付費閱讀 --> <div class="6a22guqa" id="payread"> <div id="6a22guqa" class="layui-form-item">閱讀需要支付1元查看</div> <div id="6a22guqa" class="layui-form-item"><button class="btn-right">支付并查看</button></div> </div> <link rel="stylesheet" type="text/css" href="http://m.hztianpu.com/yun/static/js/neweditor/code/styles/tomorrow-night-eighties.css"> <footer> <div id="6a22guqa" class="layui-container"> <div id="6a22guqa" class="flex_box_zd"> <div id="6a22guqa" class="left-footer"> <h6><a href="http://m.hztianpu.com/"><img src="http://m.hztianpu.com/yun/static/theme/ukd//images/logo.png" alt="UCloud (優(yōu)刻得科技股份有限公司)"></a></h6> <p>UCloud (優(yōu)刻得科技股份有限公司)是中立、安全的云計算服務平臺,堅持中立,不涉足客戶業(yè)務領域。公司自主研發(fā)IaaS、PaaS、大數(shù)據(jù)流通平臺、AI服務平臺等一系列云計算產(chǎn)品,并深入了解互聯(lián)網(wǎng)、傳統(tǒng)企業(yè)在不同場景下的業(yè)務需求,提供公有云、混合云、私有云、專有云在內(nèi)的綜合性行業(yè)解決方案。</p> </div> <div id="6a22guqa" class="right-footer layui-hidemd"> <ul class="flex_box_zd"> <li> <h6>UCloud與云服務</h6> <p><a href="http://m.hztianpu.com/site/about/intro/">公司介紹</a></p> <p><a >加入我們</a></p> <p><a href="http://m.hztianpu.com/site/ucan/onlineclass/">UCan線上公開課</a></p> <p><a href="http://m.hztianpu.com/site/solutions.html" >行業(yè)解決方案</a></p> <p><a href="http://m.hztianpu.com/site/pro-notice/">產(chǎn)品動態(tài)</a></p> </li> <li> <h6>友情鏈接</h6> <p><a >GPU算力平臺</a></p> <p><a >UCloud私有云</a></p> <p><a >SurferCloud</a></p> <p><a >工廠仿真軟件</a></p> <p><a >AI繪畫</a></p> <p><a >Wavespeed AI</a></p> </li> <li> <h6>社區(qū)欄目</h6> <p><a href="http://m.hztianpu.com/yun/column/index.html">專欄文章</a></p> <p><a href="http://m.hztianpu.com/yun/udata/">專題地圖</a></p> </li> <li> <h6>常見問題</h6> <p><a href="http://m.hztianpu.com/site/ucsafe/notice.html" >安全中心</a></p> <p><a href="http://m.hztianpu.com/site/about/news/recent/" >新聞動態(tài)</a></p> <p><a href="http://m.hztianpu.com/site/about/news/report/">媒體動態(tài)</a></p> <p><a href="http://m.hztianpu.com/site/cases.html">客戶案例</a></p> <p><a href="http://m.hztianpu.com/site/notice/">公告</a></p> </li> <li> <span><img src="https://static.ucloud.cn/7a4b6983f4b94bcb97380adc5d073865.png" alt="優(yōu)刻得"></span> <p>掃掃了解更多</p></div> </div> <div id="6a22guqa" class="copyright">Copyright ? 2012-2025 UCloud 優(yōu)刻得科技股份有限公司<i>|</i><a rel="nofollow" >滬公網(wǎng)安備 31011002000058號</a><i>|</i><a rel="nofollow" ></a> 滬ICP備12020087號-3</a><i>|</i> <!-- Global site tag (gtag.js) - Google Analytics --> </div> </div> </footer> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <h1><a href="http://m.hztianpu.com/">成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码</a></h1> <div class="friend-links"> </div> </div> </footer> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body><div id="5bhf7" class="pl_css_ganrao" style="display: none;"><big id="5bhf7"></big><legend id="5bhf7"></legend><dl id="5bhf7"></dl><thead id="5bhf7"><label id="5bhf7"><optgroup id="5bhf7"><ruby id="5bhf7"></ruby></optgroup></label></thead><thead id="5bhf7"><thead id="5bhf7"></thead></thead><legend id="5bhf7"><sup id="5bhf7"><form id="5bhf7"><rp id="5bhf7"></rp></form></sup></legend><ins id="5bhf7"></ins><listing id="5bhf7"><dfn id="5bhf7"></dfn></listing><form id="5bhf7"><rp id="5bhf7"><font id="5bhf7"><legend id="5bhf7"></legend></font></rp></form><dfn id="5bhf7"><output id="5bhf7"><sub id="5bhf7"><thead id="5bhf7"></thead></sub></output></dfn><b id="5bhf7"></b><form id="5bhf7"></form><style id="5bhf7"><listing id="5bhf7"></listing></style><strong id="5bhf7"><ruby id="5bhf7"></ruby></strong><progress id="5bhf7"><dl id="5bhf7"><strong id="5bhf7"><track id="5bhf7"></track></strong></dl></progress><thead id="5bhf7"><label id="5bhf7"><strong id="5bhf7"><track id="5bhf7"></track></strong></label></thead><thead id="5bhf7"><label id="5bhf7"><optgroup id="5bhf7"><track id="5bhf7"></track></optgroup></label></thead><menuitem id="5bhf7"></menuitem><ruby id="5bhf7"><sub id="5bhf7"></sub></ruby><font id="5bhf7"><legend id="5bhf7"></legend></font><th id="5bhf7"><b id="5bhf7"><progress id="5bhf7"><acronym id="5bhf7"></acronym></progress></b></th><tt id="5bhf7"><progress id="5bhf7"><dl id="5bhf7"><pre id="5bhf7"></pre></dl></progress></tt><mark id="5bhf7"><acronym id="5bhf7"><pre id="5bhf7"><track id="5bhf7"></track></pre></acronym></mark><nobr id="5bhf7"><em id="5bhf7"><div id="5bhf7"><ol id="5bhf7"></ol></div></em></nobr><listing id="5bhf7"></listing><mark id="5bhf7"><acronym id="5bhf7"></acronym></mark><listing id="5bhf7"><dfn id="5bhf7"></dfn></listing><dl id="5bhf7"><pre id="5bhf7"></pre></dl><optgroup id="5bhf7"><output id="5bhf7"><span id="5bhf7"><strike id="5bhf7"></strike></span></output></optgroup><big id="5bhf7"><dl id="5bhf7"><strong id="5bhf7"><th id="5bhf7"></th></strong></dl></big><strike id="5bhf7"><strong id="5bhf7"></strong></strike><legend id="5bhf7"><th id="5bhf7"><tt id="5bhf7"><progress id="5bhf7"></progress></tt></th></legend><address id="5bhf7"></address><meter id="5bhf7"><ol id="5bhf7"><style id="5bhf7"><video id="5bhf7"></video></style></ol></meter><nobr id="5bhf7"><font id="5bhf7"><div id="5bhf7"><sup id="5bhf7"></sup></div></font></nobr><nobr id="5bhf7"><small id="5bhf7"><meter id="5bhf7"><pre id="5bhf7"></pre></meter></small></nobr><progress id="5bhf7"></progress><label id="5bhf7"></label><dfn id="5bhf7"><form id="5bhf7"></form></dfn><meter id="5bhf7"></meter><nobr id="5bhf7"><small id="5bhf7"><menuitem id="5bhf7"><span id="5bhf7"></span></menuitem></small></nobr><strike id="5bhf7"><strong id="5bhf7"><em id="5bhf7"><menuitem id="5bhf7"></menuitem></em></strong></strike><var id="5bhf7"><u id="5bhf7"><mark id="5bhf7"><form id="5bhf7"></form></mark></u></var><listing id="5bhf7"><small id="5bhf7"></small></listing><thead id="5bhf7"><strong id="5bhf7"></strong></thead><listing id="5bhf7"><dfn id="5bhf7"><meter id="5bhf7"><pre id="5bhf7"></pre></meter></dfn></listing><meter id="5bhf7"></meter><legend id="5bhf7"></legend><em id="5bhf7"></em><ruby id="5bhf7"><sub id="5bhf7"><thead id="5bhf7"><listing id="5bhf7"></listing></thead></sub></ruby></div> < </html>