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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    javascript之DOM技術(一)

    Posted on 2007-02-06 11:38 dennis 閱讀(16773) 評論(0)  編輯  收藏 所屬分類: web開發
    ?首先需要理解的一點是,DOM是針對XML的基于樹的API,它的實現有很多(各語言基本都有自己的實現),我們討論的是javascript中或者說xhtml(html)對DOM的實現。

    一、使用DOM
    考慮一個html文件:
    <html>
    <head><title>測試</title></head>
    <body>
    <p>測試</p>
    </body>
    </html>

    1.訪問節點:
    訪問html元素:var oHtml=document.documentElement;
    獲取head元素:var oHead=oHtml.firstChild;
    獲取body元素:var oBody=oHtml.lastChild; 或者 var oBody=document.body;

    也可以通過childNodes來做同樣的工作:
    var oHead=oHtml.childNodes[0] 或者 oHtml.childNodes.item(0);
    var oBody=oHtml.childNodes[1] 或者 oHtml.childNodes.item(1);

    判斷節點間關系:
    alert(oHead.parentNode==oHtml);??
    alert(oBody.previousSibling
    ==oHead);
    alert(oHead.nextSibling
    ==oBody);
    alert(oHead.ownerDocument
    ==document);

    2.檢測節點類型:
    通過節點的nodeType屬性來檢驗節點類型:
    alert(document.nodeType);? //輸出9
    需要注意的是,DOM兼容的瀏覽器(以FF2.0為例),擁有Node.DOCUMENT_NODE、Node.ELEMENT_NODE等常量。各常量名稱與數值對照表如下:
    ELEMENT_NODE???????????????????????????????? 1
    ATTRIBUTE_NODE????????????????????????????
    2
    TEXT_NODE????????????????????????????????????????
    3
    CDATA_SECTION_NODE????????????????
    4
    ENTITY_REFERENCE_NODE????????????
    5
    ENTITY_NODE????????????????????????????????????
    6
    PROCESSING_INSTRCTION_NODE???????
    7
    COMMENT_NODE???????????????????????????? ?
    8
    DOCUMENT_NODE???????????????????????????
    9
    DOCUMENT_TYPE_NODE???????????????
    10
    DOCUMENT_FRAGMENT_NODE???
    11
    NOTATION_NODE?????????????????????????????
    12

    IE6不支持,不過你可以自定義一個JS對象Node。

    3.處理特性
    處理特性可以使用標準的NameNodeMap中的方法:
    getNamedItem(name) removeNamedItem(name)? setNamedItem(node)??? item(pos)

    比如:<p id="test">測試</p>
    假設變量oP是上面的p節點的引用,我們要訪問oP的id屬性:
    var sId=oP.attributes.getNamedItem("id").nodeValue;

    這些方法用起來很累贅,所以DOM又定義了三個方法來簡化:
    getAttribute(name)???????? ——返回名稱為name的屬性的值
    setAttribute(name,value) ? ——顧名思義
    removeAttribute(name) ? ?? ——顧名思義?

    上面的例子可以改寫為:
    var sId=oP.getAttribute("name");

    4.訪問指定節點:
    熟知的getElementByTagName(name),getElementByName(name),getElementById(id)三個方法,不再展開。

    5.創建和操作節點:
    (1)創建新節點,一張IE(6.0)和FF對DOM Level1的創建新節點方法支持的對照表:
    方法?????????????????????????????????????????????????????????? ????IE????????????????????? ?? ??????FF
    createAttribute(name)?????????????????????????????? ??Y???????????????????????????? ???Y
    createCDATASection(text)?????????????????????? ?N?????????????????????????? ?????Y
    createComment(text)???????????????????????????????? ?? Y????????????????????????????????Y
    createDocumentFragment()????????????????????? ??Y????????????????????????????????Y
    createElement(tagName)??????????????????????????? ?Y?????????????????????????????????Y
    createEntityReference(name)??????????????????? ?N?????????????????????????????????Y
    createProcessingInstruction(
    target,data)???????????????????????????????????????????????? ? N??????????????????????????????????Y
    createTextNode(text)?????????????????????????????? ? ?Y???????????????????????????????????Y


    下面介紹常用的幾個方法

    (2)createElement(),createTextNode(),appendChild()
    例子:
    <html>
    ????
    <head>
    ????????
    <title>createElement()?Example</title>
    ????????
    <script?type="text/javascript">
    ????????????
    function?createMessage()?{
    ????????????????
    var?oP?=?document.createElement("p");
    ????????????????
    var?oText?=?document.createTextNode("Hello?World!");
    ????????????????oP.appendChild(oText);
    ????????????????document.body.appendChild(oP);
    ????????????}

    ????????
    </script>
    ????
    </head>
    ????
    <body?onload="createMessage()">
    ????
    </body>
    </html>

    在頁面載入后,創建節點oP,并創建一個文本節點oText,oText通過appendChild方法附加在oP節點上,為了實際顯示出來,將oP節點通過appendChild方法附加在body節點上。此例子將顯示Hello World!

    (3)removeChild(),replaceChild()和insertBefore()
    從方法名稱就知道是干什么的:刪除節點,替換節點,插入節點。需要注意的是replaceChild和insertBefore兩個參數都是新節點在前,舊節點在后。

    (4)createDocumentFragment()
    此方法主要是為了解決大量添加節點時,速度過慢。通過創建一個文檔碎片節點,將要添加的新節點附加在此碎片節點上,然后再將文檔碎片節點append到body上面,替代多次append到body節點。
    例子:
    <html>
    ????
    <head>
    ????????
    <title>insertBefore()?Example</title>
    ????????
    <script?type="text/javascript">
    ????????????
    function?addMessages()?{
    ????????????????
    var?arrText?=?["first",?"second",?"third",?"fourth",?"fifth",?"sixth",?"seventh",?"eighth",?"ninth",?"tenth"];
    ????????????????
    ????????????????
    var?oFragment?=?document.createDocumentFragment();
    ????????????????
    ????????????????
    for?(var?i=0;?i?<?arrText.length;?i++)?{
    ????????????????????
    var?oP?=?document.createElement("p");
    ????????????????????
    var?oText?=?document.createTextNode(arrText[i]);
    ????????????????????oP.appendChild(oText);
    ????????????????????oFragment.appendChild(oP);
    ????????????????}

    ????????????????
    ????????????????document.body.appendChild(oFragment);

    ????????????}

    ????????
    </script>
    ????
    </head>
    ????
    <body?onload="addMessages()">

    ????
    </body>
    </html>


    二、HTML DOM的特征功能

    HTML DOM的特性和方法不是標準的DOM實現,是專門針對HTML同時也讓一些DOM操作變的更加簡便。

    1.讓特性像屬性一樣
    訪問某元素的特性需要用到getAttribute(name)方法,HTML DOM擴展,可以直接使用同樣名稱的屬性來獲取和設置這些值:
    比如? <img src="test.jpg"/>
    假設oImg是此元素的引用
    (oImg.getAttribute("src")可以直接寫成:oImg.src,設置值簡化為:
    oImg.src="test2.gif";
    唯一特殊的class屬性,因為class是ECMAScript的保留字,所以替代的屬性名是className.

    2.table的系列方法:
    為了簡化創建表格,HTML DOM提供了一系列的表格方法,常用幾個:
    cells? ——返回</tr>元素中的所有單元格
    rows?? ——表格中所有行的集合
    insertRow(position) ——在rows集合中指定位置插入新行
    deleteRow(position) ——與insertRow相反
    insertCell(position) ——在cells集合的指定位置插入一個新的單元格
    deleteCell(position) ——與insertCell相反

    三。遍歷DOM
    DOM的遍歷是DOM Level2中提出的標準,IE6沒有實現,Mozilla和Safari已經實現,最新IE7不清楚是否實現。不再展開,具體請見《JavaScript高級程序設計》
    主站蜘蛛池模板: 大学生一级毛片免费看| 久热中文字幕在线精品免费| 国产禁女女网站免费看| 久久久久se色偷偷亚洲精品av | 亚洲最大的成人网| 18禁止观看免费私人影院| 亚洲日本在线看片| 久久国产精品成人片免费| 亚洲欧洲日韩国产综合在线二区| 国产在线观a免费观看| 永久亚洲成a人片777777| 国产做国产爱免费视频| 亚洲欧洲自拍拍偷精品 美利坚| 一级特黄aaa大片免费看| 中文字幕亚洲综合久久菠萝蜜 | 国产精品日本亚洲777| 免费乱理伦在线播放| 免费一级做a爰片久久毛片潮| 亚洲黄黄黄网站在线观看| 国产成人无码精品久久久免费| 亚洲国产午夜福利在线播放| a毛片视频免费观看影院| 久久久久久久久亚洲| 亚洲啪啪免费视频| 亚洲色一区二区三区四区| 国产午夜无码视频免费网站| caoporn国产精品免费| 亚洲人成电影亚洲人成9999网| 久视频精品免费观看99| 亚洲av无码一区二区三区四区| 亚洲精品第一国产综合精品99| 国产精品免费福利久久| 色婷五月综激情亚洲综合| 亚洲成AⅤ人影院在线观看| 色欲色香天天天综合网站免费| 亚洲综合色婷婷在线观看| 2048亚洲精品国产| 免费精品国产自产拍在| 特级毛片aaaa级毛片免费| 久久久久亚洲精品成人网小说| 国产免费av片在线看|