【javascript】DOM操作技術

動態腳本

  • 使用<script>元素可以向頁面中插入JavaScript代碼,一種方式是通過其src特性包含外部文件,另一種方式就是用這個元素本身來包含代碼
  • 動態腳本,指的是在頁面加載時不存在,但將來的某一時刻通過修改DOM 動態添加的腳本。
  • 創建動態腳本也有兩種方式:插入外部文件和直接插入JavaScript 代碼。
  • 動態加載的外部JavaScript 文件能夠立即運行。
<script type="text/javascript" src="client.js"></script>
  • 創建這個節點的DOM 代碼
function loadScript(url){
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = url;
    document.body.appendChild(script);
}
loadScript("client.js");
  • 另一種指定JavaScript 代碼的方式是行內方式。
<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){
        //針對IE
        script.text = code;
    }
    document.body.appendChild(script);
}

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

動態樣式

  • 能夠把CSS 樣式包含到HTML頁面中的元素有兩個。其中,<link>元素用于包含來自外部的文件,而<style>元素用于指定嵌入的樣式。
  • 動態樣式是指在頁面剛加載時不存在的樣式;動態樣式是在頁面加載完成后動態添加到頁面中的。
<link rel="stylesheet" type="text/css" href="styles.css">
  • 使用DOM 代碼可以很容易地動態創建出這個元素
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>元素來包含嵌入式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){
        //針對IE
        style.styleSheet.cssText = css;
    }
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(style);
}

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

操作表格

  • 為了方便構建表格,HTML DOM為<table>、<tbody>和<tr>元素添加了一些屬性和方法。

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

    • caption:保存著對<caption>元素(如果有)的指針。
    • tBodies:是一個<tbody>元素的HTMLCollection。
    • tFoot:保存著對<tfoot>元素(如果有)的指針。
    • tHead:保存著對<thead>元素(如果有)的指針。
    • rows:是一個表格中所有行的HTMLCollection。
    • createTHead():創建<thead>元素,將其放到表格中,返回引用。
    • createTFoot():創建<tfoot>元素,將其放到表格中,返回引用。
    • createCaption():創建<caption>元素,將其放到表格中,返回引用。
    • deleteTHead():刪除<thead>元素。
    • deleteTFoot():刪除<tfoot>元素。
    • deleteCaption():刪除<caption>元素。
    • deleteRow(pos):刪除指定位置的行。
    • insertRow(pos):向rows 集合中的指定位置插入一行。
  • 為<tbody>元素添加的屬性和方法如下。

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

    • cells:保存著<tr>元素中單元格的HTMLCollection。
    • deleteCell(pos):刪除指定位置的單元格。
    • insertCell(pos):向cells集合中的指定位置插入一個單元格,返回對新插入單元格的引用。
  • 使用DOM創建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>
//創建table
var table = document.createElement("table");
table.border = 1;
table.width = "100%";

//創建tbody
var tbody = document.createElement("tbody");
table.appendChild(tbody);

//創建第一行
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"));

//創建第二行
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

  • 從本質上說,所有NodeList 對象都是在訪問DOM文檔時實時運行的查詢。
//下列代碼會導致無限循環
var divs = document.getElementsByTagName("div"),
i,
div;
for (i=0; i < divs.length; i++){
    div = document.createElement("div");
    document.body.appendChild(div);
}

-要迭代一個NodeList,最好是使用length 屬性初始化第二個變量,然后將迭代器與該變
量進行比較。

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);
}
  • 一般來說,應該盡量減少訪問NodeList的次數。因為每次訪問NodeList,都會運行一次基于文檔的查詢。所以,可以考慮將從NodeList 中取得的值緩存起來。

DOM小結

  • DOM是語言中立的API,用于訪問和操作HTML 和XML 文檔。
  • DOM1 級將HTML 和XML 文檔形象地看作一個層次化的節點樹,可以使用JavaScript 來操作這個節點樹,進而改變底層文檔的外觀和結構。

  • DOM 由各種節點構成
    • 最基本的節點類型是Node,用于抽象地表示文檔中一個獨立的部分;所有其他類型都繼承自Node。
    • Document 類型表示整個文檔,是一組分層節點的根節點。在JavaScript中,document 對象是Document 的一個實例。使用document 對象,有很多種方式可以查詢和取得節點。
    • Element 節點表示文檔中的所有HTML或XML元素,可以用來操作這些元素的內容和特性。
    • 另外還有一些節點類型,分別表示文本內容、注釋、文檔類型、CDATA區域和文檔片段。

  • 訪問DOM 的操作在多數情況下都很直觀,不過在處理<script>和<style>元素時還是存在一些復雜性。
  • 由于這兩個元素分別包含腳本和樣式信息,因此瀏覽器通常會將它們與其他元素區別對待。這些區別導致了在針對這些元素使用innerHTML 時,以及在創建新元素時的一些問題。

  • 理解DOM的關鍵,就是理解DOM 對性能的影響。
  • DOM操作往往是JavaScript程序中開銷最大的部分,而因訪問NodeList導致的問題為最多。
  • NodeList 對象都是“動態的”,這就意味著每次訪問NodeList對象,都會運行一次查詢。有鑒于此,最好的辦法就是盡量減少DOM操作。
好好學習
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容