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

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

定義:頁面加載時(shí)不存在攒菠,但將來的某一時(shí)刻通過修改DOM動(dòng)態(tài)添加的腳本。
創(chuàng)建動(dòng)態(tài)腳本有兩種方法:

  • 插入外部文件
  • 直接插入JavaScript代碼

插入外部文件

var script = document.createElement("script");
script.type = "text/javascipt";
script.src = "client.js";
document.body.appendChild(script);

可以將整個(gè)過程用函數(shù)封裝:

function loadScript(url){
    var script = document.createElement("script");
    script.type = "text/javascipt";
    script.src = url;
    document.body.appendChild(script);
}
//然后就可以通過調(diào)用這個(gè)函數(shù)來夾在外部的JavaScript文件了
loadScript("client.js");

直接插入JavaScript代碼

用行內(nèi)方式指定JavaScript代碼。

script type="application/javascript">
    function sayHi() {
        alert("hi");
    }
</script>

用下面的方式創(chuàng)建JavaScript代碼從邏輯上來講是有效的拭卿,但是在IE中會(huì)導(dǎo)致錯(cuò)誤(Firefox、Safari、chrome和Opera會(huì)正常運(yùn)行)猿挚。IE將<script>視為一個(gè)特殊的元素,不允許DOM訪問其子節(jié)點(diǎn)驶鹉。

var script = document.createElement("script");
script.type = "text/javascipt";
script.appendChild(document.createTextNode("function sayHi(){alert('hi');}"));
document.body.appendChild(script);

解決在IE上的錯(cuò)誤的辦法:
使用<script>元素的text屬性來指定JavaScript代碼绩蜻。

var script = document.createElement("script");
script.type = "text/javascipt";
script.text = "function sayHi(){alert('hi');}";
document.body.appendChild(script);

以這種方式夾在的代碼會(huì)在全局作用域中執(zhí)行,而且當(dāng)腳本執(zhí)行后立即可用室埋。
封裝后:

function loadScriptString(code){
    var script = document.createElement("script");
    script.type = "text/javascipt";
    try{
        script.appendChild(document.createTextNode(code));
    }catch(ex){
        script.text = "function sayHi(){alert('hi');}";
    }
    document.body.appendChild(script);
}

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

定義:指在頁面剛加載時(shí)不存在的樣式辜羊。
動(dòng)態(tài)樣式是在頁面加載完成后動(dòng)態(tài)添加到頁面中的。

插入外部樣式

必須將<link>元素添加到<head>而不是<body>元素词顾,才能保證在所有瀏覽器中的行為一直八秃。

var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "styles.css";
var head = document.getElementsByTagName("head")[0];
head.appendChild(link);

封裝函數(shù):

function loadStyles(url){
    var link = document.createElement("link");
    link.rel = "stylesheet";
    link.type = url;
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(link);
}

加載外部樣式文件的過程是異步的,也就是加載樣式與執(zhí)行JavaScript代碼的過程沒有固定的次序肉盹。

直接插入JavaScript代碼

var style = document.createElement("link");
style.rel = "stylesheet";
style.appendChild(document.createTextNode("body{background-color:red}"));
var head = document.getElementsByTagName("head")[0];
head.appendChild(style);

上面的代碼與<script>的錯(cuò)誤類似昔驱,也是在IE中會(huì)報(bào)錯(cuò)。
解決IE中這個(gè)問題的辦法上忍,就是訪問元素的stylesheet屬性骤肛,該屬性又有一個(gè)cssText屬性纳本,可以接受CSS代碼。

var style = document.createElement("link");
style.rel = "stylesheet";
try{
    style.appendChild(document.createTextNode("body{background-color:red}"));
}catch (ex){
    style.stylesheet.cssText = "body{background-color:red}";
}
var head = document.getElementsByTagName("head")[0];
head.appendChild(style);

封裝后:

function loadStyleString(css){
    var style = document.createElement("link");
    style.rel = "stylesheet";
    try{
        style.appendChild(document.createTextNode(css));
    }catch (ex){
        style.stylesheet.cssText = css;
    }
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(style);
}

操作表格

屬性 描述
caption 保存著對<caption>(如果有)的指針腋颠。
tBodies 是一個(gè)<tbody>元素的HTMLCollection
tHead 保存著對<thead>(如果有)的指針繁成。
tFoot 保存著對<tfoot>(如果有)的指針。
rows 是一個(gè)表格中所有行的HTMLCollection淑玫。

為了方便構(gòu)建表格巾腕,HTML DOM為<table>、<tbodt>和<tr>元素添加了一些屬性和方法絮蒿。
為<table>添加的屬性如下:

