最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript DOM 學(xué)習(xí)第九章 選取范圍的介紹

 更新時間:2010年02月19日 13:59:54   作者:  
這一章會對范圍對象做一些介紹。使用這個對象你能選取HTML文檔中的任何部分然后根據(jù)選取信息作一些事情。最常見的范圍對象是由用戶選擇的。

雖然我們會講解用程序創(chuàng)建范圍對象,但是我們把精力主要集中在如何將用戶的選取范圍轉(zhuǎn)換成為W3C 范圍或者微軟的文檔范圍對象。

 

什么是范圍

范圍是指HTML文檔中的任意一部分內(nèi)容。一個范圍的開始和結(jié)束點都可以是隨意的,甚至是相同的(一個空范圍)。最常見的范圍就是用戶選取的文本。當(dāng)用戶在頁面上選取了一部分,你就可以他的選取部分轉(zhuǎn)換為范圍對象。然而,你也可以讓程序自動選擇范圍。

讓我們以下面的代碼為例。假設(shè)用戶選擇了下面的文字:

<h4 id="entry1196"><a

class="external">Call for a Blogger's Code of Conduct</a></h4>

<p>Tim O'Reilly calls for a Blogger Code of Conduct. His proposals are:</p>

<ol>
<li>Take responsibility not just for your own words, but for the
comments you allow on your blog.</li>
<li>Label your tolerance level for abusive comments.</li>
<li>Consider eliminating anonymous comments.</li>
</ol>

你可以將用戶選擇轉(zhuǎn)換為一個包含用戶選擇范圍的文本的范圍對象(后面講)。根據(jù)范圍對象,你能找到開始和結(jié)束的范圍點。如果你愿意你可以刪除它拷貝它或者用其他文本代替,甚至用HTML代碼來代替。

這是范圍對象最簡單的例子了,因為他只包含文本。下面我們來看一個復(fù)雜的例子:

<h4 id="entry1196"><a

class="external">Call for a Blogger's Code of Conduct</a></h4>

<p>Tim O'Reilly calls for a Blogger Code of Conduct. His proposals are:</p>

<ol>
<li>Take responsibility not just for your own words, but for the
comments you allow on your blog.</li>
<li>Label
your tolerance level for abusive comments.</li>
<li>Consider eliminating anonymous comments.</li>
</ol>

另外一個范圍對象被創(chuàng)建了,而且還包含HTML。問題在于用戶的選擇范圍跨越了幾個元素。去掉其他的內(nèi)容,就剩下:

calls for a Blogger Code of Conduct. His proposals are:</p>

<ol>
<li>Take responsibility not just for your own words, but for the
comments you allow on your blog.</li>
<li>Label your toleran

這是一段不完整的HTML。幸好所有的瀏覽器都會轉(zhuǎn)化一下:

<p>calls for a Blogger Code of Conduct. His proposals are:</p>

<ol>
<li>Take responsibility not just for your own words, but for the
comments you allow on your blog.</li>
<li>Label your toleran</li></ol>

正如你所看到的,瀏覽器會添加最少的元素讓這段HTML完整,如果你復(fù)制的話,那么這些添加的東西也會被復(fù)制。

 

瀏覽器兼容性一覽

在我們繼續(xù)之前,有必要看看瀏覽器的兼容性。主要問題在于這里有不下3個范圍對象的類型,你必須都有所了解才行。

Module

Explorer 6/7

Firefox 2 Safari 1.3 Opera 9
W3C Range no yes yes yes
Mozilla Selection no yes incomplete yes
Microsoft Text Range yes no no incomplete

 

 

訪問用戶選區(qū)

要處理用戶的選擇就必須先訪問到用戶的選區(qū)。這會立馬又一個代碼分支:IE使用微軟的方法,其他瀏覽器使用Mozilla的方法:

復(fù)制代碼 代碼如下:

var userSelection;
if (window.getSelection) {
    userSelection = window.getSelection();
}
else if (document.selection) { // should come last; Opera!
    userSelection = document.selection.createRange();
}

在Mozilla,Safari,Opera里面現(xiàn)在userSelection是一個選擇對象(selection object),在IE中是一個文本范圍對象(text range object)。這個區(qū)別在后面的代碼中依然有效:IE的文本范圍對象和W3C的范圍對象以及Mozilla的選擇對象有根本的不同,每一部分的代碼都需要另一部分的補(bǔ)充。

要注意分支的順序:Mozilla Selection一定要在前。因為Opera兩種都支持,如果你用window.getSelection()讀取用戶的選區(qū),Opera就會創(chuàng)建一個選擇對象,可是你用document.selection的時候他也會創(chuàng)建一個文本范圍對象。

