【javascript】DOM操作技術(shù)

動(dòng)態(tài)腳本

  • 使用<script>元素可以向頁(yè)面中插入JavaScript代碼,一種方式是通過(guò)其src特性包含外部文件,另一種方式就是用這個(gè)元素本身來(lái)包含代碼
  • 動(dòng)態(tài)腳本,指的是在頁(yè)面加載時(shí)不存在,但將來(lái)的某一時(shí)刻通過(guò)修改DOM 動(dòng)態(tài)添加的腳本。
  • 創(chuàng)建動(dòng)態(tài)腳本也有兩種方式:插入外部文件和直接插入JavaScript 代碼见秽。
  • 動(dòng)態(tài)加載的外部JavaScript 文件能夠立即運(yùn)行。
<script type="text/javascript" src="client.js"></script>
  • 創(chuàng)建這個(gè)節(jié)點(diǎn)的DOM 代碼
function loadScript(url){
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = url;
    document.body.appendChild(script);
}
loadScript("client.js");
  • 另一種指定JavaScript 代碼的方式是行內(nèi)方式狰住。
<script type="text/javascript">
    function sayHi(){
        alert("hi");
    }
</script>
function loadScriptString(code){
    var script = document.createElement("script");
    script.type = "text/javascript";
    try {
        script.appendChild(document.createTextNode(code));
    } catch (ex){
        //針對(duì)IE
        script.text = code;
    }
    document.body.appendChild(script);
}

loadScriptString("function sayHi(){alert('hi');}");

動(dòng)態(tài)樣式

  • 能夠把CSS 樣式包含到HTML頁(yè)面中的元素有兩個(gè)张吉。其中,<link>元素用于包含來(lái)自外部的文件催植,而<style>元素用于指定嵌入的樣式肮蛹。
  • 動(dòng)態(tài)樣式是指在頁(yè)面剛加載時(shí)不存在的樣式;動(dòng)態(tài)樣式是在頁(yè)面加載完成后動(dòng)態(tài)添加到頁(yè)面中的创南。
<link rel="stylesheet" type="text/css" href="styles.css">
  • 使用DOM 代碼可以很容易地動(dòng)態(tài)創(chuàng)建出這個(gè)元素
function loadStyles(url){
    var link = document.createElement("link");
    link.rel = "stylesheet";
    link.type = "text/css";
    link.href = url;
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(link);
}
loadStyles("styles.css");
  • 另一種定義樣式的方式是使用<style>元素來(lái)包含嵌入式CSS.
<style type="text/css">
body {
    background-color: red;
}
</style>
function loadStyleString(css){
    var style = document.createElement("style");
    style.type = "text/css";
    try{
        style.appendChild(document.createTextNode(css));
    } catch (ex){
        //針對(duì)IE
        style.styleSheet.cssText = css;
    }
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(style);
}

loadStyleString("body{background-color:red}");

操作表格

  • 為了方便構(gòu)建表格伦忠,HTML DOM為<table>、<tbody>和<tr>元素添加了一些屬性和方法稿辙。

  • 為<table>元素添加的屬性和方法如下昆码。

    • caption:保存著對(duì)<caption>元素(如果有)的指針。
    • tBodies:是一個(gè)<tbody>元素的HTMLCollection邻储。
    • tFoot:保存著對(duì)<tfoot>元素(如果有)的指針赋咽。
    • tHead:保存著對(duì)<thead>元素(如果有)的指針。
    • rows:是一個(gè)表格中所有行的HTMLCollection吨娜。
    • createTHead():創(chuàng)建<thead>元素脓匿,將其放到表格中,返回引用宦赠。
    • createTFoot():創(chuàng)建<tfoot>元素陪毡,將其放到表格中米母,返回引用。
    • createCaption():創(chuàng)建<caption>元素毡琉,將其放到表格中铁瞒,返回引用。
    • deleteTHead():刪除<thead>元素桅滋。
    • deleteTFoot():刪除<tfoot>元素慧耍。
    • deleteCaption():刪除<caption>元素。
    • deleteRow(pos):刪除指定位置的行虱歪。
    • insertRow(pos):向rows 集合中的指定位置插入一行蜂绎。
  • 為<tbody>元素添加的屬性和方法如下。

    • rows:保存著<tbody>元素中行的HTMLCollection笋鄙。
    • deleteRow(pos):刪除指定位置的行。
    • insertRow(pos):向rows 集合中的指定位置插入一行怪瓶,返回對(duì)新插入行的引用萧落。
  • 為<tr>元素添加的屬性和方法如下。

    • cells:保存著<tr>元素中單元格的HTMLCollection洗贰。
    • deleteCell(pos):刪除指定位置的單元格找岖。
    • insertCell(pos):向cells集合中的指定位置插入一個(gè)單元格,返回對(duì)新插入單元格的引用敛滋。
  • 使用DOM創(chuàng)建HTML表格

