<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數(shù)據(jù)加載中……

    使用JavaScript和DOM動態(tài)創(chuàng)建表格

      第一次翻譯技術文章,本身英語水平很爛,翻譯的也是自己剛開始學習的技術,所以能勉強看懂英文的話都要盡量讀 原文 而不要看我的翻譯,免得被誤導。閱讀原文

    簡介
      這篇文章簡單介紹了DOM 1.0一些基本而強大的方法以及如何在JavaScript中使用它們。你可以學到如何動態(tài)地創(chuàng)建、獲取、控制和刪除HTML元素。這些DOM方法同樣適用于XML。所有全面支持DOM 1.0的瀏覽器都能很好地運行本篇的實例,比如IE5,F(xiàn)irefox等。
    概況 - Sample1.html
      這篇文章通過實例代碼介紹DOM。請從嘗試下面的HTML例子開始。它使用DOM 1的方法由JavaScript動態(tài)創(chuàng)建一個HTML表格。它創(chuàng)建一個由四個包含文本內容的單元格組成的小表格。單元格的文字內容是:“單元格是第y行第x列”,表示單元格在表格中的行數(shù)和列數(shù)。
    <html>
    <head>
    <title>實例代碼 - 使用JavaScript和DOM創(chuàng)建HTML表格</title>
    <script>
    functionstart(){
    //獲取body標簽
    varmybody = document.getElementsByTagName("body")[0];
    ?
    // 創(chuàng)建一個<table>元素和一個<tbody>元素
    mytable? ? ?= document.createElement("table");
    mytablebody = document.createElement("tbody");
    ?
    //創(chuàng)建所有的單元格
    for(varj = 0; j < 2; j++){
    ?? ?
    // 創(chuàng)建一個<tr>元素
    ?? ?
    mycurrent_row = document.createElement("tr");
    ?? ?
    for(vari = 0; i < 2; i++){
    ?? ?
    // 創(chuàng)建一個<td>元素
    ?? ?
    mycurrent_cell = document.createElement("td");
    ?? ?
    //創(chuàng)建一個文本節(jié)點
    ?? ?
    currenttext = document.createTextNode("單元格是第"+j+"行,第"+i+"");
    ?? ?
    // 將創(chuàng)建的文本節(jié)點添加到<td>里
    ?? ?
    mycurrent_cell.appendChild(currenttext);
    ?? ?
    // 將列<td>添加到行<tr>
    ?? ?
    mycurrent_row.appendChild(mycurrent_cell);
    ?? ?
    }
    ?? ?
    // 將行<tr>添加到<tbody>
    ?? ?
    mytablebody.appendChild(mycurrent_row);
    }
    // 將<tbody>添加到<table>
    mytable.appendChild(mytablebody);
    //將<table>添加到<body>
    mybody.appendChild(mytable);
    // 將表格mytable的border屬性設置為2
    mytable.setAttribute("border", "2");
    }
    </script>
    </head>
    <bodyonload="start()">
    </body>
    </html>

    注意我們創(chuàng)建各元素和文字節(jié)點的順序:

    1.創(chuàng)建< table >元素
    2.創(chuàng)建< table >的子元素< tbody >
    3.使用一個循環(huán)來創(chuàng)建< tbody >的子元素< tr >
    4.分別使用循環(huán)為每一個< tr >創(chuàng)建子元素< tb >
    5.為每一個< tb >創(chuàng)建文本節(jié)點

      創(chuàng)建完< table >,< tbody >,< tr >,< td >元素和文本節(jié)點,我們使用相反的順序把它們分別添加到自己的父節(jié)點。
    1.將創(chuàng)建的文本節(jié)點添加到< td >里

    mycurrent_cell.appendChild(currenttext);

    2.將列< td >添加到行< tr >

    mycurrent_row.appendChild(mycurrent_cell);

    3.將行< tr >添加到< tbody >

    mytablebody.appendChild(mycurrent_row);

    4.將< tbody >添加到< table >

    mytable.appendChild(mytablebody);

    5.將< table >添加到< body >

    mybody.appendChild(mytable);

    記住這個方法。當你使用W3C DOM時會經(jīng)常用到它。首先,你從上向下建立元素;然后從下向上把它們添加到父節(jié)點。
    這是JavaScript代碼生成的HTML:

    ...
    <tableborder=5>
    <tr><td>單元格是第0行,第0列</td><td>單元格是第0行,第1列</td></tr>
    <tr><td>單元格是第1行,第0列</td><td>單元格是第1行,第1列</td></tr>
    </table>
    ...

    這是代碼生成的表格元素和它的子元素的DOM對象樹:
    sample1-tabledom.jpg
      你只需使用少量的DOM方法就可以構造這樣一個表格和他的子元素。記住要時刻謹記你將創(chuàng)建的構造的模型樹;這樣會使編寫代碼更加簡單。在圖中的< table >樹里,< table >有一個子元素< tbody >。< tbody >有兩個子元素。< tbody >的每個子元素(< tr >)都有兩個子元素< td >。最后,每個< td >有一個子元素:一個文本節(jié)點。  

    基本的DOM方法 - Sample2.html
      getElementByTagName方法適用于文檔和元素,所以文檔根對象和所有的元素對象一樣有 getElementByTagName 方法。你可以使用 element.getElementsByTagName(tagname) 來獲取某個元素所有子元素的列表,使用標簽名選擇它們。
      element.getElementsByTagName 返回一個有特定標簽名的子元素的列表。你可以通過調用一個item方法(傳遞一個index參數(shù)給它)來從這個子元素列表中獲取一個元素。請注意列表第一個子元素的index為0。下一個主題繼續(xù)前面的Table例子。下面這個實例更加簡單,顯示了一些基本的方法:
    <html>
    ?
    <head>
    ?
    <title>實例代碼 - 使用JavaScript和DOM創(chuàng)建HTML表格</title>
    ?
    <script>
    functionstart(){
    ?
    // 獲取一個包含所有body元素的列表(將只有一個)
    ?
    // 然后選擇列表里的第一個元素
    ?
    myBody = document.getElementsByTagName("body")[0];
    ?
    ?
    // 獲取body字元素中所有的p元素
    ?
    myBodyElements = myBody.getElementsByTagName("p");
    ?
    ?
    //獲取p元素列表的第二個元素(索引從0開始)
    ?
    myP = myBodyElements[1];
    }
    </script>
    ?
    </head>
    ?
    <bodyonload="start()">
    ?
    <p>hi</p>
    ?
    <p>hello</p>
    ?
    </body>
    </html>

    在這個例子里,我們設置myP變量為表示body里第二個p元素的DOM對象。
    1.獲取一個包含所有body元素的列表

    myBody = document.getElementsByTagName("body")[0];

    因為一個有效的html文檔只有一個body元素,這個列表講只有一項。我們通過使用 [0] 選取列表的第一個元素來得到它。
    2.獲取blog子元素里所有的p元素

    myBodyElements = myBody.getElementsByTagName("p");

    3.選取p元素列表的第二項

    myP = myBodyElements[1];

    sample2a2.jpg
    一旦獲得一個html元素的DOM對象,你就可以設置它的屬性。比如,你想設置style background color屬性,只需要添加:

    myP.style.background = "rgb(255,0,0)";

    使用document.createTextNode(”..”)創(chuàng)建文本節(jié)點
    使用文檔對象調用createTextNode方法建立你的文本節(jié)點。你只需要輸入文本內容。返回值是一個表示這個文本節(jié)點的對象。

    myTextNode = document.createTextNode("world");

    以上代碼創(chuàng)建一個文本數(shù)據(jù)是“word”的TEXT_NODE類型(文字塊)節(jié)點,變量myTextNode指向這個節(jié)點對象。你需要設置這個文本節(jié)點為其他節(jié)點元素的字節(jié)點來插入這個文本到你的html頁面里。
    使用appendChild(..)插入元素
    所以,通過調用myP.appendChild([node_element]),你設置這個文本節(jié)點為第二個p元素的字節(jié)點。

    myP.appendChild(myTextNode);

    測試這個例子,注意“hello”和“world”兩個詞是連在一起的:“helloworld”。所以在當你看到html頁面時兩個文本節(jié)點hello和world看起來好像是一個節(jié)點,而實際上在這個文檔模型里有兩個節(jié)點。第二個節(jié)點是一個新的TEXT_NODE類型節(jié)點,并且是第二個p標簽的第二個字節(jié)點。下圖在文檔樹里顯示了剛創(chuàng)建的文本節(jié)點。
    sample2b2.jpg

    createTextNode和appendChild是在hello和world之間添加空格的一種簡單的方法。需要特別注意的是appendChild方法將添加在最后一個子節(jié)點后面,就像world被添加到hello后面。所以如果你想在hello和world之間添加一個文本節(jié)點需要使用insertBefore方法而不是appendChild。

    使用文檔對象和createElement(..)方法創(chuàng)建新元素
      你可以使用createElement方法創(chuàng)建新的HTML元素或者其他任何你想要的其他元素。例如,如果你想為< body >元素添加一個字節(jié)點< p >元素,可以使用前例中的myBody添加一個新的元素節(jié)點。創(chuàng)建一個節(jié)點只需要調用document.createElement(”tagname”)。例如:

    myNewPTAGnode = document.createElement("p");
    myBody.appendChild(myNewPTAGnode);

    sample2c.jpg
    使用removeChild(..)方法刪除節(jié)點
      每個節(jié)點都可以刪除。下面這行代碼刪除myP(第二個< p >元素)里包含單詞world的文本節(jié)點。

    myP.removeChild(myTextNode);

      最后你可以把包含單詞world的文本節(jié)點myTextNode添加到新創(chuàng)建的< p >元素里:

    myNewPTAGnode.appendChild(myTextNode);

      修正的對象樹最后像這樣:
    sample2d.jpg

    動態(tài)創(chuàng)建一個表格(回到Sample1.html)
      文章的剩余部分將回到Sample1.html。下圖顯示了例子中創(chuàng)建的表格的對象樹結構。
    回顧HTML表格結構
    sample1-tabledom.jpg
    創(chuàng)建元素節(jié)點并把它們添加到文檔樹
    創(chuàng)建sample1.html里的表格的基本步驟:
    • 獲取body對象(文檔對象的第一項)
    • 創(chuàng)建所有的元素
    • 最后,按照上圖的表格結構添加每一個字節(jié)點下面的源代碼是sample1.html的注釋

    start函數(shù)的最后有一行新代碼,使用另一個DOM方法setAttribute設置了表格的border屬性。setAttribute方法有兩個參數(shù):屬性名和屬性值。你可以使用setAttribute方法設置任何元素的任何屬性。

    <head>
    <title>實例代碼 - 使用JavaScript和DOM創(chuàng)建HTML表格</title>
    <script>
    functionstart(){
    // 獲取body
    varmybody = document.getElementsByTagName("body")[0];
    ?
    // 創(chuàng)建<table>和<tbody>元素
    mytable? ? ?= document.createElement("table");
    mytablebody = document.createElement("tbody");
    ?
    //創(chuàng)建所有的單元格
    for(varj = 0; j < 2; j++){
    ?? ?
    // 創(chuàng)建一個 <tr> 元素
    ?? ?
    mycurrent_row = document.createElement("tr");
    ?
    ?? ?
    for(vari = 0; i < 2; i++){
    ?? ?
    // 創(chuàng)建一個<td> 元素
    ?? ?
    mycurrent_cell = document.createElement("td");
    ?? ?
    // 創(chuàng)建一個文本節(jié)點
    ?? ?
    currenttext = document.createTextNode("單元格是第" + j + "行,第" + i + "");
    ?? ?
    // 把創(chuàng)建的文本節(jié)點添加到<td>元素
    ?? ?
    mycurrent_cell.appendChild(currenttext);
    ?? ?
    // 把<td>添加到<tr>行
    ?? ?
    mycurrent_row.appendChild(mycurrent_cell);
    ?? ?
    }
    ?? ?
    // 把<tr>行添加到<tbody>
    ?? ?
    mytablebody.appendChild(mycurrent_row);
    }
    ?
    // 把 <tbody> 添加到 <table>
    mytable.appendChild(mytablebody);
    // 把 <table> 添加到 <body>
    mybody.appendChild(mytable);
    // 把mytable的border屬性設置為2;
    mytable.setAttribute("border","2");
    }
    </script>
    </head>
    <bodyonload="start()">
    </body>
    </html>

    使用DOM和CSS處理表格
    從表格中獲取一個文本節(jié)點
      這個例子介紹兩個新的DOM屬性。首先使用childNodes屬性獲取mycel的字節(jié)點列表。這個childNodes列表包含所有的字節(jié)點,不管它們的名稱和類型是什么。像getElementsByTagName方法一樣,它返回一個字節(jié)點列表,使用 [ x ] 來獲取想要的字節(jié)點項。這個例子將myceltext存儲為表格第二行第二個單元格的文本節(jié)點。最后,它創(chuàng)建一個新的包含myceltext 的data 屬性 的文本節(jié)點,并使它成為< body >元素的子節(jié)點,來顯示這個例子的最后結果。

    如果你的對象是文本節(jié)點,你可以使用data屬性來獲取它的內容

    mybody? ? ? = document.getElementsByTagName("body")[0];
    mytable? ? ?= mybody.getElementsByTagName("table")[0];
    mytablebody = mytable.getElementsByTagName("tbody")[0];
    myrow? ? ? ?= mytablebody.getElementsByTagName("tr")[1];
    mycel? ? ? ?= myrow.getElementsByTagName("td")[1];
    ?
    // mycel的字節(jié)點列表的第一項
    myceltext=mycel.childNodes[0];
    ?
    // currenttext的內容是myceltext的data
    currenttext=document.createTextNode(myceltext.data);
    mybody.appendChild(currenttext);

    獲取一個屬性值
      在sample1的最后有一個單元格使用了mytable對象的setAttribute方法。這個單元格用來設置這個表格的border屬性。使用getAttribute方法來獲取這個屬性:

    mytable.getAttribute("border");

    通過改變style屬性隱藏列
      當你使用一個JavaScript變量指向對象,你可以立即設置它的style屬性。下面的代碼是sample1.html的修改,第二列的單元格都被隱藏,第一列的單元格背景改為紅色。注意style屬性是直接設置的。

    <html>
    <bodyonload="start()">
    </body>
    <script>
    functionstart(){
    varmybody =document.getElementsByTagName("body")[0];
    mytable? ? ?= document.createElement("table");
    mytablebody = document.createElement("tbody");
    ?
    for(varj = 0; j < 2; j++){
    ??
    mycurrent_row=document.createElement("tr");
    ??
    for(vari = 0; i < 2; i++){
    ?? ? ?
    mycurrent_cell = document.createElement("td");
    ?? ? ?
    currenttext = document.createTextNode("單元格是:" + i + j);
    ?? ? ?
    mycurrent_cell.appendChild(currenttext);
    ?? ? ?
    mycurrent_row.appendChild(mycurrent_cell);
    ?? ? ?
    // 如果在第0列設置單元格背景色
    ?? ? ?
    // 如果在第1列隱藏單元格
    ?? ? ?
    if(i == 0){
    ?? ? ?
    mycurrent_cell.style.background = "rgb(255,0,0)";
    ?? ? ?
    }else{
    ?? ? ?
    mycurrent_cell.style.display = "none";
    ?? ? ?
    }
    ??
    }
    ??
    mytablebody.appendChild(mycurrent_row);
    }
    mytable.appendChild(mytablebody);
    mybody.appendChild(mytable);
    }
    </script>
    </html>

    from: http://eidiot.net/?p=256

    posted on 2006-11-19 10:37 weidagang2046 閱讀(370) 評論(0)  編輯  收藏 所屬分類: Javascript

    主站蜘蛛池模板: 亚洲国产aⅴ综合网| 亚洲欧洲日韩在线电影| 日本一区二区免费看| 亚洲精品在线免费看| 日韩一区二区三区免费体验| 午夜在线免费视频 | 亚洲av丰满熟妇在线播放| 222www免费视频| 精品亚洲成a人在线观看| 亚洲AV永久无码精品成人| 成年人免费视频观看| 成在线人视频免费视频| 国产v亚洲v天堂a无| 亚洲最大av无码网址| 无码国产精品一区二区免费| 日韩电影免费在线观看网址| 亚洲欧洲在线观看| 又大又粗又爽a级毛片免费看| 在线人成精品免费视频| 成年大片免费高清在线看黄| 亚洲精品无码久久久久久久| 成人亚洲网站www在线观看| 日韩在线播放全免费| 久久免费视频一区| 亚洲Av永久无码精品黑人| 亚洲AV无码成人专区片在线观看| 好爽…又高潮了毛片免费看| 一级毛片在线免费观看| 免费看一级高潮毛片| 久久精品国产亚洲αv忘忧草| 亚洲AV无码精品色午夜在线观看| 亚洲?v女人的天堂在线观看| 黄页网站免费观看| 男人都懂www深夜免费网站| 日韩a毛片免费观看| 亚洲精品乱码久久久久久V| 亚洲天堂电影在线观看| 亚洲国产a∨无码中文777 | 亚洲男人的天堂久久精品 | 91国内免费在线视频| 春暖花开亚洲性无区一区二区 |