雖然Opera支持Mozilla和W3C模式很不錯,但是支持IE確是有毛病,這樣就不得不把window.getSelection放在前面檢測。

userSelection的內(nèi)容
現(xiàn)在userSelection既是一個Mozilla的選擇對象又是IE的文本范圍對象。這樣他就可以使用所有的方法和屬性了。

然后,Mozilla的選擇對象userSelection里面保存的用戶選擇的文本(而不是HTML)。這樣寫:

復(fù)制代碼 代碼如下:
alert(userSelection)

就會產(chǎn)生:

calls for a Blogger Code of Conduct. His proposals are: Take responsibilitynot just for your own words, but for the comments you allow on your blog.Label your toleran如果想在微軟的文本范圍對象中得到相同的內(nèi)容你就要使用:

var selectedText = userSelection;if (userSelection.text)    selectedText = userSelection.text;現(xiàn)在selectedText就包含了用戶選擇的文本。如果你覺得這樣的信息足夠的話,那么就開始準(zhǔn)備后面的工作吧。

從選擇對象創(chuàng)建范圍對象
很多時候,你想處理的是代表用戶選擇范圍的范圍對象(range object)。在微軟模式中條件已經(jīng)具備:userSelection就是一個文本范圍。在兼容W3C的瀏覽器中userSelection依然只是一個選擇對象,是時候創(chuàng)建一個與選擇對象內(nèi)容相同的范圍對象了。

按照下面這樣:
復(fù)制代碼 代碼如下:

var rangeObject = getRangeObject(userSelection);
function getRangeObject(selectionObject) {
    if (selectionObject.getRangeAt)
        return selectionObject.getRangeAt(0);
    else { // Safari!
        var range = document.createRange();
        range.setStart(selectionObject.anchorNode,selectionObject.anchorOffset);
        range.setEnd(selectionObject.focusNode,selectionObject.focusOffset);
        return range;
    }
}

理想情況下,我們通過選擇對象的getRangeAt()來訪問W3C范圍對象。這個方法會在給定的位置返回一個范圍對象:就像平常一樣第一個范圍對象的編號是0。(getRangeAt()已經(jīng)設(shè)計好如果有多處選擇的情況下怎么辦。在那種情況下你的代碼也很簡單)

自從創(chuàng)建一個范圍

不幸的是Safari1.3不支持getRangeAt()。因此我們需要創(chuàng)建一個跟用戶選擇一樣的范圍對象。這是一個很好的練習(xí)機(jī)會,可以讓你知道如何創(chuàng)建自己的范圍對象。

很明顯的從創(chuàng)建一個對象開始:

var range = document.createRange();

現(xiàn)在我們已經(jīng)有了一個空對象。為了把他插入到文檔里面去我們需要使用setStart()函數(shù)和setEnd()函數(shù)。

這兩個方法需要兩個參數(shù):

1、在哪個DOM節(jié)點上開始或者結(jié)束的?

2、從哪個文本偏移上開始或者結(jié)束的?文本偏移就是指范圍對象的第一個或者最后一個字符的位置。

讓我們再來看一遍第二個例子:

	
class="external">Call for a Blogger's Code of Conduct</a></h4>

<p>Tim O'Reilly calls for a Blogger Code of Conduct. His proposals are:</p>

<ol>
<li>Take responsibility not just for your own words, but for the
comments you allow on your blog.</li>
<li>Label
your tolerance level for abusive comments.</li>
<li>Consider eliminating anonymous comments.</li>
</ol>

范圍從<p>節(jié)點開始,并且文字偏移量是13,因為第14個字符已經(jīng)是包含在范圍里面的了(和通常一樣,編號從0開始的)。

范圍從<li>結(jié)束,偏移量是17,因為第18個字符時范圍內(nèi)的最后一個字符了。

如何創(chuàng)建這個范圍對象:

復(fù)制代碼 代碼如下:

var startPar = [the p node];
var endLi = [the second li node];
range.setStart(startPar,13);
range.setEnd(endLi,17);

(注意現(xiàn)在創(chuàng)建的范圍對用戶不可見,只在瀏覽器的內(nèi)部)

現(xiàn)在我們已經(jīng)創(chuàng)建了一個范圍,我們也可以讀出他的開始和結(jié)束點。startContainer和startOffset決定了范圍的開始位置,同樣的endContainer和endOffset決定了結(jié)束位置。

讀取選區(qū)的開始和結(jié)束位置
不幸的是,你并不知道用戶選擇了頁面哪個部分。所以你需要先讀出用戶選擇的開始和結(jié)束的位置:這個必須在選擇對象(selection object)里面完成,因為這時候還沒有范圍對象(range object)。

