<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 閱讀(16772) 評論(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高級程序設計》
    主站蜘蛛池模板: 亚洲国产精品成人久久 | 亚洲爆乳无码一区二区三区| 一级特黄aa毛片免费观看| 亚洲av无码电影网| 亚洲AV网站在线观看| 在线播放免费人成毛片乱码| 亚洲国产精品久久久久秋霞影院 | 色欲国产麻豆一精品一AV一免费| 亚洲国产日产无码精品| 国产aa免费视频| 午夜爽爽爽男女免费观看影院| 亚洲一线产品二线产品| 日本亚洲国产一区二区三区| 99热在线精品免费全部my| 一级A毛片免费观看久久精品| 亚洲精彩视频在线观看| 亚洲中文字幕视频国产| 两性刺激生活片免费视频| 久久九九久精品国产免费直播| 亚洲一区在线视频| 亚洲精品无码久久千人斩| 免费看www视频| **实干一级毛片aa免费| 一级免费黄色大片| 亚洲欧洲无码AV不卡在线| 国产AV无码专区亚洲A∨毛片| 国产成人精品免费视频大全五级| 95免费观看体验区视频| 成人片黄网站色大片免费观看cn| 亚洲AV无码无限在线观看不卡| 亚洲gv白嫩小受在线观看| 在线a亚洲v天堂网2018| 免费看片A级毛片免费看| 亚洲视频在线免费看| 两个人看的www免费视频| 美女视频免费看一区二区| 亚洲免费视频播放| 亚洲无线电影官网| 久久亚洲精品视频| 成人午夜亚洲精品无码网站| 又粗又硬又黄又爽的免费视频|