Js光標(biāo)對(duì)象selection的使用

document.selection : IE
window.getSelection() :Chrome、Safari颤难、FireFox

selection代表了當(dāng)前激活選中區(qū),即高亮文本塊体箕,和/或文檔中用戶可執(zhí)行某些操作的其它元素唆樊。
對(duì)象的典型用途是作為用戶的輸入捺典,以便識(shí)別正在對(duì)文檔的哪一部分正在處理闪水,或者作為某一操作的結(jié)果輸出給用戶逗旁。

**** 用戶和腳本都可以創(chuàng)建選中區(qū) ****
用戶創(chuàng)建選中區(qū)的辦法是拖曳文檔的一部分。
腳本創(chuàng)建選中區(qū)的辦法是在文本區(qū)域或類似對(duì)象上調(diào)用select方法冒萄。
要獲取當(dāng)前選中區(qū),請(qǐng)對(duì)document對(duì)象應(yīng)用selection關(guān)鍵字橙数。
要對(duì)選中區(qū)執(zhí)行操作尊流,請(qǐng)先用createRange方法從選中區(qū)創(chuàng)建一個(gè)文本區(qū)域?qū)ο蟆?/p>

一個(gè)文檔同一時(shí)間只能有一個(gè)選中區(qū)。選中區(qū)的類型決定了其中為空或者包含文本和/或元素塊灯帮。盡管空的選中區(qū)不包含任何內(nèi)容崖技,你仍然可以用它作為文檔中的位置標(biāo)志。

#以下代碼在IE瀏覽器中生效

// 對(duì)選定的文字進(jìn)行加粗
document.selection.createRange().execCommand("Bold")
//  獲取選定的文本
document.selection.createRange().text
// 獲取選定的html
document.selection.createRange().htmlText
// 清除選定的內(nèi)容
document.selection.clear()
// 彈出選擇區(qū)的類型( None,Text,...)
document.selection.type
 // 獲取選取區(qū)的文字
var range = document.selection.createRange();  // 創(chuàng)建文本區(qū)域?qū)ο?range.moveStart("character",2);                          // 選定區(qū)起始點(diǎn)向后移動(dòng)2個(gè)字符
range.moveEnd("character",1);                          // 選定區(qū)結(jié)束點(diǎn)向后移動(dòng)1個(gè)字符
console.log(range.text)

#以下代碼在chrome/firefox中生效

window.getSelection().rangeCount // 獲取選定區(qū)數(shù)量
window.getSelection().isCollapsed // 選取定區(qū)起始點(diǎn)是否重疊
// 在光標(biāo)處插入圖片
document.execCommand("insertImage","false","https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png")
// 在光標(biāo)處插入html代碼
document.execCommand("insertHTML","false","<br/>")
// 在焦點(diǎn)狀態(tài)下钟哥,移動(dòng)光標(biāo)至第一個(gè)字符后面
document.getElementById('txt').select();
document.getElementById('txt').setSelectionRange(1,1)
// 復(fù)制選定文本到剪切板
document.execCommand("Copy","false",null);

下面舉例:

// 插入span到第二個(gè)字符后面
var span = document.createElement('span');
span.innerHTML = '[this is add element]';

