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

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

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

    posts - 297,  comments - 1618,  trackbacks - 0
      說(shuō)明:本文為《JavaScript高級(jí)程序設(shè)計(jì)》第10章學(xué)習(xí)筆記。

     可以應(yīng)用不同方式來(lái)處理文檔底層的DOM樹,首先,可利用現(xiàn)行瀏覽器中的非標(biāo)準(zhǔn)的屬性和方法,以及鮮為人知且有待進(jìn)一步利用的DOM的標(biāo)準(zhǔn)接口。

    一.樣式編程

     IE4.0為每一個(gè)頁(yè)面上的元素都引入了一個(gè)style對(duì)象來(lái)管理元素的CSS樣式。DOM最后也采用這個(gè)方式,并將其作為訪問(wèn)元素的樣式信息的標(biāo)準(zhǔn)手段。

     下面的表格列出了一些常用的CSS特性及它們對(duì)應(yīng)的JavaScript中的style對(duì)象的表示:

    CSS樣式特性

    JavaScript樣式屬性

    background-color

    style.backgroundColor

    color

    style.color

    font

    style.font

    font-family

    style.fontFamily

    font-weight

    style.fontWeight

     要用JavaScript來(lái)更改樣式的值,只需將CSS的字符串分配給它們的樣式對(duì)象的特性就行,eg. var oDiv = document.getElementById(“div1”);

       oDiv.style.border = “1px solid black”;

     也可以使用style對(duì)象來(lái)獲取任何內(nèi)聯(lián)樣式(直接通過(guò)HTMLstyle特性來(lái)分配的樣式)的值。Eg. 有如下的div

     <div id=”div1” style=”background-color: red; height: 50px; width:50px”></div>

     獲取該divstyle中的background-color的代碼如下:

     var oDiv = document.getElementById(“div1”);

     alert(oDiv.style.backgroundColor);

     同樣的技巧也可應(yīng)用于用戶將鼠標(biāo)移動(dòng)到頁(yè)面上指定元素的翻轉(zhuǎn)效果,eg.

     <div id=”div1”

            style=”background-color: red; height: 50px; width: 50px”

            onmouseover=”this.style.backgroundColor=’blue’”

            onmouseout=”this.style.backgroundColor=’red’”/>

    1.       DOM樣式的方法

    DOM描述了一些樣式對(duì)的方法,以達(dá)到與單獨(dú)的CSS樣式的定義部分進(jìn)行交互的目的:

        getPropertyValue(propertyName)——返回CSS特性propertyName的字符串值;

        getPropertyPriority()——如果在規(guī)則中指定CSS特性“important”,則返回“important”,否則返回空字符串;

        item(index)——返回在給定索引index處的CSS特性的名稱;

        removeProperty(propertyName)——從CSS定義中刪除propertyName

        setProperty(propertyName, value, priority)——按照指定的優(yōu)先級(jí)來(lái)設(shè)置CSS特性propertyNamevalue值。

    讓我們來(lái)看一個(gè)例子,若div如下:

    <div id=”div1” style=”background-color: red; height: 50px; width: 50px”></div>

    讓我們來(lái)測(cè)試下前面的某幾個(gè)方法,js代碼如下:

    var oDiv = document.getElementById(“div1”);

    alert(oDiv.style.item(0)); //outputs “background-color”

    alert(oDiv.style.getPropertyValue(“background-color”));

    oDiv.removeProperty(“background-color”);

    我們可用style方法重寫上面提到過(guò)的翻轉(zhuǎn)方法:

    <div id=”div1”

            style=”background-color: red; height: 50px; width: 50px”

            onmouseover=”this.style.setProperty(‘background-color’, ‘blue’, ‘’)”

     onmouseout=” this.style.setProperty(‘background-color’, ‘red, ‘’)”/>

    2. 自定義鼠標(biāo)提示

    鼠標(biāo)提示:就是把鼠標(biāo)移動(dòng)到圖片按鈕上時(shí),出現(xiàn)的幫助性黃色方框。

    Eg. <a href=”http://www.bogjava.net/amigoxie” title=”阿蜜果的blog”>阿蜜果</a>

    上述例子是只有文本的鼠標(biāo)提示,我們還可以自定義鼠標(biāo)提示,例如當(dāng)鼠標(biāo)移動(dòng)到指定目標(biāo)上時(shí),顯示隱藏的<div>,實(shí)例代碼如下:

    <html>

           <head>

                  <title>Style例子</title>

                  <script type="text/javascript">

                         function showTip(oEvent) {

                                var oDiv = document.getElementById("divTip1");

                                oDiv.style.visibility = "visible";

                                oDiv.style.left = oEvent.clientX + 5;

                                oDiv.style.top = oEvent.clientY + 5;

    }

     

    function hideTip(oEvent) {

                                var oDiv = document.getElementById("divTip1");

                                oDiv.style.visibility = "hidden";

    }

                         </script>

                  </head>

                  <body>

                         <p>將鼠標(biāo)移動(dòng)到紅色方框中</p>

                         <div id="div1"

                                style="background-color: red; height: 50px; width:50px"

                                onmouseover="showTip(event) " onmouseout="hideTip(event) "></div>

                         <div id="divTip1"

                                style="background-color: yellow; position: absolute; visibility: hidden; padding: 5px">

                                <span style="font-weight: bold">自定義鼠標(biāo)提示</span>

                         </div>

                  </body>

           </html>

    3.  可折疊區(qū)域

    可折疊區(qū)域的基本思想:可通過(guò)點(diǎn)擊某個(gè)地方來(lái)顯示或隱藏屏幕中的某個(gè)區(qū)域。讓我們來(lái)看一個(gè)相關(guān)的例子:

    <html>

           <head>

                  <title>可折疊區(qū)域的例子</title>

                  <script type="text/javascript">

                         function toggle(sDivId) {

                                var oDiv = document.getElementById(sDivId);

                                oDiv.style.display = (oDiv.style.display == "none") ? "block" : "none";

                         }

                  </script>

            </head>

            <body>

                  <div style="background-color: blue; color: white; font-weight: bold; padding: 10px; cursor: pointer" onclick="toggle('divContent1')">控制內(nèi)容

     

    1的顯示和隱藏</div>

                  <div style="border: 3px solid blue; height: 100px; padding: 10px" id="divContent1">內(nèi)容1</div>

                  <p>&nbsp;</p>

                  <div style="background-color: blue; color: white; font-weight: bold; padding: 10px; cursor: pointer" onclick="toggle('divContent2')">控制內(nèi)容

     

    2的顯示和隱藏</div>

                 <div style="border: 3px solid blue; height: 100px; padding: 10px" id="divContent2">內(nèi)容2</div>

           </body>

    </html>

     本例中的兩個(gè)可折疊區(qū)域分別用來(lái)顯示和隱藏例子中iddivContent1divContent2的兩個(gè)div

    4.訪問(wèn)樣式表

     使用style對(duì)象可以方便地獲取某個(gè)有style特性的元素的CSS樣式。但它無(wú)法表示由CSS規(guī)則或在style特性外部定義的類定義的元素的CSS樣式。例如下述例子中警告框?qū)⒋虿怀霰尘吧强兆址?/span>

    <html>

           <head>

                  <title>樣式的例子</title>

                  <style type="text/css">

                         div.special {

                                background-color: red;

                                height: 10px;

                                width: 10px;

                                margin: 10px;

                         }

                  </style>

                  <script type="text/javascript">

                         function getBackgroundColor() {

                                var oDiv = document.getElementById("div1");

                                alert(oDiv.style.backgroundColor);

                         }

                  </script>

            </head>

            <body>

                  <div id="div1" class="special"></div>

                  <input type="button" value="獲取背景色" onclick="getBackgroundColor()" />

           </body>

    </html>

    原因在于上述例子的CSS數(shù)據(jù)并非存儲(chǔ)在style屬性中,而是存儲(chǔ)在類中,此種情況下可用如下方式引用:

    document.styleSheets集合來(lái)獲取定義類的樣式表的引用。只需修改getBackgroundColor()內(nèi)容修改成如下內(nèi)容:

    var oCSSRules = document.styleSheets[0].cssRules || document.styleSheets[0].rules;

    alert(oCSSRules[0].style.backgroundColor);

    如果3個(gè)元素都引用了special樣式,當(dāng)在運(yùn)行過(guò)程中只想修改其中一個(gè)的背景色時(shí),不可用如下方法:

    function changeBackgroundColor() {

    var oCSSRules = document.styleSheets[0].cssRules || document.styleSheets[0].rules;

    oCSSRules[0].style.backgroundColor = “blue”;

    }

    此種方法將導(dǎo)致三者的div的背景色都被改變,可修改該方法的內(nèi)容如下:

    var oDiv = document.getElementById(“div1”);

    oDiv.style.backgroundColor = “blue”;

    5. 最終樣式

    最終樣式由所有從內(nèi)聯(lián)樣式和CSS規(guī)則計(jì)算得來(lái)的樣式信息組成。用來(lái)告訴我們?cè)刈詈笫侨绾物@示在屏幕上的。

    1) IE中的最終樣式

    微軟為每個(gè)元素提供一個(gè)currentStyle對(duì)象,它包含了所有元素的style對(duì)象的特性和任何未被覆蓋的CSS規(guī)則的style特性。下面來(lái)看一個(gè)例子:

    將訪問(wèn)樣式表中的alert(oDiv.style.backgroundColor);

    修改為:alert(oDiv.currentStyle.backgroundColor);

    2) DOM中的最終樣式

    DOM提供一個(gè)getComputedStyle()方法,它根據(jù)給定的元素創(chuàng)建類似style的對(duì)象。只有某些瀏覽器支持該功能,不推薦使用。

    二.innerTextinnerHTML

      innerText:用來(lái)修改起始標(biāo)簽和結(jié)束標(biāo)簽的文本。Eg. oDiv.innerText = “內(nèi)容”;

     應(yīng)用innerHTML特性,可以直接給元素分配HTML字符串,而不需要考慮使用DOM方法來(lái)創(chuàng)建元素。Eg.

     oDiv.innerHTML = “<strong>Hello,阿蜜果</strong><em>阿蜜果</em>”;

     還可以用innerTextinnerHTML來(lái)獲取元素的內(nèi)容。如果innerTextinnerHTML返回相同的值。但是,如果同時(shí)包含文本和其他元素,innerText將只返回文本的表示,而innerHTML將返回所有元素和文本的HTML代碼。

     通過(guò)將innerText復(fù)制給它自身,表示從指定的元素中刪除所有的HTML標(biāo)簽。Eg.

     oDiv.innerText = oDiv.innerText;

     雖然innerTextinnerHTML并非DOM標(biāo)準(zhǔn)的一部分,但事實(shí)上現(xiàn)在大部分的瀏覽器,包括IEOperaSafari,都支持innerTextinnerHTML,而Mozilla,僅支持innerHTML

    三. outerTextouterHTML

     IE4.0引入,它們與innerTextinnerHTML類似,只不過(guò)它們替換的是整個(gè)目標(biāo)節(jié)點(diǎn)。

    四.             范圍

     范圍可以用來(lái)選擇文檔的某個(gè)部分,而不管節(jié)點(diǎn)的邊界。

    1. DOM中的范圍

    DOM Level2定義了方法createRange()來(lái)創(chuàng)建范圍。在DOM兼容的瀏覽器中的,這個(gè)發(fā)方法屬于document對(duì)象,所以可以這樣創(chuàng)建一個(gè)范圍:

    var oRange = document.createRange();

    要判斷文檔是否支持DOM風(fēng)格的DOM風(fēng)格的范圍,可以使用hasFeature()方法:

    var supportDOMRanges = document.implementation.hasFeature(“Range”, “2.0”);

    1) DOM范圍中的簡(jiǎn)單選區(qū)

    選擇使用范圍的文檔的某部分的最簡(jiǎn)單的方法是用selectNode()selectNodeContents()。這些方法只接受一個(gè)參數(shù)(DOM節(jié)點(diǎn)),然后它們用節(jié)點(diǎn)中的信息來(lái)填充范圍。

    其中,selectNode()方法將選擇整個(gè)節(jié)點(diǎn),包括它的子節(jié)點(diǎn),而selectNodeContents()則選擇節(jié)點(diǎn)所有的子節(jié)點(diǎn)。

    創(chuàng)建范圍時(shí),會(huì)分配給它一些特性:

        startContainer——范圍是從哪個(gè)節(jié)點(diǎn)中開始的;

        startOffset——在startContainer中范圍開始的偏移位置;

        endContainer——范圍是從哪個(gè)節(jié)點(diǎn)結(jié)束的;

        endOffset——在endContainer中范圍結(jié)束的偏移位置;

        commonAncestorContainer——startContainerendContainer都處于哪個(gè)最小的節(jié)點(diǎn)。

    當(dāng)使用selectNode()時(shí),startContainerendContainercommonAncestorContainer均等同于傳入的節(jié)點(diǎn)的父節(jié)點(diǎn);startOffset等同于給定節(jié)點(diǎn)在父節(jié)點(diǎn)的childNodes集合中的索引,而endOffset等同于startOffset1

    當(dāng)使用selectNodeContents()時(shí),startContainerendContainercommonAncestorContainer等同于傳入的節(jié)點(diǎn),startOffset等于0endOffset等于子節(jié)點(diǎn)的數(shù)量(node.childNode.length.

    2) DOM范圍中的復(fù)雜選區(qū)

    創(chuàng)建復(fù)雜選區(qū)需要使用復(fù)雜范圍的setStart()setEnd()方法。這兩個(gè)方法均接受兩個(gè)參數(shù):節(jié)點(diǎn)的引用和偏移量。對(duì)于setStart(),引用的節(jié)點(diǎn)是startContainer,偏移量是startOffset;對(duì)于setEnd(),引用的節(jié)點(diǎn)是endContainer,而偏移量是endOffset

    3) DOM范圍對(duì)象的內(nèi)容進(jìn)行交互

    當(dāng)創(chuàng)建對(duì)象時(shí),內(nèi)部將創(chuàng)建文檔碎片節(jié)點(diǎn),在選區(qū)中的所有節(jié)點(diǎn)都被附加其。然而,在附加之前,范圍對(duì)象必須保證所選的內(nèi)容的故事是正確的。

    deleteContents():從文檔中將范圍內(nèi)的內(nèi)容全部刪除;

    extracdtContents():從文檔中刪除選區(qū)范圍,并將范圍內(nèi)的文檔碎片作為函數(shù)返回值返回。

    4)插入DOM范圍的內(nèi)容

    innerNode()方法用來(lái)在選區(qū)的開頭插入節(jié)點(diǎn)。除了可以將內(nèi)容插入范圍,還可用surroundContents()方法插入包圍范圍的內(nèi)容。這個(gè)方法接受一個(gè)參數(shù)(要包圍范圍的內(nèi)容的節(jié)點(diǎn))。在后臺(tái)會(huì)執(zhí)行以下幾步:

        抽取出范圍中的內(nèi)容;

        將給定節(jié)點(diǎn)插入到原來(lái)范圍所在的位置;

        將文檔碎片的內(nèi)容添加到給定節(jié)點(diǎn)中。

    這類功能在網(wǎng)頁(yè)上也很有用,可以用來(lái)突出顯示頁(yè)面上的特定單詞,如下:

    var oP1 = document.getElementById("p1");

    var oHello = oP1.firstChild.firstChild;

    var oWorld = op1.lastChild;

    var oRange = document.createRange();

     

    var oSpan = document.createElement("span");

    oSpan.style.backgroundColor = "yellow";

    oRange.setStart(oHello, 2);

    oRange.setEnd(oWorld, 3);

    oRange.surroundContents(oSpan);

    前面的代碼用黃色的背景突出顯示范圍選區(qū)。

    5) 折疊DOM范圍

      折疊范圍類似文本框的一種行為。當(dāng)文本框中有文字時(shí),可以用鼠標(biāo)突出全部文字。但是,只要再點(diǎn)擊一下鼠標(biāo)左鍵,選區(qū)就消失了,光標(biāo)將停留在兩個(gè)字母之間。

     可以用collapse()方法來(lái)折疊范圍,這個(gè)方法接受一個(gè)參數(shù):用于表示是折疊到范圍的那一端的Boolean值。如果參數(shù)是true,范圍就折疊到開頭;如果是false,范圍就折疊到末尾。要判斷范圍是否已被折疊,可以用collapsed特性:

     oRange.collapse(true); //折疊到開始點(diǎn)

     alert(oRange.collapsed); //輸出true

    6)比較DOM范圍

     使用compareBoundaryPoints()方法來(lái)判斷范圍是否具有相同的邊界(開頭或者結(jié)尾)。這個(gè)方法接受兩個(gè)參數(shù):要進(jìn)行比較的范圍及如何進(jìn)行比較,后者是個(gè)常量值:

        START_START(0)——比較兩個(gè)范圍的起點(diǎn);

        START_TO_END(1)——比較低一個(gè)范圍的起點(diǎn)和第二個(gè)范圍的終點(diǎn);

        END_TO_END(2)——比較兩個(gè)范圍的終點(diǎn);

        END_TO_START(3)——比較第一個(gè)范圍的終點(diǎn)和第二個(gè)范圍的起點(diǎn)。

    如果第一個(gè)范圍的被測(cè)點(diǎn)在第二個(gè)范圍的被測(cè)點(diǎn)之前,返回-1

    如果兩被測(cè)點(diǎn)相同,返回0

    如果第一個(gè)范圍的被測(cè)點(diǎn)在第二個(gè)范圍的被測(cè)點(diǎn)之后,返回1

    7)復(fù)制DOM的范圍

     通過(guò)cloneRange()方法來(lái)創(chuàng)建范圍的副本。它可以創(chuàng)建與被調(diào)用的范圍對(duì)象完全一致的副本:

     var oNewRange = oRange.cloneRange();

     新的范圍包含的所有特性與原范圍的特性均相同,并且能夠絲毫不會(huì)影響原范圍地修改它。

    8)清理

     當(dāng)使用完范圍后,最好用detach()方法釋放系統(tǒng)資源。這不是必需的,因?yàn)椴辉俦灰玫姆秶詈罂偸潜焕占髑謇淼簟?br>

    2. IE中的范圍

    IE中的范圍稱為文本范圍,它們主要用來(lái)處理文本。要?jiǎng)?chuàng)建范圍,要調(diào)用<body/><button/><input/>或者<textarea/>元素上的createTextRange()方法:

    var oRange = document.body.createTextRange();

    用這個(gè)范圍創(chuàng)建的范圍可以在頁(yè)面上的任何位置上使用。

    1) IE范圍中的簡(jiǎn)單選區(qū)

    選擇頁(yè)面的某個(gè)區(qū)域的最簡(jiǎn)單的方法是用范圍的findText()方法,這個(gè)方法可找到文本字符串的第一個(gè)實(shí)例并用范圍包含它,

    eg. <p id=”p1”><b>Hello</b>阿蜜果</p>

         var oRange = document.body.createTextRange();

         var bFound = oRange.findText(“Hello”);

       代碼執(zhí)行后,文本Hello就被包含在范圍之內(nèi)。可用范圍的text特性來(lái)檢測(cè)它,或者也可以檢測(cè)findText()的返回值,如果是true,表示找到文本:

     alert(bFound);

     alert(oRange.text);

     要在文檔中移動(dòng)范圍,可用findText()方法的第二個(gè)參數(shù),這是個(gè)表示繼續(xù)搜索的方向的數(shù)字;負(fù)數(shù)表示向回查找,正數(shù)表示搜索繼續(xù)往前。所以,要找到文檔中Hello的前兩個(gè)實(shí)例,可以用這段代碼:

     var oFound = oRange.findText(“Hello”);

     var bFoundAgain = oRange.findText(“Hello”, 1);

     DOMselectNode()方法最相近的是IEmoveToElementText()方法,它可接受DOM元素作為參數(shù),并選取元素的所有文本,如下:

     var oRange = document.body.createTextRange();

     var oP1 = document.getElementById(“p1”);

     oRange. moveToElementText(oP1);

     要測(cè)試上述代碼是否正常,可使用:

     alert(oRange.htmlText);

    2) IE范圍中的復(fù)雜選區(qū)

    略。

    posted on 2007-08-18 16:05 阿蜜果 閱讀(2879) 評(píng)論(2)  編輯  收藏 所屬分類: Javascript


    FeedBack:
    # re: JavaScript學(xué)習(xí)筆記——高級(jí)DOM技術(shù)
    2007-08-18 22:19 |
    感覺DOM最大的問(wèn)題是標(biāo)準(zhǔn)的統(tǒng)一  回復(fù)  更多評(píng)論
      
    # re: JavaScript學(xué)習(xí)筆記——高級(jí)DOM技術(shù)
    2014-12-04 17:16 | myname
    @窮
    是的。ie這么垃圾。。。  回復(fù)  更多評(píng)論
      
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

          生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來(lái)如此。
          我的作品:
          玩轉(zhuǎn)Axure RP  (2015年12月出版)
          

          Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊(cè)

    關(guān)注blog

    積分與排名

    • 積分 - 2295092
    • 排名 - 3

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 国产一区在线观看免费| 免费看的一级毛片| 91成人免费在线视频| 成年在线观看网站免费| 麻豆成人精品国产免费| 亚洲А∨精品天堂在线| 国产亚洲人成网站在线观看不卡| 亚洲免费在线视频| 亚洲熟女综合一区二区三区| 香港一级毛片免费看| 免费福利电影在线观看| 噼里啪啦电影在线观看免费高清| 免费在线观看日韩| 亚洲va久久久噜噜噜久久狠狠| 亚洲欧洲精品一区二区三区| 亚洲高清国产拍精品熟女| 热久久这里是精品6免费观看| 猫咪免费人成网站在线观看| 免费一级毛片在线观看| 亚洲va久久久噜噜噜久久天堂| 亚洲校园春色另类激情| 一级毛片免费在线| 国产一卡二卡四卡免费| 免费在线观看黄色毛片| 亚洲国产精品lv| 亚洲av无码专区在线电影| 国产拍拍拍无码视频免费| 大香人蕉免费视频75| 亚洲精品成人片在线观看精品字幕| 亚洲成A人片在线播放器| 国产精品99爱免费视频| 大学生一级毛片免费看| 国产AV无码专区亚洲AWWW| 亚洲av永久无码精品天堂久久| 特级aa**毛片免费观看| 黄色网址免费大全| 亚洲人成网站在线观看播放| 亚洲欧洲专线一区| 午夜理伦剧场免费| 全黄性性激高免费视频| 亚洲国产精品线观看不卡|