屬性 描述
caption 保存著對<caption>(如果有)的指針尊搬。
tBodies 是一個(gè)<tbody>元素的HTMLCollection
tHead 保存著對<thead>(如果有)的指針。
tFoot 保存著對<tfoot>(如果有)的指針土涝。
rows 是一個(gè)表格中所有行的HTMLCollection佛寿。
方法 描述
createCaption() 創(chuàng)建<caption>元素,將其放到表格中但壮,返回引用冀泻。
createTHead() 創(chuàng)建<tHead>元素,將其放到表格中蜡饵,返回引用腔长。
createTFoot() 創(chuàng)建<tFootd>元素,將其放到表格中验残,返回引用捞附。
inserstRow(pos) 向rows集合中的指定位置插入一行。
deleteCaption() 刪除<caption>元素您没。
deleteTHead() 刪除<tHead>元素鸟召。
deleteTFoot() 刪除<tFootd>元素。
deleteRow(pos) 刪除指定位置的行氨鹏。

為<table>添加的方法如下:

方法 描述
createCaption() 創(chuàng)建<caption>元素欧募,將其放到表格中,返回引用仆抵。
createTHead() 創(chuàng)建<tHead>元素跟继,將其放到表格中,返回引用镣丑。
createTFoot() 創(chuàng)建<tFootd>元素舔糖,將其放到表格中,返回引用莺匠。
inserstRow(pos) 向rows集合中的指定位置插入一行金吗。
deleteCaption() 刪除<caption>元素。
deleteTHead() 刪除<tHead>元素。
deleteTFoot() 刪除<tFootd>元素摇庙。
deleteRow(pos) 刪除指定位置的行旱物。
屬性/方法 描述
rows 保存著<tbody>元素中行的HTMLCollection。
inserstRow(pos) 向rows集合中的指定位置插入一行卫袒,返回對新插入行的引用宵呛。
deleteRow(pos) 刪除指定位置的行。

為<tbody>添加的屬性和方法如下:

屬性/方法 描述
rows 保存著<tbody>元素中行的HTMLCollection夕凝。
inserstRow(pos) 向rows集合中的指定位置插入一行宝穗,返回對新插入行的引用。
deleteRow(pos) 刪除指定位置的行迹冤。
屬性/方法 描述
cells 保存著<tr>元素中單元格的HTMLCollection讽营。
inserstCell(pos) 向cells集合中的指定位置插入一個(gè)單元格虎忌,返回對新插入單元格的引用泡徙。
deleteCell(pos) 刪除指定位置的單元格。

為<tr>添加的屬性和方法如下:

屬性/方法 描述
cells 保存著<tr>元素中單元格的HTMLCollection膜蠢。
inserstCell(pos) 向cells集合中的指定位置插入一個(gè)單元格堪藐,返回對新插入單元格的引用。
deleteCell(pos) 刪除指定位置的單元格挑围。
<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>

用DOM方法創(chuàng)建一個(gè)上面的表格:

//創(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

三個(gè)“動(dòng)態(tài)的”集合:NodeList礁竞、NamedNodeMapHTMLCollection杉辙。
每當(dāng)文檔結(jié)構(gòu)發(fā)生變化時(shí)模捂,它們都會(huì)得到更新。因此蜘矢,它們始終保持著最新狂男、最準(zhǔn)確的信息。

本質(zhì)上說品腹,所有NodeList對象都是在訪問DOM文檔時(shí)實(shí)時(shí)運(yùn)行的查詢岖食。

下面代碼會(huì)導(dǎo)致無限循環(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);
}

應(yīng)盡量減少訪問NodeList的次數(shù)。因?yàn)槊看卧L問NodeList羡鸥,都會(huì)運(yùn)行一次基于文檔的查詢蔑穴。所以可以考慮將從NodeList中取得的值緩存起來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惧浴,一起剝皮案震驚了整個(gè)濱河市澎剥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖哑姚,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祭饭,死亡現(xiàn)場離奇詭異,居然都是意外死亡叙量,警方通過查閱死者的電腦和手機(jī)倡蝙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绞佩,“玉大人寺鸥,你說我怎么就攤上這事∑飞剑” “怎么了胆建?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肘交。 經(jīng)常有香客問我笆载,道長,這世上最難降的妖魔是什么涯呻? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任凉驻,我火速辦了婚禮,結(jié)果婚禮上复罐,老公的妹妹穿的比我還像新娘涝登。我一直安慰自己,他們只是感情好效诅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布胀滚。 她就那樣靜靜地躺著,像睡著了一般乱投。 火紅的嫁衣襯著肌膚如雪咽笼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天篡腌,我揣著相機(jī)與錄音褐荷,去河邊找鬼。 笑死嘹悼,一個(gè)胖子當(dāng)著我的面吹牛叛甫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杨伙,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼其监,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了限匣?” 一聲冷哼從身側(cè)響起抖苦,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锌历,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贮庞,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年究西,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窗慎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卤材,死狀恐怖遮斥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扇丛,我是刑警寧澤术吗,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站帆精,受9級特大地震影響较屿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜实幕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一吝镣、第九天 我趴在偏房一處隱蔽的房頂上張望堤器。 院中可真熱鬧昆庇,春花似錦、人聲如沸闸溃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辉川。三九已至表蝙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乓旗,已是汗流浹背府蛇。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屿愚,地道東北人汇跨。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像妆距,于是被迫代替她去往敵國和親穷遂。 傳聞我的和親對象是個(gè)殘疾皇子侣监,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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