var sel = window.getSelection();
var startEl = $("#editor_id").next()[0].firstChild, startOffset = 2;
var range = document.createRange();
range.setStart(startEl, startOffset)
range.setEnd(startEl, startOffset);
range.collapse(true);
range.insertNode(span);
sel.removeAllRanges()
sel.addRange(range);
// 保存選定區(qū)
function saveSelectionRange()
{
    if( window.getSelection )
    {
        var sel = window.getSelection();
        if( sel.rangeCount > 0 ) return sel.getRangeAt(0);
    }
    else if( document.selection )
    {
        var sel = document.selection;
        return sel.createRange();
    }
    return null;
}
// 載入選定區(qū)
function setSelectionRange(savedSel )
{
    if( ! savedSel ) return;
    if( window.getSelection )
    {
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(savedSel);
    }
    else if( document.selection )
    {
        savedSel.select();
    }
}
// 獲取光標(biāo)位置
function getCursortPosition (ctrl) 
{
    //獲取光標(biāo)位置函數(shù) 
    var CaretPos = 0; 
    // IE Support
    if (document.selection) 
    { 
        ctrl.focus (); // 獲取焦點(diǎn)
        var Sel = document.selection.createRange (); // 創(chuàng)建選定區(qū)域
        Sel.moveStart('character', -ctrl.value.length); // 移動(dòng)開始點(diǎn)到最左邊位置
        CaretPos = Sel.text.length;                      // 獲取當(dāng)前選定區(qū)的文本內(nèi)容長(zhǎng)度
    } 
    // Firefox support 
    else if (ctrl.selectionStart || ctrl.selectionStart == '0')
    {
        CaretPos =ctrl.selectionStart; // 獲取選定區(qū)的開始點(diǎn) 
    }
    return CaretPos; 
}
// 設(shè)置光標(biāo)位置
function setCaretPosition(ctrl, pos)
{
    //設(shè)置光標(biāo)位置函數(shù) 
    if(ctrl.setSelectionRange) 
    {
        ctrl.focus();  // 獲取焦點(diǎn)
        ctrl.setSelectionRange(pos,pos);  // 設(shè)置選定區(qū)的開始和結(jié)束點(diǎn)
    } 
    else if (ctrl.createTextRange)
    { 
        var range = ctrl.createTextRange();  // 創(chuàng)建選定區(qū)
        range.collapse(true);                // 設(shè)置為折疊,即光標(biāo)起點(diǎn)和結(jié)束點(diǎn)重疊在一起
        range.moveEnd('character', pos);     // 移動(dòng)結(jié)束點(diǎn)
        range.moveStart('character', pos);   // 移動(dòng)開始點(diǎn)
        range.select();                      // 選定當(dāng)前區(qū)域
    } 
}
// 插入指定元素到指定位置
<!doctype html>
<html>
<head>
<title>selection</title>
</head>
<body>
    <p id="p1" contenteditable="true"><b>Hello</b> World</p>  
    <input type="button" value="insertSpan" onclick="insertSpan()" />
</body>
<script>  
function insertSpan() {
    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.color = "red";  
    oSpan.appendChild(document.createTextNode("Inserted text"));  
       
    oRange.setStart(oHello, 2);  
    oRange.setEnd(oWorld, 3);  
    oRange.insertNode(oSpan);  
}
</script>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迎献,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞪醋,更是在濱河造成了極大的恐慌忿晕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件银受,死亡現(xiàn)場(chǎng)離奇詭異践盼,居然都是意外死亡鸦采,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門咕幻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渔伯,“玉大人,你說我怎么就攤上這事肄程÷嗪穑” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵蓝厌,是天一觀的道長(zhǎng)玄叠。 經(jīng)常有香客問我,道長(zhǎng)拓提,這世上最難降的妖魔是什么读恃? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮代态,結(jié)果婚禮上寺惫,老公的妹妹穿的比我還像新娘。我一直安慰自己蹦疑,他們只是感情好西雀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歉摧,像睡著了一般艇肴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上判莉,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天豆挽,我揣著相機(jī)與錄音育谬,去河邊找鬼券盅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛膛檀,可吹牛的內(nèi)容都是我干的锰镀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼咖刃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼泳炉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嚎杨,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤花鹅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后枫浙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刨肃,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡古拴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了真友。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黄痪。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盔然,靈堂內(nèi)的尸體忽然破棺而出桅打,到底是詐尸還是另有隱情,我是刑警寧澤愈案,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布挺尾,位于F島的核電站,受9級(jí)特大地震影響站绪,放射性物質(zhì)發(fā)生泄漏潦嘶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一崇众、第九天 我趴在偏房一處隱蔽的房頂上張望掂僵。 院中可真熱鬧,春花似錦顷歌、人聲如沸锰蓬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芹扭。三九已至,卻和暖如春赦抖,著一層夾襖步出監(jiān)牢的瞬間舱卡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工队萤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轮锥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓要尔,卻偏偏與公主長(zhǎng)得像舍杜,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赵辕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • HTML標(biāo)簽解釋大全 一既绩、HTML標(biāo)記 標(biāo)簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,225評(píng)論 1 41
  • 本人做php的,最近發(fā)現(xiàn)JS真的是博大精深啊,比PHP難.在HTML中,表單是由form元素來表示的还惠,但是在jav...
    linfree閱讀 2,135評(píng)論 3 17
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議饲握。它實(shí)...
    香橙柚子閱讀 23,724評(píng)論 8 183
  • "夏荇啊救欧,這次又接了個(gè)訂單歪今,老板讓咱們趕緊做,這次又要費(fèi)不少原料啦Q湛蟆"朱景進(jìn)了廚房寄猩。 荷夏荇做出一個(gè)鼓形面包,加上...
    白嘉淺閱讀 173評(píng)論 0 0
  • 六年骑疆,準(zhǔn)確說是五年又十一個(gè)月整沒見過你了田篇,可你卻依然活在我的每一天里。沒錯(cuò)箍铭,我就是那個(gè)你可能再見面叫不出...
    追星星的月寶寶閱讀 232評(píng)論 0 0