亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

IE6,IE7,IE8下使用Javascript記錄光標(biāo)選中范圍(已補(bǔ)全)

 更新時(shí)間:2011年08月28日 18:35:17   作者:  
IE6,7,8下使用Javascript記錄光標(biāo)選中范圍(已補(bǔ)全)(已解決單個(gè)節(jié)點(diǎn)內(nèi)部重復(fù)字符的問(wèn)題)
剛和同事討論了一個(gè)很有趣的問(wèn)題,有個(gè)idea,需要記錄用戶在頁(yè)面選中的內(nèi)容,在ff和ie9下有w3c的dom2級(jí)事件createRange,這里不再累贅。主要問(wèn)題是在IE6,7,8只能通過(guò)createTextRange選中熱區(qū)。假如我們知道用戶選擇開(kāi)始元素和偏移量,以及結(jié)束元素以及偏移量,那么我們可以用下面的例子把用戶選擇的內(nèi)容用js給標(biāo)記起來(lái)
復(fù)制代碼 代碼如下:

<head>
<script>
function mark() {
var b= document.getElementById ("b");
var b1= document.getElementById ("b1");
var b2= document.getElementById ("b2");
var a1 = document.body.createTextRange();
a1.moveToElementText(b);
a1.moveStart('character',17);
var a2 = document.body.createTextRange();
a2.moveToElementText(b1);
a2.moveEnd('character',-2);
a1.setEndPoint ("EndToEnd",a2);
a1.select();
}</script>
</head>
<body>
<div id="b">The <b>contents</b> of the <i>source</i> element.</div>
<div id="b1">The <b>contents</b> of the <i>source</i> element.</div>
<div id="b2">The <b>contents</b> of the <i>source</i> element.</div>
<button onclick="mark();">Mark</button>
</body>

ok,從上面的代碼,我們可以知道,在IE6,7,8下,需要關(guān)聯(lián)多個(gè)元素的選擇時(shí)候,我們需要?jiǎng)?chuàng)建兩個(gè)textRange,一個(gè)是開(kāi)始節(jié)點(diǎn),以及偏移量,還有一個(gè)結(jié)束節(jié)點(diǎn),以及偏移量,兩個(gè)textRange用a1.setEndPoint關(guān)聯(lián)

參考文檔:http://help.dottoro.com/ljgbbkjf.php

http://msdn.microsoft.com/en-us/library/ms535872%28VS.85%29.aspx

上面是我們知道開(kāi)始結(jié)束位置的情況下,那我們?nèi)绾沃烙脩糇约哼x中的熱區(qū)的開(kāi)始,結(jié)束節(jié)點(diǎn)和偏移量呢?

很可惜查了半天,MSDN只有以下幾個(gè)屬性可以利用,

textRange.parentElement返回選中熱區(qū)的父親節(jié)點(diǎn),可以幫助我們確定,一個(gè)大概的范圍

boundingLeft,offsetLeft,可以知道熱區(qū)的左偏移距離

boundingTop,offsetTop,可以知道熱區(qū)的上偏移距離

text,選中的文本內(nèi)容,htmlText選中的html內(nèi)容

可以沒(méi)有直接的index…,和開(kāi)始節(jié)點(diǎn)。。。之類

好吧,如果我們要通過(guò)位置來(lái)算的話,我們可以通過(guò)每行的line-height,計(jì)算高度,如果是一個(gè)節(jié)點(diǎn)的話,要計(jì)算節(jié)點(diǎn)的height,padding,marging,

如果是計(jì)算左偏移的話,要計(jì)算font-size,margin,padding,letter-space,這樣我們通過(guò)css的計(jì)算,可以得到大致的位置,

然后我們結(jié)合text,和htmlText去比對(duì)附近的元素的文本內(nèi)容,可以得到索引的坐標(biāo)

這樣 基本上我們可以確定開(kāi)始/結(jié)束節(jié)點(diǎn),以及偏移量了,

不過(guò)這樣做的成本也是比較高的,不知道大家還有沒(méi)有好的辦法,或者h(yuǎn)acker的方法^_^

==================================================================================

剛才又看了下htmlText方法,有個(gè)驚奇的發(fā)現(xiàn),還是上面的例子,htmlText返回如下

 

<DIV id=src>he <I>source</I> element.</DIV>
<DIV id=src1>The <B>contents</B> of the <I>source</I> element</DIV>

可以看到開(kāi)始節(jié)點(diǎn)的tagName,還有選中的內(nèi)容,可以通過(guò)去掉開(kāi)頭結(jié)尾的html tag,然后用正則判斷取到這段html代碼在之前的parent.innerHTML的位置,這樣偏移量也就取到了,ok,不需要通過(guò)判斷offset的方式,我們就可以取到開(kāi)始,結(jié)束節(jié)點(diǎn),以及偏移量了

這樣在IE6,7,8下,可以記錄用戶任意選中的內(nèi)容的開(kāi)始、結(jié)束節(jié)點(diǎn),以及偏移量了^_^

 =============================================================

只是這樣做,還有一個(gè)唯一的缺點(diǎn)就是對(duì)于單個(gè)字符,或者重復(fù)出現(xiàn)的單詞,還是得通過(guò)css的offsetLeft 這樣的屬性 ,通過(guò)判斷距離,還確定是否是選中的那個(gè),不知道大家有沒(méi)好的建議

===============================================================