<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>
//創(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(1);
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);

使用NodeList

  • 從本質(zhì)上說(shuō)许布,所有NodeList 對(duì)象都是在訪問(wèn)DOM文檔時(shí)實(shí)時(shí)運(yùn)行的查詢。
//下列代碼會(huì)導(dǎo)致無(wú)限循環(huán)
var divs = document.getElementsByTagName("div"),
i,
div;
for (i=0; i < divs.length; i++){
    div = document.createElement("div");
    document.body.appendChild(div);
}

-要迭代一個(gè)NodeList绎晃,最好是使用length 屬性初始化第二個(gè)變量蜜唾,然后將迭代器與該變
量進(jìn)行比較。

var divs = document.getElementsByTagName("div"),
i,
len,
div;
for (i=0, len=divs.length; i < len; i++){
    div = document.createElement("div");
    document.body.appendChild(div);
}
  • 一般來(lái)說(shuō)庶艾,應(yīng)該盡量減少訪問(wèn)NodeList的次數(shù)袁余。因?yàn)槊看卧L問(wèn)NodeList,都會(huì)運(yùn)行一次基于文檔的查詢咱揍。所以颖榜,可以考慮將從NodeList 中取得的值緩存起來(lái)。

DOM小結(jié)

  • DOM是語(yǔ)言中立的API煤裙,用于訪問(wèn)和操作HTML 和XML 文檔掩完。
  • DOM1 級(jí)將HTML 和XML 文檔形象地看作一個(gè)層次化的節(jié)點(diǎn)樹(shù),可以使用JavaScript 來(lái)操作這個(gè)節(jié)點(diǎn)樹(shù)硼砰,進(jìn)而改變底層文檔的外觀和結(jié)構(gòu)且蓬。

  • DOM 由各種節(jié)點(diǎn)構(gòu)成
    • 最基本的節(jié)點(diǎn)類(lèi)型是Node,用于抽象地表示文檔中一個(gè)獨(dú)立的部分夺刑;所有其他類(lèi)型都繼承自Node缅疟。
    • Document 類(lèi)型表示整個(gè)文檔分别,是一組分層節(jié)點(diǎn)的根節(jié)點(diǎn)。在JavaScript中存淫,document 對(duì)象是Document 的一個(gè)實(shí)例耘斩。使用document 對(duì)象,有很多種方式可以查詢和取得節(jié)點(diǎn)桅咆。
    • Element 節(jié)點(diǎn)表示文檔中的所有HTML或XML元素括授,可以用來(lái)操作這些元素的內(nèi)容和特性。
    • 另外還有一些節(jié)點(diǎn)類(lèi)型岩饼,分別表示文本內(nèi)容荚虚、注釋、文檔類(lèi)型籍茧、CDATA區(qū)域和文檔片段版述。

  • 訪問(wèn)DOM 的操作在多數(shù)情況下都很直觀,不過(guò)在處理<script>和<style>元素時(shí)還是存在一些復(fù)雜性寞冯。
  • 由于這兩個(gè)元素分別包含腳本和樣式信息渴析,因此瀏覽器通常會(huì)將它們與其他元素區(qū)別對(duì)待。這些區(qū)別導(dǎo)致了在針對(duì)這些元素使用innerHTML 時(shí)吮龄,以及在創(chuàng)建新元素時(shí)的一些問(wèn)題俭茧。

  • 理解DOM的關(guān)鍵,就是理解DOM 對(duì)性能的影響漓帚。
  • DOM操作往往是JavaScript程序中開(kāi)銷(xiāo)最大的部分母债,而因訪問(wèn)NodeList導(dǎo)致的問(wèn)題為最多。
  • NodeList 對(duì)象都是“動(dòng)態(tài)的”尝抖,這就意味著每次訪問(wèn)NodeList對(duì)象毡们,都會(huì)運(yùn)行一次查詢。有鑒于此牵署,最好的辦法就是盡量減少DOM操作漏隐。
