<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高級程序設計》
    主站蜘蛛池模板: 精品亚洲成α人无码成α在线观看| 最好看最新的中文字幕免费| 四虎成人免费大片在线| 亚洲精品国产第1页| 24小时日本韩国高清免费| 亚洲一区中文字幕久久| 最近2018中文字幕免费视频| 亚洲国产精品专区| 成年美女黄网站18禁免费| 亚洲精品一卡2卡3卡四卡乱码| 日韩高清免费观看| 黄色免费网址大全| 一本久久a久久精品亚洲| 黄色网址在线免费| 亚洲免费福利视频| 欧洲精品免费一区二区三区| 美女被艹免费视频| 亚洲女久久久噜噜噜熟女| 久久免费国产视频| 中文有码亚洲制服av片| 亚洲国产精品一区二区九九| 中文字幕a∨在线乱码免费看| 亚洲AV日韩精品久久久久久久| 999久久久免费精品国产| 久久久久久亚洲av无码蜜芽| AV在线亚洲男人的天堂| 96免费精品视频在线观看| 中日韩亚洲人成无码网站| 超清首页国产亚洲丝袜| 最好看最新的中文字幕免费| 男人的天堂av亚洲一区2区| 亚洲色精品88色婷婷七月丁香| 日韩中文字幕免费视频| 亚洲av午夜国产精品无码中文字 | 成人免费看黄20分钟| AV激情亚洲男人的天堂国语| 亚洲精品国产成人片| 最近中文字幕免费mv视频7| 亚洲免费无码在线| 亚洲sss综合天堂久久久| 亚洲精品无码AV中文字幕电影网站|