我們剛剛看到每一個范圍對象都有標(biāo)明他開始和結(jié)束位置的四個屬性。選擇對象也有相似的。當(dāng)然是另外的名字:anchorNode/anchorOffset代表開始位置,focusNode/focusOffset代表結(jié)束位置。

所以讀出了選擇對象的開始和結(jié)束位置之后我們就能創(chuàng)建范圍對象了:

復(fù)制代碼 代碼如下:

range.setStart(selectionObject.anchorNode,selectionObject.anchorOffset);
range.setEnd(selectionObject.focusNode,selectionObject.focusOffset);

待續(xù)
現(xiàn)在我們有了范圍對象和微軟的文本范圍對象。以后我們會講解如何使用它們,并且解決不兼容的問題。

翻譯地址:http://www.quirksmode.org/dom/range_intro.html

轉(zhuǎn)載請保留以下信息
作者:北玉(tw:@rehawk)

相關(guān)文章

  • 使用按鈕控制以何種方式打開新窗口的屬性介紹

    使用按鈕控制以何種方式打開新窗口的屬性介紹

    在用戶體驗過程中可能會出現(xiàn)這樣的情況:自定義打開新窗口的樣式,本文將介紹詳細(xì)的解決方法,需要了解的朋友可以參考下
    2012-12-12
  • JavaScript中利用各種循環(huán)進(jìn)行遍歷的方式總結(jié)

    JavaScript中利用各種循環(huán)進(jìn)行遍歷的方式總結(jié)

    這篇文章主要介紹了JavaScript中利用各種循環(huán)進(jìn)行遍歷的方式總結(jié),是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • 關(guān)于鍵盤事件中keyCode、which和charCode 的兼容性測試

    關(guān)于鍵盤事件中keyCode、which和charCode 的兼容性測試

    關(guān)于鍵盤事件中keyCode、which和charCode 的兼容性測試...
    2006-12-12
  • 你真的了解JavaScript的作用域與閉包嗎

    你真的了解JavaScript的作用域與閉包嗎

    這篇文章主要為大家詳細(xì)介紹了JavaScript作用域與閉包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • javascript 函數(shù)速查表

    javascript 函數(shù)速查表

    js 函數(shù)速查表,方便大家快速的找到相關(guān)函數(shù)。
    2010-02-02
  • js中document.write的那點事

    js中document.write的那點事

    document.write()方法可以用在兩個方面:頁面載入過程中用實時腳本創(chuàng)建頁面內(nèi)容,以及用延時腳本創(chuàng)建本窗口或新窗口的內(nèi)容。該方法需要一個字符串參數(shù),它是寫到窗口或框架中的HTML內(nèi)容。這些字符串參數(shù)可以是變量或值為字符串的表達(dá)式,寫入的內(nèi)容常常包括HTML標(biāo)記語言
    2014-12-12
  • 淺談javascript基礎(chǔ)之客戶端事件驅(qū)動

    淺談javascript基礎(chǔ)之客戶端事件驅(qū)動

    下面小編就為大家?guī)硪黄獪\談javascript基礎(chǔ)之客戶端事件驅(qū)動。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • javascript驗證form表單數(shù)據(jù)的案例詳解

    javascript驗證form表單數(shù)據(jù)的案例詳解

    這篇文章主要介紹了javascript驗證form表單數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C#中對象與JSON字符串互相轉(zhuǎn)換的三種方式

    C#中對象與JSON字符串互相轉(zhuǎn)換的三種方式

    這篇文章介紹了C#中對象與JSON字符串互相轉(zhuǎn)換的三種方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列

    JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列

    在面向?qū)ο蟮某绦蛟O(shè)計里,一般都提供了實現(xiàn)隊列(queue)和堆棧(stack)的方法,而對于JS來說,我們可以實現(xiàn)數(shù)組的相關(guān)操作,來實現(xiàn)隊列和堆棧的功能,看下面的相關(guān)介紹.
    2016-01-01

最新評論

睢宁县| 邵武市| 平昌县| 绿春县| 平阳县| 金湖县| 衡阳市| 沂源县| 乡宁县| 平谷区| 武穴市| 凤翔县| 连江县| 大化| 博罗县| 灵山县| 科技| 三明市| 三台县| 贵南县| 留坝县| 神池县| 盖州市| 闸北区| 钟祥市| 商河县| 常宁市| 巫溪县| 鲁山县| 元氏县| 青龙| 南投市| 千阳县| 龙门县| 瑞昌市| 客服| 股票| 正宁县| 迭部县| 德安县| 浪卡子县|