成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

yearsj / 2558人閱讀

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

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

1998年10月DOM 1 級(jí)規(guī)范成為W3C的推薦標(biāo)準(zhǔn),為基本的文檔結(jié)構(gòu)及查詢提供了接口。本章主要討論與瀏覽器中的HTML頁(yè)面相關(guān)的DOM1級(jí)的特性和應(yīng)用,以及JavaScript對(duì)DOM1級(jí)的視線。

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

節(jié)點(diǎn)層次

  
    Sample Page
  
  
    

Hello World!

可以將這個(gè)簡(jiǎn)單的HTML文檔視為一個(gè)層次結(jié)構(gòu),如圖10-1所示。

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

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

Node 類型

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

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

每個(gè)節(jié)點(diǎn)都有一個(gè)nodeType屬性,用于表明節(jié)點(diǎn)的類型。及誒單類型由在Node類型中定義的下列12個(gè)數(shù)值常量來表示,任何節(jié)點(diǎn)類型必居其一(編號(hào)為節(jié)點(diǎn)類型常量存儲(chǔ)的數(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é)點(diǎn)類型
// 在IE中無效
if (someNode.nodeType == Node.ELEMENT_NODE) {
  console.log("Node is an element");
}

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

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

nodeNamenodeValue 屬性

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

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

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

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

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

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

  return array;
}

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

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

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

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

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

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

操作節(jié)點(diǎn)

因?yàn)殛P(guān)系指針都是只讀的,所以DOM提供了一些操作節(jié)點(diǎn)的方法 。

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

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

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

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

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

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

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

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

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

其他方法

還有兩個(gè)方法是所有節(jié)點(diǎn)都有的。

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

傳入true。執(zhí)行深復(fù)制,復(fù)制節(jié)點(diǎn)及其整個(gè)子節(jié)點(diǎn)樹

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

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

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

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

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

  • 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及之前的版本不會(huì)為包含空白符的文字創(chuàng)建節(jié)點(diǎn)(TEXT)
console.log(deepList.childNodes.length);

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

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

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

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

本章后面還將進(jìn)一步討論方法

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

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

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

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

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

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

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

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



  
  

看起來這個(gè)頁(yè)面應(yīng)該有3個(gè)子節(jié)點(diǎn):注釋、元素、注釋。從邏輯上講,我們會(huì)認(rèn)為document.childNodes中應(yīng)該包含與這3個(gè)節(jié)點(diǎn)對(duì)應(yīng)的3項(xiàng)。但是實(shí)際上,瀏覽器存在以下差異:

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

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

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

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

文檔信息

作為HMLTDocument的一個(gè)實(shí)例,document對(duì)象還有一些標(biāo)準(zhǔn)的Document對(duì)象所沒有的屬性。