然后今天早上,今天靈光一現(xiàn),互發(fā)奇想,解決不需要通過(guò)offsetTop,left判斷單個(gè)node內(nèi)部,重復(fù)字符的偏移量問(wèn)題

代碼如下

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

<head>
<script>
function mark() {
var selection=document.selection.createRange();
if(selection.text.length==0){
return;
}
var textLength=event.srcElement.innerText.length;
var oldSelectionParent=selection.parentElement();
do{
selection.moveEnd("character",1);
}while(selection.parentElement()==oldSelectionParent);
selection.moveEnd("character",-1);
alert(textLength - selection.text.length);
}
function load(){
document.body.onmouseup=mark;
//document.body.onmousedown=mark;
}
</script>
</head>
<body onload="load()">
<div> 飛 a a a a 飛飛飛飛飛a飛 a a a </div>
</body>

原理就是利用在一個(gè)節(jié)點(diǎn)內(nèi)部,不斷偏移1個(gè)字符,到底部或者頂部,計(jì)算偏移量的方法,因?yàn)閷?duì)于單個(gè)元素內(nèi)的熱區(qū),他的parentElement()返回就是他自己,如果跨多個(gè)節(jié)點(diǎn),之后,返回的parentNode就是他自己的父節(jié)點(diǎn)了,可以通過(guò)這個(gè)變化,判斷,是否移動(dòng)到該節(jié)點(diǎn)文本的盡頭。^_^這樣就可以計(jì)算偏移量了




ok,總結(jié),通過(guò)htmlText的屬性可以解決多節(jié)點(diǎn)選中熱區(qū)的定位問(wèn)題,對(duì)于單節(jié)點(diǎn)內(nèi)部重復(fù)字符,可以通過(guò)文中最后一部分代碼解決,這樣在IE下,記錄光標(biāo)選中位置,和復(fù)現(xiàn)的方法就完美了^_^


============================================

去kissy群?jiǎn)柫讼?,原?lái)承玉已經(jīng)做過(guò)全兼容的取位置的代碼,鏈接如下
http://chabaoo.cn/article/28120.htm

代碼:http://lite-ext.googlecode.com/svn/trunk/lite-ext/playground/range/ie.html

相關(guān)文章

  • 實(shí)現(xiàn)lightBox時(shí)的樣式與行為分離減少JS

    實(shí)現(xiàn)lightBox時(shí)的樣式與行為分離減少JS

    本教程旨在實(shí)現(xiàn)lightBox時(shí)的樣式與行為分離,減少JS在各方面(全屏遮蔽、ie6中遮蔽select、雙向居中、高度自適應(yīng)內(nèi)容等)的工作。
    2009-07-07
  • 更靠譜的H5橫豎屏檢測(cè)方法(js代碼)

    更靠譜的H5橫豎屏檢測(cè)方法(js代碼)

    這篇文章主要為大家詳細(xì)介紹了更靠譜的橫豎屏檢測(cè)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Prototype框架詳解

    Prototype框架詳解

    Prototype是一個(gè)JavaScript框架,旨在簡(jiǎn)化動(dòng)態(tài)Web應(yīng)用程序的開(kāi)發(fā)。原型被稱為作為一個(gè)單一的文件分發(fā)的prototype.js,本文給大家介紹prototype框架,感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • JS彈出對(duì)話框返回值代碼(asp.net后臺(tái))

    JS彈出對(duì)話框返回值代碼(asp.net后臺(tái))

    JS彈出對(duì)話框返回值代碼,需要的朋友可以參考下。
    2010-12-12
  • JS input 數(shù)字驗(yàn)證代碼

    JS input 數(shù)字驗(yàn)證代碼

    控制控件只能輸入數(shù)字,含-(負(fù)號(hào)).(小數(shù)點(diǎn))
    2009-07-07
  • javascript中數(shù)組方法匯總

    javascript中數(shù)組方法匯總

    本文給大家詳細(xì)匯總了一下javascript中的數(shù)組方法,十分的全面細(xì)致,有需要的小伙伴可以參考下。
    2015-07-07
  • JS正則RegExp.test()使用注意事項(xiàng)(不具有重復(fù)性)

    JS正則RegExp.test()使用注意事項(xiàng)(不具有重復(fù)性)

    這篇文章主要介紹了JS正則RegExp.test()使用注意事項(xiàng),結(jié)合實(shí)例形式分析了RegExp.test()方法的功能與用法,以及針對(duì)不能重復(fù)調(diào)用的解決方法,需要的朋友可以參考下
    2016-12-12
  • webpack中使用Eslint的實(shí)現(xiàn)

    webpack中使用Eslint的實(shí)現(xiàn)

    本文主要介紹了webpack中使用Eslint的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Weex開(kāi)發(fā)之WEEX-EROS開(kāi)發(fā)踩坑(小結(jié))

    Weex開(kāi)發(fā)之WEEX-EROS開(kāi)發(fā)踩坑(小結(jié))

    這篇文章主要介紹了Weex開(kāi)發(fā)之WEEX-EROS開(kāi)發(fā)踩坑(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 不同瀏覽器對(duì)回車提交表單的處理辦法

    不同瀏覽器對(duì)回車提交表單的處理辦法

    在瀏覽器中填寫表單的時(shí),可以直接在“文本框”中敲擊“Enter”來(lái)提交表單,很是方便。
    2010-02-02

最新評(píng)論