好好學(xué)習(xí)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奴迅,隨后出現(xiàn)的幾起案子青责,更是在濱河造成了極大的恐慌,老刑警劉巖取具,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖隶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡暇检,警方通過(guò)查閱死者的電腦和手機(jī)产阱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)块仆,“玉大人构蹬,你說(shuō)我怎么就攤上這事王暗。” “怎么了庄敛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵俗壹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我藻烤,道長(zhǎng)绷雏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任怖亭,我火速辦了婚禮涎显,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兴猩。我一直安慰自己期吓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布峭跳。 她就那樣靜靜地躺著膘婶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛀醉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天衅码,我揣著相機(jī)與錄音拯刁,去河邊找鬼。 笑死逝段,一個(gè)胖子當(dāng)著我的面吹牛垛玻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奶躯,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帚桩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嘹黔?” 一聲冷哼從身側(cè)響起账嚎,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎儡蔓,沒(méi)想到半個(gè)月后郭蕉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喂江,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年召锈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片获询。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涨岁,死狀恐怖拐袜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梢薪,我是刑警寧澤蹬铺,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站沮尿,受9級(jí)特大地震影響丛塌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畜疾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一赴邻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啡捶,春花似錦姥敛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至了赌,卻和暖如春墨榄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勿她。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工袄秩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逢并。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓之剧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砍聊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子背稼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Element 類(lèi)型 除了 Document 類(lèi)型之外,Element 類(lèi)型就要算是 Web 編程中最常用的類(lèi)型了...
    劼哥stone閱讀 630評(píng)論 0 3
  • 節(jié)點(diǎn)層次 DOM 可以將任何 HTML 和 XML 文檔描繪成一個(gè)由多層節(jié)點(diǎn)構(gòu)成的結(jié)構(gòu)玻蝌。節(jié)點(diǎn)分為幾種不同的類(lèi)型蟹肘,每...
    云之外閱讀 539評(píng)論 0 1
  • 本章內(nèi)容 理解包含不同層次節(jié)點(diǎn)的 DOM 使用不同的節(jié)點(diǎn)類(lèi)型 克服瀏覽器兼容性問(wèn)題及各種陷阱 DOM 是針對(duì) HT...
    悶油瓶小張閱讀 640評(píng)論 0 1
  • 我的愛(ài)情 它發(fā)生在微風(fēng)習(xí)習(xí)的公園 發(fā)生在月光皎潔的球場(chǎng) 發(fā)生在浪漫昏暗的影院 但它在半路就抱恙了 我在思考 或許這...
    可能是我留不住你閱讀 185評(píng)論 0 0
  • 話說(shuō)秋天會(huì)干燥,即便是在潮濕的南方灶伊,你還是會(huì)覺(jué)得干疆前,皮膚干,口干聘萨,空氣好像也都是干的……所以了該各種燉品甜品走起 ...
    娜娜和西瓜閱讀 249評(píng)論 0 0