title 包含著</b>元素中的文本。通過這個(gè)屬性可以取得當(dāng)前頁(yè)面的標(biāo)題,也可以修改當(dāng)前頁(yè)面的標(biāo)題并反映在瀏覽器的標(biāo)題欄中。修改<b>title</b>屬性的值會(huì)改變<b><title></b>元素。</p> <pre>// 取得文檔標(biāo)題 var originalTitle = document.title; // 設(shè)置文檔標(biāo)題 document.title = "New page title";</pre> <p> <p>下面三個(gè)屬性與網(wǎng)頁(yè)的請(qǐng)求有關(guān),所有這些信息都存在于請(qǐng)求的HTTP頭部,只不過是通過這些屬性讓我們能夠在JavaScript中訪問它們而已:</p> <p> <b>URL</b>屬性中包含頁(yè)面完整的URL(地址欄中的URL)</p> <p> <b>domain</b>屬性中值包含頁(yè)面的域名</p> <p> <b>referrer</b>屬性中可能會(huì)包含空字符串</p> <p> <b>URL</b>與<b>domain</b>屬性是相互關(guān)聯(lián)的。例如<b>document.URL</b>等于"http://www.wrox.com/WileyCDA/",那么<b>document.domain</b>就等于"www.wrox.com"。</p> <p>3個(gè)屬性中只有<b>domain</b>可以設(shè)置,但有安全方面的限制。如果URL中包含一個(gè)子域名,例如"p2p.wrox.com",那么就只能講<b>domain</b>設(shè)置為"wrox.com"(URL中包含"www",如"www.wrox.com"時(shí),也是如此)。</p> <p>當(dāng)頁(yè)面中包含來自其他子域的框架或內(nèi)嵌框架時(shí),能夠設(shè)置<b>document.domain</b>就非常方便了。由于跨域安全限制,來自不同子域的頁(yè)面無法通過JavaScript通信。而通過將每個(gè)頁(yè)面的<b>document.domain</b>設(shè)置為相同的值,這些頁(yè)面就可以互相訪問對(duì)方包含的JavaScript對(duì)象了。</p> </p> <pre>// 取得完整的URL var url = document.URL; // 取得域名 var domain = document.domain; // 取得來源 頁(yè)面的URL var referrer = document.referrer;</pre> <p>瀏覽器對(duì)<b>domain</b>屬性還有一個(gè)限制,即如果域名一開始是“松散的”(loose),那么就不能將它再設(shè)置為“緊繃的”(tight)。</p> <pre>// 假設(shè)頁(yè)面來自于 p2p.wrox.com域 document.domain = "wrox.com"; // 松散的(成功) document.domain = "p2p.wrox.com"; // 緊繃的(出錯(cuò))</pre> <b>查找元素</b> <p> <p><b>getElementById()</b> 接收一個(gè)參數(shù):要取得的元素的ID。找到相應(yīng)的元素則返回該元素,否則返回<b>null</b>。</p> <p>IE8及較低版本不區(qū)分ID大小寫</p> <p>如果頁(yè)面多個(gè)元素的ID相同,只會(huì)返回第一個(gè)匹配的元素。</p> <p>IE7及更早的版本添加了一個(gè)怪癖:name特性與給定ID匹配的表單元素也會(huì)被該方法返回。</p> <pre><input type="text" name="myElement" value="Text field"> <div class="qoyqs8suu2u" id="myElement">A div</div> <script> // IE7中調(diào)用會(huì)返回<input>元素 var el = document.getElementById("myElement"); </script></pre> </p> <p> <b>getElementsByTagName()</b> 接收一個(gè)參數(shù):要取得的元素的標(biāo)簽名,而返回的是包含零或多個(gè)元素的<b>NodeList</b>??梢允褂梅嚼ㄌ?hào)語法或<b>item()</b>方法來訪問對(duì)象中的項(xiàng)。</p> <p> <b>namedItem()</b> 使用這個(gè)方法可以通過元素的name特性取得集合中的項(xiàng)?;蚍嚼ㄌ?hào)語法能達(dá)到同樣的效果</p> <pre><img src="myimage.gif" name="myImage"> <script> var images = document.getElementsByTagName("img"); console.log(images.length); console.log(images[0].src); // 方括號(hào)傳入數(shù)值就調(diào)用 item() console.log(images.item(0).scr); var myImage = images.namedItem("myImage"); var myImage = images["myImage"]; // 方括號(hào)傳入字符串就調(diào)用namedItem() </script></pre> <p>要取得文檔中的所有元素,可以向<b>getElementsByTagName()</b>中傳入"*"。在JavaScript及CSS中,星號(hào)通常表示全部。</p> <p>雖然標(biāo)準(zhǔn)規(guī)定標(biāo)簽名需要區(qū)分大小寫,但為了最大限度的與既有HTML頁(yè)面兼容,傳給<b>getElementsByTagName()</b>的標(biāo)簽名是不需要區(qū)分大小寫的。但對(duì)于XML頁(yè)面而言(包括XHTML),<b>getElementsByTagName()</b>方法就會(huì)區(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>方法可以返回三個(gè)input元素。但是對(duì)于這里的單選按鈕來說<b>namedItem()</b>方法只會(huì)取得第一項(xiàng)(因?yàn)槊恳豁?xiàng)的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>得到的結(jié)果相同</p> <p> <b>document.images</b> 包含文檔中所有的<b><img></b>元素,與<b>document.getElementsByTagName("img")</b>得到的結(jié)果相同</p> <p> <b>document.links</b> 包含文檔中所有帶 <b>href</b> 特性的<b><a></b>元素</p> <b>DOM一致性檢測(cè)</b> <p>由于DOM分為多個(gè)級(jí)別,也包含多個(gè)部分,因此檢測(cè)瀏覽器實(shí)現(xiàn)了DOM的哪些部分就十分必要。<b>document.implementation</b>屬性就是為此提供的,與瀏覽器對(duì)DOM的實(shí)現(xiàn)直接對(duì)應(yīng)。</p> <p>DOM1級(jí)別只為<b>document.implementation</b>規(guī)定了一個(gè)方法,即<b>hasFeature()</b>。接收兩個(gè)參數(shù):要檢測(cè)的DOM功能的名稱及版本號(hào)。如果支持返回true</p> <pre>var hasXmlDom = docuemnt.implementation.hasFeature("XML", "1.0");</pre> <p>下表列出了可以檢測(cè)的不同值得版本號(hào)</p> <table> <thead><tr> <th>功能</th> <th>版本號(hào)</th> <th>說明</th> </tr></thead> <tbody> <tr> <td>Core</td> <td>1.0、2.0、3.0</td> <td>基本的DOM,用于描述表現(xiàn)文檔的節(jié)點(diǎn)樹</td> </tr> <tr> <td>XML</td> <td>1.0、2.0、3.0</td> <td>Core的XML拓展,添加了對(duì)CDATA、處理指令及實(shí)體的支持</td> </tr> <tr> <td>HTML</td> <td>1.0、2.0</td> <td>XML的HTML拓展,添加了對(duì)HTML特有元素及實(shí)體的支持</td> </tr> <tr> <td>Views</td> <td>2.0</td> <td>基于某些樣式完成文檔的格式化</td> </tr> <tr> <td>StyleSheets</td> <td>2.0</td> <td>將樣式表關(guān)聯(lián)到文檔</td> </tr> <tr> <td>CSS</td> <td>2.0</td> <td>對(duì)層疊樣式表1級(jí)的支持</td> </tr> <tr> <td>CSS2</td> <td>2.0</td> <td>對(duì)層疊樣式表2級(jí)的支持</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>由鼠標(biāo)引發(fā)的事件(click、mouseover等)</td> </tr> <tr> <td>MutationEvents</td> <td>2.0, 3.0</td> <td>DOM樹變化時(shí)引發(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樹種某個(gè)范圍的對(duì)象和方法</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> 方法確實(shí)方便,但也有缺點(diǎn)。因?yàn)閷?shí)現(xiàn)者可以自行決定是否與DOM規(guī)范的不同部分保持一致。事實(shí)上,想讓<b>hasFearture()</b>針對(duì)所有值都有返回true很容易,但返回true有時(shí)候也不意味著實(shí)現(xiàn)與規(guī)范一致。</p> <p>為此我們建議,在使用<b>hasFreatrue()</b>之外,還同時(shí)使用能力檢測(cè)。</p> <b>文檔寫入</b> <p> <b>write()</b>和<b>writeln()</b>方法都接收一個(gè)字符串參數(shù),即要寫入到輸出流中的文本。<b>wirte()</b>會(huì)原樣寫入,而<b>writeln()</b>則會(huì)在字符串的末尾添加一個(gè)換行符(n)。在頁(yè)面加載的過程中,可以使用這兩個(gè)方法動(dòng)態(tài)的加入內(nèi)容。</p> <p>在包含JavaScript文件時(shí),必須注意不能像下面的例子那樣直接包含字符串"</script>",因?yàn)檫@會(huì)導(dǎo)致該字符串被解釋為腳本塊的結(jié)束,后面的代碼將無法執(zhí)行。使用轉(zhuǎn)義"</script>"可以避免這個(gè)問題。</p> <p> <b>open()</b>和<b>close()</b>分別用于打開和關(guān)閉網(wǎng)頁(yè)的輸出流。如果是在頁(yè)面加載期間使用<b>write()</b>或<b>writeln()</b>方法,則不需要用到這兩個(gè)方法。</p> <p>嚴(yán)格型XHTML文檔不支持文檔吸入。對(duì)于那些按照<b>application/xml+xhtml</b>內(nèi)容類型提供的頁(yè)面,這兩個(gè)方法也同樣無效。</p> <b>Element類型</b> <p> <b>Element</b>類型用于表現(xiàn)XML或XHTML元素,提供了對(duì)元素標(biāo)簽名、子節(jié)點(diǎn)及特性的訪問。</p> <p> <p><b>Element</b>類型具有以下特征:</p> <p> <b>nodeType</b>的值為1</p> <p> <b>nodeName</b>的值為元素的標(biāo)簽名</p> <p> <b>nodeValue</b>的值為<b>null</b> </p> <p> <b>parentNode</b>的值可能為Dcoment或Element</p> <p>其子節(jié)點(diǎn)可能是 <b>Element</b>、 <b>Text</b> 、 <b>Comment</b> 、 <b>ProcessingInstruction</b>、 <b>CDATASection</b>、 <b>EntityReference</b> </p> </p> <p>訪問元素的標(biāo)簽名,可以使用<b>nodeName</b>屬性,也可以是使用<b>tagName</b>屬性,這兩個(gè)屬性會(huì)返回相同的值。</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") { // 不能這樣比較,很容易出錯(cuò) } if (element.tagName.toLowerCase() == "div") { // 推薦這樣做(適用于任何文檔) }</pre> <b>HTML元素</b> <p> <p>所有HTML元素都由<b>HTMLElement</b>類型表示。<b>HTMLElement</b>類型直接繼承自Elment并添加了一些屬性。每個(gè)HTML元素中都存在的下列標(biāo)準(zhǔn)特性:</p> <p> <b>id</b> 元素在文檔中的唯一標(biāo)識(shí)符</p> <p> <b>title</b> 有關(guān)元素的附加說明信息,一般通過工具提示條顯示出來</p> <p> <b>lang</b> 元素內(nèi)容的語言代碼,很少使用</p> <p> <b>dir</b> 語言的方向值為"ltr"(left-to-right 從左至右)或 "rtl"</p> <p> <b>className</b> 與元素的class特性對(duì)應(yīng),即為元素指定的CSS類。沒有將這個(gè)屬性命名為class是因?yàn)閏lass是ECMAScript的保留字。</p> </p> <p>并不是對(duì)所有屬性的修改都會(huì)在頁(yè)面中直觀的表現(xiàn)出來。對(duì)id或lang的修改對(duì)用戶而言是透明不可見的。而對(duì)title的修改則只會(huì)在鼠標(biāo)移動(dòng)到這個(gè)元素之上時(shí)才會(huì)顯示出來。對(duì)dir的修改會(huì)在屬性重寫的那一刻,立即影響頁(yè)面中文本的左右對(duì)齊方式。修改className時(shí),如果新類關(guān)聯(lián)了與此前不同的CSS樣式,就立即應(yīng)用新的樣式。</p> <p>下面表格列出了所有HTML元素以及與之關(guān)聯(lián)的類型(以斜體印刷的元素表示不推薦使用了)。注意表中的這些類型在Opera、Safari、Chrome、Firefox中都可以通過JavaScript訪問,但在IE8之前的版本中,不能通過JavaScript訪問。</p> <p><script type="text/javascript">showImg("https://segmentfault.com/img/bVbsSmI?w=828&h=682");</script><br><script type="text/javascript">showImg("https://segmentfault.com/img/bVbsSmO?w=948&h=520");</script></p> <b>取得特性</b> <p>操作特性的DOM方法主要有三個(gè),分別是<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>的特性名與實(shí)際的特性名相同。因此想要得到class特性值,應(yīng)該傳入"class" 而不是"className",后者只在通過對(duì)象屬性訪問特性時(shí)才用。</p> <p>如果給定的特性不存在,<b>getAttribute()</b>返回<b>null</b>。</p> <p>也可以取得自定義特性,即標(biāo)準(zhǔn)HTML語言中沒有的特性的值。需要注意,特性的名稱不區(qū)分大小寫,即"ID" 和 "id" 代表的都是同一個(gè)特性。另外也要注意,根據(jù)HTML5規(guī)范,自定義特性應(yīng)該加上data-前綴以便驗(yàn)證。</p> <p>任何元素的所有特性,也都可以通過DOM元素本身的屬性來訪問。當(dāng)然<b>HTMLElement</b>也會(huì)有5個(gè)屬性與相應(yīng)的特性一一對(duì)應(yīng)。不過只有公認(rèn)的(非自定義)特性才會(huì)以屬性的形式添加到DOM對(duì)象中。例如可以通過<b>div.id</b>訪問div元素的id屬性。不過自定義特性在Safari、Opera、Chrome、Firefox中是不存在的,但I(xiàn)E卻會(huì)為自定義特性也創(chuàng)建屬性。</p> <p>CSS通過<b>getAttribute()</b>訪問時(shí),返回的style特性值中包含的是CSS文本,而通過屬性來訪問它則會(huì)返回一個(gè)對(duì)象。由于style屬性是用于以編程方式訪問元素樣式的(本章后面討論),因此并沒有直接映射到style特性。</p> <p>時(shí)間處理程序(例如onclick)通過<b>getAttribute()</b>訪問,返回的是相應(yīng)的代碼字符串。而在訪問onclick屬性時(shí),則返回的是一個(gè)JavaScript函數(shù)(如果未在元素中指定相應(yīng)特性,則返回<b>null</b>)。這是因?yàn)閛nclick及其他事件程序?qū)傩员旧砭蛻?yīng)該被賦予函數(shù)值。</p> <p>由于存在上述差別,在通過JavaScript以編程方式操作DOM時(shí),開發(fā)人員不經(jīng)常使用 <b>getAttribute()</b>方法,而只是使用對(duì)象的屬性。只有在取得自定義特性值得情況下,才會(huì)使用<b>getAttribute()</b>方法。</p> <p>在IE7及以前版本中,通過<b>getAttribute()</b>訪問style特性或onclick,返回的值與屬性相同,都返回對(duì)象值或函數(shù)值。雖然IE8已經(jīng)修復(fù)了這個(gè)bug,但不同IE版本間的不一致性,也是導(dǎo)致開發(fā)人員不適用<b>getAttribute()</b>訪問HTML特性的一個(gè)原因。</p> <b>設(shè)置特性</b> <p>與<b>getAttribute()</b>對(duì)應(yīng)的方法時(shí)<b>setAttribute()</b>這個(gè)方法接收兩個(gè)參數(shù):要設(shè)置的特性名和值。如果特性已經(jīng)存在,<b>setAttribute()</b>會(huì)以指定的值替換現(xiàn)有的值;如果特性不存在,則創(chuàng)建該屬性并設(shè)置相應(yīng)的值。</p> <p> <b>setAttribute()</b>方法既可以操作HTML特性也可以操作自定義特性。通過這個(gè)方法設(shè)置的特性名會(huì)統(tǒng)一轉(zhuǎn)換為小寫形式,即"ID"最終變成"id"。</p> <pre>div.setAttribute("id", "someOtherId"); div.id = "someOtherId"; // 添加自定義屬性,該屬性不會(huì)自動(dòng)成為元素的特性 div.mycolor = "red"; div.getAttribute("mycolor"); // null ie除外</pre> <p> <b>removeAttribute()</b> 用于徹底刪除元素的特性,調(diào)用這個(gè)方法不僅會(huì)清楚特性的值,而且也會(huì)從元素中完全刪除特性。這個(gè)方法并不常用,IE6及以前版本不支持。</p> <pre>div.removeAttribute("class");</pre> <b>attributes屬性</b> <p>Element 類型是使用 attributes 屬性的唯一一個(gè)DOM節(jié)點(diǎn)類型 。</p> <p>attributes屬性中包含一個(gè)<b>NamedNodeMap</b>,與<b>NodeList</b>類似,也是一個(gè)動(dòng)態(tài)集合。元素的每一個(gè) 特性都由一個(gè)<b>Attr</b>節(jié)點(diǎn)表示,每個(gè)節(jié)點(diǎn)都保存在<b>NamedNodeMap</b>對(duì)象中。</p> <p> <p><b>NamedNodeMap</b>對(duì)象擁有以下方法</p> <p> <b>getNamedItem(name)</b>:返回<b>nodeName</b>屬性等于<b>name</b>的節(jié)點(diǎn)</p> <p> <b>removeNamedItem(name)</b>:從列表中移除<b>nodeName</b>屬性 等于name的節(jié)點(diǎn)</p> <p> <b>setNameItem(node)</b>:向列表中添加節(jié)點(diǎn),以節(jié)點(diǎn)的<b>nodeName</b>屬性為索引</p> <p> <b>item(pos)</b>:返回位于數(shù)字pos位置處的節(jié)點(diǎn)</p> </p> <p> <b>attributes</b>屬性中包含一系列節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)的<b>nodeName</b>就是特性的名稱,而節(jié)點(diǎn)的<b>nodeValue</b>就是特性的值。</p> <pre>// 取得元素的id var id = element.attributes.getNamedItem("id").nodeValue; // 設(shè)置元素的id element.attributes["id"].nodeValue = "someOtherId"; // 刪除元素id,并返回被刪除特性的Attr節(jié)點(diǎn) var oldAttr = element.attributes.removeNamedItem("id"); // 傳入一個(gè)新的特性節(jié)點(diǎn) element.attributes.setNameItem(newAttr);</pre> <p>由于attributes的方法不夠方便,因此開啊人員更多的會(huì)使用<b>getAttribute()</b>、<b>removeAttribute()</b>、<b>setAttribute()</b>方法。如果想要遍歷元素特性,可以用attributes</p> <p>針對(duì)attributes對(duì)象中的特性,不同瀏覽器返回的順序不同。</p> <p>IE7及更早版本返回HTML元素中所有可能的特性,包括沒有指定的特性。返回100多個(gè)特性是常見的</p> <pre>// 迭代元素的每一個(gè)特性,然后構(gòu)造成 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; // 針對(duì) 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)建新元素。只接收一個(gè)參數(shù),即要?jiǎng)?chuàng)建元素的標(biāo)簽名,在HTML文檔中不區(qū)分大小寫,而在XML(包括XHTML)文檔中,則是區(qū)分大小寫。</p> <p> <b>document.createElement()</b>創(chuàng)建元素的同時(shí),也為新元素設(shè)置了<b>ownerDcoument</b>屬性。此時(shí)還可以操作元素的特性,為它添加更多子節(jié)點(diǎn)。</p> <p>由于新元素尚未被添加到文檔樹中,因此設(shè)置這些特性不會(huì)影響瀏覽器的顯示。要把新元素添加到文檔樹,可以使用<b>appendChild()</b> <b>insertBefore()</b> <b>replaceChild()</b>方法。</p> <pre>// 創(chuàng)建 var div = document.createElement("div"); // 操作元素特性,添加子節(jié)點(diǎn) div.id = "myNewDiv"; div.className = "box"; document.body.appendChild(div);</pre> <p> <p>在IE中可以傳入完整的元素標(biāo)簽,也可以包含屬性(僅IE支持)。這樣有助于避開在IE7及更早版本中動(dòng)態(tài)創(chuàng)建元素的某些問題:</p> <p>不能設(shè)置動(dòng)態(tài)創(chuàng)建的<b><iframe></b>元素的<b>name</b>特性</p> <p>不能通過表單的<b>reset()</b>方法重設(shè)動(dòng)態(tài)創(chuàng)建的<b><input></b>元素(第13章討論reset()方法)</p> <p>動(dòng)態(tài)創(chuàng)建的<b>type</b>特性值為“reset”的<b><button></b>元素重設(shè)不了表單</p> <p>動(dòng)態(tài)創(chuàng)建的一批<b>name</b>相同的單選按鈕彼此毫無關(guān)系。</p> </p> <pre>if (client.browser.id && client.browser.ie <= 7) { var div = document.createElement("<div class="qoyqs8suu2u" id="myNewDiv" class="box"></div>"); }</pre> <b>元素的子節(jié)點(diǎn)</b> <p>元素可以有任意書目的子節(jié)點(diǎn)和后臺(tái)節(jié)點(diǎn),因?yàn)樵乜梢允瞧渌氐淖庸?jié)點(diǎn)。元素的<b>childNodes</b>屬性中包含了它所有子節(jié)點(diǎn),這些子節(jié)點(diǎn)可能是元素、文本節(jié)點(diǎn)、注釋或處理指令。不用瀏覽器在看待這些節(jié)點(diǎn)方面存在顯著的不同。</p> <pre><ul id="myList"> <li>item 1</li> <li>item 2</li> <li>item 3</li> </ul></pre> <p>IE解析,<b><ul></b>元素會(huì)有3個(gè)子節(jié)點(diǎn),分別是3個(gè)<b><li></b>元素。但如果是其他瀏覽器,<b><ul></b>元素都會(huì)有7個(gè)元素,包括3個(gè)<b><li></b>元素和4個(gè)文本節(jié)點(diǎn)(表示<b><li></b>元素之間的空白符)。</p> <p>如果將元素間的空白符刪除,那么所有瀏覽器都會(huì)返回相同數(shù)目的子節(jié)點(diǎn)</p> <pre><ul id="myList"><li>item 1</li><li>item 2</li><li>item 3</li></ul></pre> <p>如果需要通過<b>childNodes</b>屬性遍歷子節(jié)點(diǎn),那么一定不要忘記瀏覽器間的這一差別。這意味著在執(zhí)行某項(xiàng)操作以前,通常都要先檢查<b>nodeType</b>屬性</p> <pre>for (var i=0, len = element.childNodes.length; i < len; i++) { if (element.childNodes[i].nodeTpe == 1) { ... } }</pre> <p>如果想通過某個(gè)特性的標(biāo)簽名取得子節(jié)點(diǎn)或后代節(jié)點(diǎn),可以通過元素調(diào)用<b>getElementsByTagName()</b>方法,結(jié)果只會(huì)返回當(dāng)前元素的后代。</p> <pre>var ul = document.getElementById("myList"); var items = ul.getElementsByTagName("li");</pre> <b>Text類型</b> <p>文本節(jié)點(diǎn)由Text類型表示,包含的是可以照字面量解釋的純文本內(nèi)容。純文本中可以包含轉(zhuǎn)義后的HTML字符,但不能包含HTML代碼。</p> <p> <p>Text節(jié)點(diǎn)具有以下特征:</p> <p> <b>nodeType</b>的值為3</p> <p> <b>nodeName</b>的值為"#text"</p> <p> <b>nodeValue</b>的值為節(jié)點(diǎn)所包含的文本</p> <p> <b>parentNode</b>是一個(gè)Element</p> <p>不支持(沒有)子節(jié)點(diǎn)</p> </p> <p>可以通過<b>nodeValue</b>屬性或<b>data</b>屬性訪問Text節(jié)點(diǎn)中包含的文本,這兩個(gè)屬性的值相同。對(duì)<b>nodeValue</b>的修改也會(huì)通過<b>data</b>反映出來,反之亦然。</p> <p> <p>使用下列方法可以操作節(jié)點(diǎn)中的文本</p> <p> <b>appendData(text)</b>:將text添加到節(jié)點(diǎn)的末尾</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指定的位置將當(dāng)前文本節(jié)點(diǎn)分成兩個(gè)文本節(jié)點(diǎn)。</p> <p> <b>substringData(offset, count)</b>:提取從offset指定的位置開始到 offset+count為止處的字符串</p> <p> <b>length</b>屬性:保存著節(jié)點(diǎn)中字符的書目。而且<b>nodeValue.length</b>和<b>data.length</b>中也保存著同樣的數(shù)值</p> </p> <p>在默認(rèn)情況下,每個(gè)可以包含內(nèi)容的元素最多只能有一個(gè)文本節(jié)點(diǎn),而且必須確實(shí)有內(nèi)容存在</p> <pre><!-- 沒有內(nèi)容,也就沒有文本節(jié)點(diǎn) --> <div></div> <!-- 有空格,因?yàn)橛幸粋€(gè)文本節(jié)點(diǎn) --> <div> </div> <!-- 有內(nèi)容,因?yàn)橛幸粋€(gè)文本節(jié)點(diǎn) --> <div>Hello World!</div></pre> <pre>// 可以像這樣取得文本子節(jié)點(diǎn) var textNode= div.firstChild; // 或者 div.childNodes[0] // 取得文本節(jié)點(diǎn)的引用后,就可以修改它了 div.firstChild.nodeValue = "Some other message";</pre> <p>如果這個(gè)文本節(jié)點(diǎn)當(dāng)前存在于文檔樹中,那么修改文本節(jié)點(diǎn)的結(jié)果就會(huì)立即得到反映。</p> <p>修改文本節(jié)點(diǎn)時(shí),字符串會(huì)經(jīng)過HTML(或XML,取決于文檔類型)編碼。換言之,小于號(hào)、大于號(hào)或引號(hào)都會(huì)像下面的例子一樣被轉(zhuǎn)義</p> <pre>div.firstChild.nodeValue = "Some <strong>other</strong> message"; // 輸出結(jié)果:"Some <strong>other</strong> message"</pre> <p>這是在向DOM文檔中插入文本之前,先對(duì)其進(jìn)行HTML編碼的一種有效方式</p> <b>創(chuàng)建文本節(jié)點(diǎn)</b> <p> <b>document.createTextNode()</b>創(chuàng)建新的文本節(jié)點(diǎn)。與設(shè)置已有文本節(jié)點(diǎn)的值一樣,作為參數(shù)的文本也將按照HTML或XML的格式進(jìn)行編碼。</p> <pre>var textNode = document.createTextNode("<strong>Hello</strong> World!");</pre> <p>在創(chuàng)建新文本節(jié)點(diǎn)的同時(shí),也會(huì)為其設(shè)置<b>ownerDocument</b>屬性。不過除非把新節(jié)點(diǎn)添加到文檔樹中已經(jīng)存在的節(jié)點(diǎn)中,否則我們不會(huì)在瀏覽器窗口中看到新節(jié)點(diǎn)。</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>一般情況下,每個(gè)元素只有一個(gè)文本子節(jié)點(diǎn)。不過在某些情況下也可能包含多個(gè)文字子節(jié)點(diǎn)。相鄰的同胞文本節(jié)點(diǎn),之間會(huì)連起來,中間不會(huì)有空格。</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é)點(diǎn)</b> <p>DOM文檔中存在相鄰的同胞文本節(jié)點(diǎn)很容易導(dǎo)致混亂,因?yàn)榉植磺逦谋竟?jié)點(diǎn)之間的界限。于是催生了一個(gè)能夠?qū)⑾噜徫谋竟?jié)點(diǎn)合并的方法。</p> <p> <b>normalize()</b>方法是由<b>Node</b>類型定義的(因而在所有節(jié)點(diǎn)類型中都存在)。如果在一個(gè)包含多個(gè)文本節(jié)點(diǎn)的父元素上調(diào)用<b>normalize()</b>方法,則會(huì)將所有文本節(jié)點(diǎn)合并成一個(gè)文本節(jié)點(diǎn)。</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>瀏覽器在解析文檔時(shí)永遠(yuǎn)不會(huì)創(chuàng)建相鄰的文本節(jié)點(diǎn),這種情況只會(huì)作為DOM操作的結(jié)果出現(xiàn)。</p> <p> <b>normalize()</b>有時(shí)候會(huì)導(dǎo)致IE6崩潰,IE7以上修復(fù)了此問題。</p> <b>分割文本節(jié)點(diǎn)</b> <p> <b>splitText()</b>方法會(huì)將一個(gè)文本節(jié)點(diǎn)分割成兩個(gè)。</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é)點(diǎn)具有以下特征:</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é)點(diǎn)</p> </p> <p>Comment類型與Text類型繼承自相同的基類,因此它擁有除<b>splitText()</b>之外的所有字符串操作方法。</p> <pre><div class="qoyqs8suu2u" 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é)點(diǎn)</p> <pre>var comment = document.createComment("A comment ");</pre> <p>開發(fā)人員很少會(huì)創(chuàng)建和訪問注釋節(jié)點(diǎn),此外瀏覽器也不會(huì)識(shí)別位于<b></html></b>標(biāo)簽后的注釋。如果要訪問注釋節(jié)點(diǎn),一定要保證它們是位于<b><html></b>和<b></html></b>之間。</p> <b>CDATASection類型</b> <p>CDATASection類型只針對(duì)基于XML的文檔,表示的是CDATA區(qū)域。與Comment類似、CDATASection類型繼承自Text類型,因此擁有除<b>splitText()</b>之外的所有字符串操作方法。</p> <p> <p>CDATASection節(jié)點(diǎn)具有下列特征:</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é)點(diǎn)</p> </p> <p>CDATA區(qū)域只會(huì)出現(xiàn)在XML文檔中,因此多數(shù)瀏覽器都會(huì)把CDATA區(qū)域錯(cuò)誤的解析為Comment或Element。</p> <pre><div class="qoyqs8suu2u" id="myDiv"><![CDATA[This is some content.]]></div></pre> <p>這個(gè)例子中div元素應(yīng)該包含一個(gè)CDATASection節(jié)點(diǎn)。但四大主流瀏覽器都不能正確解析。即使對(duì)于有效的XHTML頁(yè)面,瀏覽器也沒有正確的支持嵌入的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é)點(diǎn)</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é)點(diǎn)類型中,只有DocumentFragment在文檔中沒有對(duì)應(yīng)的標(biāo)記。</p> <p> <p>DOM規(guī)定文檔片段(document fragment)是一種輕量級(jí)的文檔,可以包含和控制節(jié)點(diǎn),但不會(huì)像完整的文檔那樣占用額外的資源。</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é)點(diǎn)可以是<b>Element</b> 、<b>ProcessingInstruction</b> 、<b>Comment</b> 、<b>Text</b>、 <b>CDATASection</b> 、<b>EntityReference</b> </p> </p> <p>雖然不能把文檔文段直接添加到文檔中,但可以將它作為一個(gè)倉(cāng)庫(kù)來使用,在里面保存將來可能會(huì)添加到文檔中的節(jié)點(diǎn)。</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元素會(huì)導(dǎo)致瀏覽器反復(fù)渲染 // fragment作為一個(gè)元素中轉(zhuǎn)的倉(cāng)庫(kù)避免了這個(gè)問題 for (var i=0; i < 3; i++) { li = document.createElement("li"); li.appendChild(document.createTextNode("Item " + (i+1))); fragment.appendChild(li); } // 這里只會(huì)將fragment的所有子節(jié)點(diǎn)添加到ul上 // 而fragment本身永遠(yuǎn)不會(huì)成為文檔樹的一部分 ul.appendChild(fragment);</pre> <b>Attr類型</b> <p> <p>元素的特性在DOM中以Attr類型來表示。在所有瀏覽器中(包括IE8),都可以訪問 Attr類型的構(gòu)造函數(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é)點(diǎn)</p> <p>XML中子節(jié)點(diǎn)可以是Text或EntityReference</p> </p> <p>盡管Attr是節(jié)點(diǎn),但特性卻不被認(rèn)為是DOM文檔樹的一部分。</p> <p>Attr對(duì)象有三個(gè)屬性:<b>name</b> <b>value</b> <b>specified</b>。</p> <p> <b>document.createAttribute()</b>傳入特性的名稱可以創(chuàng)建新的特性節(jié)點(diǎn)。</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操作技術(shù)</b> <b>動(dòng)態(tài)腳本</b> <p>使用<b><script></b>元素可以向頁(yè)面中插入JavaScript代碼,一種是通過其src特性包含外部文件,另一種就是用這個(gè)元素本身包含代碼。</p> <p>動(dòng)態(tài)加載的JavaScript文件能夠立即運(yùn)行。</p> <pre>// 在執(zhí)行最后一行代碼把<script>元素添加到頁(yè)面中之前 // 是不會(huì)下載外部文件的 var script = document.createElement("script"); script.type = "text/javascript"; script.src = "client.js"; document.body.appendChild(script);</pre> <pre><script type="text/javascript" src="client.js"></script></pre> <p>遺憾的是,并沒有什么標(biāo)準(zhǔn)方式來探知腳本是否加載完成。</p> <p>從邏輯上講,使用行內(nèi)方式直接插入代碼是有效的。在Firefox Safari Chrome Opera中,都可以正常運(yùn)行,但在IE中,會(huì)導(dǎo)致錯(cuò)誤。IE將<b><script></b>視為一個(gè)特殊元素,不允許DOM訪問其子節(jié)點(diǎn)。不過可以使用<b><script></b>元素的text屬性來制定JavaScript代碼</p> <pre>var script = document.createElement("script"); script.type = "text/javascript"; // 這樣IE不支持 script.appendChild( document.createTextNode("function sayHi() { console.log("Hi")}") ); // 可以使用`<script>`元素的text屬性來制定JavaScript代碼 script.text = "function sayHi() { console.log("Hi")}"; document.body.appendChild(script);</pre> <p>Safari3之前的版本不支持這種寫法,可以這樣做兼容處理</p> <pre>var script = document.createElement("script"); script.type = "text/javascript"; var code = "function sayHi() { console.log("Hi")}" try { script.appendChild(document.createTextNode(code)); } catch (ex) { script.text = code; } document.body.appendChild(script);</pre> <p>實(shí)際上,這樣執(zhí)行代碼與在全局作用域中把相同的字符串傳遞給<b>eval()</b>是一樣的。</p> <b>動(dòng)態(tài)樣式</b> <p>與動(dòng)態(tài)腳本類似,所謂動(dòng)態(tài)樣式是指在頁(yè)面剛加載時(shí)不存在的樣式;動(dòng)態(tài)樣式是在頁(yè)面加載完成后動(dòng)態(tài)添加到頁(yè)面中的。</p> <pre>var link = document.createElement("link"); link.rel = "stylesheet"; link.type = "text/css"; link.href = "style.css"; var head = document.getElementsByTagName("head")[0]; head.appendChild(head);</pre> <pre><link rel="stylesheet" type="text/css" href="styles.css"></pre> <p>必須將<b><link></b>元素添加到<b><head></b>而不是<b><body></b>元素,才能保證所在瀏覽器中的行為一致。</p> <p>加載外部樣式文件的過程是異步的,也就是加載樣式 與執(zhí)行JavaScript代碼的過程沒有固定的次序。</p> <p>一般是否知道樣式已加載完成并不重要,但也存在幾種利用事件來檢測(cè)這個(gè)過程是否完成的技術(shù),將在第13章討論。</p> <p>行內(nèi)方式插入樣式也是可以的,同樣要對(duì)IE做兼容處理</p> <pre>function loadStyleString(css) { var style = document.createElement("style"); style.type = "text/css"; try { style.appendChild(document.createTextNode(css)); } catch (ex) { style.styleSheet.cssText = css; } document.getElementsByTagName("head")[0].appendChild(style); }</pre> <p>如果專門針對(duì)IE編寫代碼,務(wù)必小心使用<b>styleSheet.cssText</b>屬性。在重用同一個(gè)<b><style></b>元素并再次設(shè)置這個(gè)屬性時(shí),有可能導(dǎo)致瀏覽器崩潰。同樣將<b>cssText</b>屬性設(shè)置為空字符串也可能導(dǎo)致瀏覽器崩潰。</p> <b>操作表格</b> <p> <b><table></b>元素是HTML中最復(fù)雜的結(jié)構(gòu)之一。想要?jiǎng)?chuàng)建表格,一般都必須涉及表示表格行、單元格、表頭等方面。由于涉及的標(biāo)簽多,因而使用核心DOM方法創(chuàng)建和修改表格往往都免不了要編寫大量的代碼。</p> <pre><table border="1" width="100%"> <tbody> <tr> <td>Cell 1,1</td> <td>Cell 2,1</td> </tr> <tr> <td>Cell 1,2</td> <td>Cell 2,2</td> </tr> </tbody> </table></pre> <pre>// 使用核心DOM方法創(chuàng)建這些元素 // 創(chuàng)建table var table = document.createElement("table"); table.border = 1; table.width = "100%"; // 創(chuàng)建tbody var tbody = document.createElement("tbody"); table.appendChild(tbody); // 創(chuàng)建第一行 var row1 = document.createElement("tr"); tbody.appendChild(row1); var cell1_1 = document.createElement("td"); cell1_1.appendChild(document.createTextNode("Cell 1,1")); row1.appendChild(cell1_1); var cell2_1 = document.createElement("td"); cell2_1.appendChild(document.createTextNode("Cell 2,1")); row1.appendChild(cell2_1); // 創(chuàng)建第二行 var row2 = document.createElement("tr"); tbody.appendChild(row2); var cell1_2 = document.createElement("td"); cell1_2.appendChild(document.createTextNode("Cell 1,2")); row2.appendChild(cell1_2); var cell2_2 = document.createElement("td"); cell2_2.appendChild(document.createTextNode("Cell 2,2")); row2.appendChild(cell2_2); // 將表格添加到文檔主體中 document.body.appendChild(table);</pre> <p>DOM代碼很長(zhǎng),還有點(diǎn)不好理解。為了方便構(gòu)建表格,HTMLDOM還為<b><table></b> <b><tbody></b> <b><tr></b> 元素添加了一些屬性和方法。</p> <p> <p><b><table></b>元素添加的屬性和方法:</p> <p>caption: 保存著對(duì)<b><caption></b>元素(如果有)的指針</p> <p>tBodies: 是一個(gè)<b><tbody></b>元素的HTMLCollction</p> <p>tFoot: 保存著對(duì)<b><tfoot></b>元素的(如果有)指針</p> <p>tHead: 保存著對(duì)<b><thead></b>元素的(如果有)指針</p> <p>rows: 是一個(gè)表格中所有行的HTMLCollection</p> <p>createTHead(): 創(chuàng)建<b><thead></b>元素,將其放到表格中,返回引用</p> <p>createTFoot(): 創(chuàng)建<b><tfoot></b>元素,將其放到表格中,返回引用</p> <p>createCaption(): 創(chuàng)建<b><caption></b>元素,將其放到表格中,返回引用</p> <p>deleteTHead(): 刪除<b><thead></b>元素</p> <p>deleteTFoot(): 刪除<b><tfoot></b>元素</p> <p>deleteCaption(): 刪除<b><caption></b>元素</p> <p>deleteRow(pos): 刪除指定位置的行</p> <p>insertRow(pos): 向<b>rows</b>集合中的指定位置插入一行</p> </p> <p> <p>為<b><tbody></b>元素添加的屬性和方法如下:</p> <p>rows: 保存著<b><tbody></b>元素中行的HTMLCollection</p> <p>deleteRow(pos): 刪除指定位置的行</p> <p>insertRow(pos): 向<b>rows</b>集合中的指定位置插入一行</p> </p> <p> <p>為<b><tr></b>元素添加的屬性和方法如下:</p> <p>cells: 保存著<b><tr></b>元素中單元格的HTMLCollection</p> <p>deleteCell(pos): 刪除指定位置的單元格</p> <p>insertCell(pos): 向<b>cells</b>集合中的指定位置插入一個(gè)單元格,返回對(duì)新插入單元格的引用。</p> </p> <pre>// 根據(jù)以上屬性和方法,可以大大簡(jiǎn)化前述代碼 // 創(chuàng)建table var table = document.createElement("table"); table.border = 1; table.width = "100%"; // 創(chuàng)建tbody var tbody = document.createElement("tbody"); table.appendChild(tbody); // 創(chuàng)建第一行 tbody.insertRow(0); tbody.rows[0].insertCell(0); tbody.rows[0].cells[0].appendChild(document.createTextNode("Cell 1,1")); tbody.rows[0].insertCell(1); tbody.rows[0].cells[1].appendChild(document.createTextNode("Cell 2,1")); // 創(chuàng)建第二行 tbody.insertRow(0); tbody.rows[1].insertCell(0); tbody.rows[1].cells[0].appendChild(document.createTextNode("Cell 1,2")); tbody.rows[1].insertCell(1); tbody.rows[1].cells[1].appendChild(document.createTextNode("Cell 2,2")); // 將表格添加到文檔主體中 document.body.appendChild(table);</pre> <b>使用NodeList</b> <p>理解 <b>NodeList</b> 及其近親 <b>NamedNodeMap</b> 和 <b>HTMLCollection</b>,是從整體上透徹理解DOM的關(guān)鍵所在。這三個(gè)集合都是動(dòng)態(tài)的,每當(dāng)文檔結(jié)構(gòu)發(fā)生變化,它們都會(huì)得到更新。</p> <p>本質(zhì)上說,所有<b>NodeList</b>對(duì)象都是在訪問DOM文檔實(shí)時(shí)運(yùn)行的查詢。</p> <pre>// 下列代碼會(huì)導(dǎo)致無限循環(huán) var divs = document.getElementsByTagName("div"); var div; // 每次循環(huán)都要對(duì)條件 i < divs.length 求值 // 但每次循環(huán)都添加了一個(gè)新的div for (var i=0; i < divs.length; i++) { div = document.createElement("div"); document.body.appendChild(div); }</pre> <pre>// 最好使用length屬性初始化第二個(gè)變量 var divs = document.getElementsByTagName("div"); var i, len, div; // len保存著第一次循環(huán)時(shí)div的數(shù)量,不會(huì)隨著循環(huán)增加 for (i=0, len=divs.length; i < len; i++) { div = document.createElement("div"); document.body.appendChild(div); }</pre> <p>盡量減少訪問<b>NodeList</b>的次數(shù),因?yàn)槊看卧L問都會(huì)運(yùn)行一次基于文檔的查詢。可以考慮將從<b>NodeList</b>中取得的值緩存起來。</p> <p>理解DOM的關(guān)鍵就是理解DOM對(duì)性能的影響。DOM操作往往是JavaScript程序中開銷最大的部分。有鑒于此,最好減少DOM操作。</p> </div> <div id="qoyqs8suu2u" class="mt-64 tags-seach" > <div id="qoyqs8suu2u" class="tags-info"> <a style="width:120px;" title="GPU云服務(wù)器" href="http://systransis.cn/site/product/gpu.html">GPU云服務(wù)器</a> <a style="width:120px;" title="云服務(wù)器" href="http://systransis.cn/site/active/kuaijiesale.html?ytag=seo">云服務(wù)器</a> <a style="width:120px;" title="javascript高級(jí)程序設(shè)計(jì)第2版" href="http://systransis.cn/yun/tag/javascriptgaojichengxushejidi2ban/">javascript高級(jí)程序設(shè)計(jì)第2版</a> <a style="width:120px;" title="javascript高級(jí)程序設(shè)計(jì)第三版" href="http://systransis.cn/yun/tag/javascriptgaojichengxushejidisanban/">javascript高級(jí)程序設(shè)計(jì)第三版</a> <a style="width:120px;" title="明解c語言第9章" href="http://systransis.cn/yun/tag/mingjiecyuyandi9zhang/">明解c語言第9章</a> <a style="width:120px;" title="javascript入門經(jīng)典第5版" href="http://systransis.cn/yun/tag/javascriptrumenjingdiandi5ban/">javascript入門經(jīng)典第5版</a> </div> </div> <div id="qoyqs8suu2u" class="entry-copyright mb-30"> <p class="mb-15"> 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。</p> <p>轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109690.html</p> </div> <ul class="pre-next-page"> <li id="qoyqs8suu2u" class="ellipsis"><a class="hpf" href="http://systransis.cn/yun/109689.html">上一篇:一種只寫 SQL、做配置完成復(fù)雜業(yè)務(wù)系統(tǒng)開發(fā)的方法</a></li> <li id="qoyqs8suu2u" class="ellipsis"><a class="hpf" href="http://systransis.cn/yun/109691.html">下一篇:《ES6學(xué)習(xí)2》 變量的解構(gòu)賦值</a></li> </ul> </div> <div id="qoyqs8suu2u" class="about_topicone-mid"> <h3 class="top-com-title mb-0"><span data-id="0">相關(guān)文章</span></h3> <ul class="com_white-left-mid atricle-list-box"> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/104142.html"><b>《<em>JavaScript</em><em>高級(jí)</em><em><em>程序</em><em>設(shè)計(jì)</em></em>》(<em>第</em><em>3</em><em>版</em>)<em>讀書</em><em>筆記</em> <em>第</em>1~2<em>章</em></b></a></h2> <p class="ellipsis2 good">摘要:表示應(yīng)該立即下載腳本,但不應(yīng)妨礙頁(yè)面中的其他操作可選。表示通過屬性指定的代碼的字符集。表示腳本可以延遲到文檔完全被解析和顯示之后再執(zhí)行。實(shí)際上,服務(wù)器在傳送文件時(shí)使用的類型通常是,但在中設(shè)置這個(gè)值卻可能導(dǎo)致腳本被忽略。 第1章 JavaScript 簡(jiǎn)介 雖然JavaScript和ECMAScript通常被人們用來表達(dá)相同的含義,但JavaScript的含義比ECMA-262要多得多...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-486.html"><img src="http://systransis.cn/yun/data/avatar/000/00/04/small_000000486.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">Corwien</span></a> <time datetime="">2019-08-23 17:18</time> <span><i class="fa fa-commenting"></i>評(píng)論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/109699.html"><b>《<em>JavaScript</em><em>高級(jí)</em><em><em>程序</em><em>設(shè)計(jì)</em></em>》(<em>第</em><em>3</em><em>版</em>)<em>讀書</em><em>筆記</em> <em>第</em>11<em>章</em> <em>DOM</em>拓展</b></a></h2> <p class="ellipsis2 good">摘要:對(duì)的兩個(gè)主要拓展是選擇和。以下插入標(biāo)記的拓展已經(jīng)納入了規(guī)范。在寫模式下,會(huì)根據(jù)指定的字符串創(chuàng)建新的子樹,然后用這個(gè)子樹完全替換調(diào)用元素。在刪除帶有時(shí)間處理程序或引用了其他對(duì)象子樹時(shí),就有可能導(dǎo)致內(nèi)存占用問題。 盡管DOM作為API已經(jīng)非常完善了,但為了實(shí)現(xiàn)更多功能,仍然會(huì)有一些標(biāo)準(zhǔn)或?qū)S械耐卣埂?008年之前,瀏覽器中幾乎所有的拓展都是專有的,此后W3C著手將一些已經(jīng)成為事實(shí)標(biāo)準(zhǔn)的專...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-1447.html"><img src="http://systransis.cn/yun/data/avatar/000/00/14/small_000001447.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">luck</span></a> <time datetime="">2019-08-26 13:52</time> <span><i class="fa fa-commenting"></i>評(píng)論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/104169.html"><b>《<em>JavaScript</em><em>高級(jí)</em><em><em>程序</em><em>設(shè)計(jì)</em></em>》(<em>第</em><em>3</em><em>版</em>)<em>讀書</em><em>筆記</em> <em>第</em>4<em>章</em> 變量、作用域和內(nèi)存問題</b></a></h2> <p class="ellipsis2 good">摘要:具體說就是執(zhí)行流進(jìn)入下列任何一個(gè)語句時(shí),作用域鏈就會(huì)得到加長(zhǎng)語句的塊。如果局部環(huán)境中存在著同名的標(biāo)識(shí)符,就不會(huì)使用位于父環(huán)境中的標(biāo)識(shí)符訪問局部變量要比訪問全局變量更快,因?yàn)椴挥孟蛏纤阉髯饔糜蜴湣? 基本類型和引用類型的值 ECMAscript變量包含 基本類型值和引用類型值 基本類型值值的是基本數(shù)據(jù)類型:Undefined, Null, Boolean, Number, String ...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-324.html"><img src="http://systransis.cn/yun/data/avatar/000/00/03/small_000000324.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">lidashuang</span></a> <time datetime="">2019-08-23 17:19</time> <span><i class="fa fa-commenting"></i>評(píng)論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/82924.html"><b>Ajax與Comet-<em>JavaScript</em><em>高級(jí)</em><em><em>程序</em><em>設(shè)計(jì)</em></em><em>第</em>21<em>章</em><em>讀書</em><em>筆記</em>(1)</b></a></h2> <p class="ellipsis2 good">摘要:技術(shù)的核心是對(duì)象即。收到響應(yīng)后,響應(yīng)的數(shù)據(jù)會(huì)自動(dòng)填充對(duì)象的屬性,相關(guān)的屬性有作為響應(yīng)主體被返回的文本。收到響應(yīng)后,一般來說,會(huì)先判斷是否為,這是此次請(qǐng)求成功的標(biāo)志。中的版本會(huì)將設(shè)置為,而中原生的則會(huì)將規(guī)范化為。會(huì)在取得時(shí)報(bào)告的值為。 Ajax(Asynchronous Javascript + XML)技術(shù)的核心是XMLHttpRequest對(duì)象,即: XHR。雖然名字中包含XML,但...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-1549.html"><img src="http://systransis.cn/yun/data/avatar/000/00/15/small_000001549.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">imingyu</span></a> <time datetime="">2019-08-20 16:27</time> <span><i class="fa fa-commenting"></i>評(píng)論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/109582.html"><b>《<em>JavaScript</em><em>高級(jí)</em><em><em>程序</em><em>設(shè)計(jì)</em></em>》(<em>第</em><em>3</em><em>版</em>)<em>讀書</em><em>筆記</em> <em>第</em>9<em>章</em> 客戶端檢測(cè)</b></a></h2> <p class="ellipsis2 good">摘要:用戶代理檢測(cè)用戶代理檢測(cè)是爭(zhēng)議最大的客戶端檢測(cè)技術(shù)。第二個(gè)要檢測(cè)是。由于實(shí)際的版本號(hào)可能會(huì)包含數(shù)字小數(shù)點(diǎn)和字母,所以捕獲組中使用了表示非空格的特殊字符。版本號(hào)不在后面,而是在后面。除了知道設(shè)備,最好還能知道的版本號(hào)。 檢測(cè)Web客戶端的手段很多,各有利弊,但不到萬不得已就不要使用客戶端檢測(cè)。只要能找到更通用的方法,就應(yīng)該優(yōu)先采用更通用的方法。一言蔽之,先設(shè)計(jì)最通用的方案,然后再使用特定...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-1394.html"><img src="http://systransis.cn/yun/data/avatar/000/00/13/small_000001394.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">ispring</span></a> <time datetime="">2019-08-26 13:48</time> <span><i class="fa fa-commenting"></i>評(píng)論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> </ul> </div> <div id="qoyqs8suu2u" class="topicone-box-wangeditor"> <h3 class="top-com-title mb-64"><span>發(fā)表評(píng)論</span></h3> <div id="qoyqs8suu2u" class="xcp-publish-main flex_box_zd"> <div id="qoyqs8suu2u" class="unlogin-pinglun-box"> <a href="javascript:login()" class="grad">登陸后可評(píng)論</a> </div> </div> </div> <div id="qoyqs8suu2u" class="site-box-content"> <div id="qoyqs8suu2u" class="site-content-title"> <h3 class="top-com-title mb-64"><span>0條評(píng)論</span></h3> </div> <div id="qoyqs8suu2u" class="pages"></ul></div> </div> </div> <div id="qoyqs8suu2u" class="layui-col-md4 layui-col-lg3 com_white-right site-wrap-right"> <div id="qoyqs8suu2u" class=""> <div id="qoyqs8suu2u" class="com_layuiright-box user-msgbox"> <a href="http://systransis.cn/yun/u-1200.html"><img src="http://systransis.cn/yun/data/avatar/000/00/12/small_000001200.jpg" alt=""></a> <h3><a href="http://systransis.cn/yun/u-1200.html" rel="nofollow">yearsj</a></h3> <h6>男<span>|</span>高級(jí)講師</h6> <div id="qoyqs8suu2u" class="flex_box_zd user-msgbox-atten"> <a href="javascript:attentto_user(1200)" id="attenttouser_1200" class="grad follow-btn notfollow attention">我要關(guān)注</a> <a href="javascript:login()" title="發(fā)私信" >我要私信</a> </div> <div id="qoyqs8suu2u" class="user-msgbox-list flex_box_zd"> <h3 class="hpf">TA的文章</h3> <a href="http://systransis.cn/yun/ut-1200.html" class="box_hxjz">閱讀更多</a> </div> <ul class="user-msgbox-ul"> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/130845.html">tensorflow用gpu</a></h3> <p>閱讀 2155<span>·</span>2023-04-26 00:23</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/119564.html">因算法出現(xiàn)歧視問題,F(xiàn)acebook 緊急下架相關(guān)話題推薦功能,</a></h3> <p>閱讀 830<span>·</span>2021-09-08 09:45</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/111177.html">CSS > 行內(nèi)格式化上下文中的各種高度計(jì)算</a></h3> <p>閱讀 2451<span>·</span>2019-08-28 18:20</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/109690.html">《JavaScript高級(jí)程序設(shè)計(jì)》(第3版)讀書筆記 第10章 DOM</a></h3> <p>閱讀 2559<span>·</span>2019-08-26 13:51</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/106345.html">前端項(xiàng)目修改默認(rèn)滾動(dòng)條樣式</a></h3> <p>閱讀 1611<span>·</span>2019-08-26 10:32</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/106120.html">ES6之Proxy & Reflection API</a></h3> <p>閱讀 1405<span>·</span>2019-08-26 10:24</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/106100.html">理解Koa洋蔥模型</a></h3> <p>閱讀 2043<span>·</span>2019-08-26 10:23</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/104769.html">JavaScript常用6大繼承方式解析</a></h3> <p>閱讀 2210<span>·</span>2019-08-23 18:10</p></li> </ul> </div> <!-- 文章詳情右側(cè)廣告--> <div id="qoyqs8suu2u" class="com_layuiright-box"> <h6 class="top-com-title"><span>最新活動(dòng)</span></h6> <div id="qoyqs8suu2u" class="com_adbox"> <div id="qoyqs8suu2u" class="layui-carousel" id="right-item"> <div carousel-item> <div> <a href="http://systransis.cn/site/active/kuaijiesale.html?ytag=seo" rel="nofollow"> <img src="http://systransis.cn/yun/data/attach/240625/2rTjEHmi.png" alt="云服務(wù)器"> </a> </div> <div> <a href="http://systransis.cn/site/product/gpu.html" rel="nofollow"> <img src="http://systransis.cn/yun/data/attach/240807/7NjZjdrd.png" alt="GPU云服務(wù)器"> </a> </div> </div> </div> </div> <!-- banner結(jié)束 --> <div id="qoyqs8suu2u" class="adhtml"> </div> <script> $(function(){ $.ajax({ type: "GET", url:"http://systransis.cn/yun/ad/getad/1.html", cache: false, success: function(text){ $(".adhtml").html(text); } }); }) </script> </div> </div> </div> </div> </div> </section> <!-- wap拉出按鈕 --> <div id="qoyqs8suu2u" class="site-tree-mobile layui-hide"> <i class="layui-icon layui-icon-spread-left"></i> </div> <!-- wap遮罩層 --> <div id="qoyqs8suu2u" class="site-mobile-shade"></div> <!--付費(fèi)閱讀 --> <div class="qoyqs8suu2u" id="payread"> <div id="qoyqs8suu2u" class="layui-form-item">閱讀需要支付1元查看</div> <div id="qoyqs8suu2u" class="layui-form-item"><button class="btn-right">支付并查看</button></div> </div> <script> var prei=0; $(".site-seo-depict pre").each(function(){ var html=$(this).html().replace("<code>","").replace("</code>","").replace('<code class="javascript hljs" codemark="1">',''); $(this).attr('data-clipboard-text',html).attr("id","pre"+prei); $(this).html("").append("<code>"+html+"</code>"); prei++; }) $(".site-seo-depict img").each(function(){ if($(this).attr("src").indexOf('data:image/svg+xml')!= -1){ $(this).remove(); } }) $("LINK[href*='style-49037e4d27.css']").remove(); $("LINK[href*='markdown_views-d7a94ec6ab.css']").remove(); layui.use(['jquery', 'layer','code'], function(){ $("pre").attr("class","layui-code"); $("pre").attr("lay-title",""); $("pre").attr("lay-skin",""); layui.code(); $(".layui-code-h3 a").attr("class","copycode").html("復(fù)制代碼 ").attr("onclick","copycode(this)"); }); function copycode(target){ var id=$(target).parent().parent().attr("id"); var clipboard = new ClipboardJS("#"+id); clipboard.on('success', function(e) { e.clearSelection(); alert("復(fù)制成功") }); clipboard.on('error', function(e) { alert("復(fù)制失敗") }); } //$(".site-seo-depict").html($(".site-seo-depict").html().slice(0, -5)); </script> <link rel="stylesheet" type="text/css" href="http://systransis.cn/yun/static/js/neweditor/code/styles/tomorrow-night-eighties.css"> <script src="http://systransis.cn/yun/static/js/neweditor/code/highlight.pack.js" type="text/javascript"></script> <script src="http://systransis.cn/yun/static/js/clipboard.js"></script> <script>hljs.initHighlightingOnLoad();</script> <script> function setcode(){ var _html=''; document.querySelectorAll('pre code').forEach((block) => { var _tmptext=$.trim($(block).text()); if(_tmptext!=''){ _html=_html+_tmptext; console.log(_html); } }); } </script> <script> function payread(){ layer.open({ type: 1, title:"付費(fèi)閱讀", shadeClose: true, content: $('#payread') }); } // 舉報(bào) function jupao_tip(){ layer.open({ type: 1, title:false, shadeClose: true, content: $('#jubao') }); } $(".getcommentlist").click(function(){ var _id=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); $("#articlecommentlist"+_id).toggleClass("hide"); var flag=$("#articlecommentlist"+_id).attr("dataflag"); if(flag==1){ flag=0; }else{ flag=1; //加載評(píng)論 loadarticlecommentlist(_id,_tid); } $("#articlecommentlist"+_id).attr("dataflag",flag); }) $(".add-comment-btn").click(function(){ var _id=$(this).attr("dataid"); $(".formcomment"+_id).toggleClass("hide"); }) $(".btn-sendartcomment").click(function(){ var _aid=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); var _content=$.trim($(".commenttext"+_aid).val()); if(_content==''){ alert("評(píng)論內(nèi)容不能為空"); return false; } var touid=$("#btnsendcomment"+_aid).attr("touid"); if(touid==null){ touid=0; } addarticlecomment(_tid,_aid,_content,touid); }) $(".button_agree").click(function(){ var supportobj = $(this); var tid = $(this).attr("id"); $.ajax({ type: "GET", url:"http://systransis.cn/yun/index.php?topic/ajaxhassupport/" + tid, cache: false, success: function(hassupport){ if (hassupport != '1'){ $.ajax({ type: "GET", cache:false, url: "http://systransis.cn/yun/index.php?topic/ajaxaddsupport/" + tid, success: function(comments) { supportobj.find("span").html(comments+"人贊"); } }); }else{ alert("您已經(jīng)贊過"); } } }); }); function attenquestion(_tid,_rs){ $.ajax({ //提交數(shù)據(jù)的類型 POST GET type:"POST", //提交的網(wǎng)址 url:"http://systransis.cn/yun/favorite/topicadd.html", //提交的數(shù)據(jù) data:{tid:_tid,rs:_rs}, //返回?cái)?shù)據(jù)的格式 datatype: "json",//"xml", "html", "script", "json", "jsonp", "text". //在請(qǐng)求之前調(diào)用的函數(shù) beforeSend:function(){}, //成功返回之后調(diào)用的函數(shù) success:function(data){ var data=eval("("+data+")"); console.log(data) if(data.code==2000){ layer.msg(data.msg,function(){ if(data.rs==1){ //取消收藏 $(".layui-layer-tips").attr("data-tips","收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart-o"></i>'); } if(data.rs==0){ //收藏成功 $(".layui-layer-tips").attr("data-tips","已收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart"></i>') } }) }else{ layer.msg(data.msg) } } , //調(diào)用執(zhí)行后調(diào)用的函數(shù) complete: function(XMLHttpRequest, textStatus){ postadopt=true; }, //調(diào)用出錯(cuò)執(zhí)行的函數(shù) error: function(){ //請(qǐng)求出錯(cuò)處理 postadopt=false; } }); } </script> <footer> <div id="qoyqs8suu2u" class="layui-container"> <div id="qoyqs8suu2u" class="flex_box_zd"> <div id="qoyqs8suu2u" class="left-footer"> <h6><a href="http://systransis.cn/"><img src="http://systransis.cn/yun/static/theme/ukd//images/logo.png" alt="UCloud (優(yōu)刻得科技股份有限公司)"></a></h6> <p>UCloud (優(yōu)刻得科技股份有限公司)是中立、安全的云計(jì)算服務(wù)平臺(tái),堅(jiān)持中立,不涉足客戶業(yè)務(wù)領(lǐng)域。公司自主研發(fā)IaaS、PaaS、大數(shù)據(jù)流通平臺(tái)、AI服務(wù)平臺(tái)等一系列云計(jì)算產(chǎn)品,并深入了解互聯(lián)網(wǎng)、傳統(tǒng)企業(yè)在不同場(chǎng)景下的業(yè)務(wù)需求,提供公有云、混合云、私有云、專有云在內(nèi)的綜合性行業(yè)解決方案。</p> </div> <div id="qoyqs8suu2u" class="right-footer layui-hidemd"> <ul class="flex_box_zd"> <li> <h6>UCloud與云服務(wù)</h6> <p><a href="http://systransis.cn/site/about/intro/">公司介紹</a></p> <p><a >加入我們</a></p> <p><a href="http://systransis.cn/site/ucan/onlineclass/">UCan線上公開課</a></p> <p><a href="http://systransis.cn/site/solutions.html" >行業(yè)解決方案</a></p> <p><a href="http://systransis.cn/site/pro-notice/">產(chǎn)品動(dòng)態(tài)</a></p> </li> <li> <h6>友情鏈接</h6> <p><a >GPU算力平臺(tái)</a></p> <p><a >UCloud私有云</a></p> <p><a >SurferCloud</a></p> <p><a >工廠仿真軟件</a></p> <p><a >Pinex</a></p> <p><a >AI繪畫</a></p> </li> <li> <h6>社區(qū)欄目</h6> <p><a href="http://systransis.cn/yun/column/index.html">專欄文章</a></p> <p><a href="http://systransis.cn/yun/udata/">專題地圖</a></p> </li> <li> <h6>常見問題</h6> <p><a href="http://systransis.cn/site/ucsafe/notice.html" >安全中心</a></p> <p><a href="http://systransis.cn/site/about/news/recent/" >新聞動(dòng)態(tài)</a></p> <p><a href="http://systransis.cn/site/about/news/report/">媒體動(dòng)態(tài)</a></p> <p><a href="http://systransis.cn/site/cases.html">客戶案例</a></p> <p><a href="http://systransis.cn/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="qoyqs8suu2u" class="copyright">Copyright ? 2012-2023 UCloud 優(yōu)刻得科技股份有限公司<i>|</i><a rel="nofollow" >滬公網(wǎng)安備 31011002000058號(hào)</a><i>|</i><a rel="nofollow" ></a> 滬ICP備12020087號(hào)-3</a><i>|</i> <script type="text/javascript" src="https://gyfk12.kuaishang.cn/bs/ks.j?cI=197688&fI=125915" charset="utf-8"></script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://#/hm.js?290c2650b305fc9fff0dbdcafe48b59d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-DZSMXQ3P9N"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-DZSMXQ3P9N'); </script> <script> (function(){ var el = document.createElement("script"); el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?99f50ea166557aed914eb4a66a7a70a4709cbb98a54ecb576877d99556fb4bfc3d72cd14f8a76432df3935ab77ec54f830517b3cb210f7fd334f50ccb772134a"; el.id = "ttzz"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(el, s); })(window) </script></div> </div> </footer> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://systransis.cn/" title="成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费">成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费</a> <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="2yayc" class="pl_css_ganrao" style="display: none;"><fieldset id="2yayc"></fieldset><fieldset id="2yayc"></fieldset><nav id="2yayc"></nav><code id="2yayc"></code><object id="2yayc"><tbody id="2yayc"><button id="2yayc"></button></tbody></object><fieldset id="2yayc"></fieldset><center id="2yayc"><dl id="2yayc"><input id="2yayc"></input></dl></center><center id="2yayc"></center><delect id="2yayc"></delect><fieldset id="2yayc"></fieldset><small id="2yayc"></small><acronym id="2yayc"></acronym><button id="2yayc"></button><dl id="2yayc"></dl><rt id="2yayc"></rt><bdo id="2yayc"></bdo><optgroup id="2yayc"></optgroup><em id="2yayc"><del id="2yayc"><dfn id="2yayc"></dfn></del></em><table id="2yayc"><tr id="2yayc"><sup id="2yayc"></sup></tr></table><pre id="2yayc"></pre><nav id="2yayc"></nav><fieldset id="2yayc"></fieldset><abbr id="2yayc"></abbr><tfoot id="2yayc"><source id="2yayc"><small id="2yayc"></small></source></tfoot><input id="2yayc"><abbr id="2yayc"><button id="2yayc"></button></abbr></input><code id="2yayc"></code><strike id="2yayc"><rt id="2yayc"><code id="2yayc"></code></rt></strike><samp id="2yayc"><tfoot id="2yayc"><object id="2yayc"></object></tfoot></samp><strong id="2yayc"><button id="2yayc"><ul id="2yayc"></ul></button></strong><source id="2yayc"></source><center id="2yayc"></center><delect id="2yayc"><strike id="2yayc"><s id="2yayc"></s></strike></delect><dfn id="2yayc"><td id="2yayc"><code id="2yayc"></code></td></dfn><td id="2yayc"><code id="2yayc"><table id="2yayc"></table></code></td><pre id="2yayc"></pre><tr id="2yayc"></tr><button id="2yayc"></button><rt id="2yayc"></rt><center id="2yayc"><fieldset id="2yayc"><input id="2yayc"></input></fieldset></center><xmp id="2yayc"></xmp><optgroup id="2yayc"></optgroup><dd id="2yayc"></dd><sup id="2yayc"><td id="2yayc"><code id="2yayc"></code></td></sup><bdo id="2yayc"></bdo><option id="2yayc"><xmp id="2yayc"><strike id="2yayc"></strike></xmp></option><object id="2yayc"></object><rt id="2yayc"></rt><em id="2yayc"><xmp id="2yayc"><strike id="2yayc"></strike></xmp></em><noframes id="2yayc"><samp id="2yayc"><tbody id="2yayc"></tbody></samp></noframes><td id="2yayc"><fieldset id="2yayc"><table id="2yayc"></table></fieldset></td><table id="2yayc"></table><source id="2yayc"></source><nav id="2yayc"></nav><source id="2yayc"><small id="2yayc"><noframes id="2yayc"></noframes></small></source><noscript id="2yayc"></noscript><rt id="2yayc"></rt><rt id="2yayc"></rt><dl id="2yayc"></dl><wbr id="2yayc"><cite id="2yayc"><nav id="2yayc"></nav></cite></wbr><small id="2yayc"></small><dfn id="2yayc"></dfn><tbody id="2yayc"><pre id="2yayc"><blockquote id="2yayc"></blockquote></pre></tbody><th id="2yayc"></th><object id="2yayc"><small id="2yayc"><noframes id="2yayc"></noframes></small></object><s id="2yayc"><code id="2yayc"><em id="2yayc"></em></code></s><optgroup id="2yayc"><abbr id="2yayc"><sup id="2yayc"></sup></abbr></optgroup><bdo id="2yayc"></bdo><fieldset id="2yayc"></fieldset><sup id="2yayc"><td id="2yayc"><fieldset id="2yayc"></fieldset></td></sup><strike id="2yayc"><s id="2yayc"><bdo id="2yayc"></bdo></s></strike><kbd id="2yayc"></kbd><tbody id="2yayc"></tbody><object id="2yayc"></object><rt id="2yayc"></rt><pre id="2yayc"><blockquote id="2yayc"><tfoot id="2yayc"></tfoot></blockquote></pre><blockquote id="2yayc"></blockquote><nav id="2yayc"></nav><delect id="2yayc"><strike id="2yayc"><s id="2yayc"></s></strike></delect><input id="2yayc"><tbody id="2yayc"><button id="2yayc"></button></tbody></input><tr id="2yayc"></tr><pre id="2yayc"></pre><optgroup id="2yayc"></optgroup><nav id="2yayc"></nav><bdo id="2yayc"><em id="2yayc"><delect id="2yayc"></delect></em></bdo><ul id="2yayc"></ul><object id="2yayc"></object><button id="2yayc"></button><center id="2yayc"></center><source id="2yayc"></source><center id="2yayc"></center><tbody id="2yayc"></tbody><code id="2yayc"></code><abbr id="2yayc"><ul id="2yayc"><center id="2yayc"></center></ul></abbr><tbody id="2yayc"></tbody><center id="2yayc"><fieldset id="2yayc"><input id="2yayc"></input></fieldset></center><em id="2yayc"><xmp id="2yayc"><strike id="2yayc"></strike></xmp></em><wbr id="2yayc"><strong id="2yayc"><nav id="2yayc"></nav></strong></wbr><li id="2yayc"><acronym id="2yayc"><xmp id="2yayc"></xmp></acronym></li><input id="2yayc"><tbody id="2yayc"><pre id="2yayc"></pre></tbody></input><th id="2yayc"></th></div> <script src="http://systransis.cn/yun/static/theme/ukd/js/common.js"></script> <<script type="text/javascript"> $(".site-seo-depict *,.site-content-answer-body *,.site-body-depict *").css("max-width","100%"); </script> </html>