js替換選中的文字湾揽,兼容所有瀏覽器

替換選中的文本瓤逼,分兩種情況:HTML中的文本、輸入框中的文本库物。輸入框就是input和textarea霸旗,這里以textarea文本域為例。

import.png

替換HTML中選擇的文本 {#替換html中選擇的文本}

寫一段文字

<div>
    <span>
        這是一段測試文字戚揭,測試HTML中替換選擇的文本
    </span>
</div>

加一個按鈕

<input type="button" value="替換HTML中的選中文本" onclick="boldSelection('AAA')">

js方法

/**
* 替換選擇的文本诱告,不支持textarea和input
*/
function boldSelection(text) {
    if (document.selection) { // 老IE
        var selecter = document.selection.createRange();
        selecter.select();
        var selectStr = selecter.text; //獲取選中文本
        selecter.pasteHTML(text); //替換為HTML元素,替換完會失去選取民晒,如果選擇的是textarea里的內容這里會報錯
    } else { // 非老IE
        var selecter;
        if (window.getSelection()) {
            selecter = window.getSelection();
        } else {
            selecter = document.getSelection();
        }
        selecter = document.getSelection();
        var selectStr = selecter.toString();
        if (selectStr.trim() != "") {
            var rang = selecter.getRangeAt(0);
            // temp成為選中內容的父節(jié)點蔬啡,達到加粗的效果
            var temp = document.createElement('b');
            rang.surroundContents(temp);
            // 先刪除再插入達到替換的效果,
            rang.deleteContents(); // 刪除選中內容
            rang.insertNode(document.createTextNode(text)); //在選中內容的起始位置插入一個節(jié)點
            // chrome中的bug镀虐,如果選中的是textarea中的內容箱蟆,就會在textarea前面插入節(jié)點
        }
    }
}

查看效果

2017-09-25_17-25-58.gif

替換輸入框中選擇的文本

加一個textarea,寫入默認文字

<div>
    <span>
        <textarea id="editor" name="editor" cols="30" rows="10"
                  onkeydown="savePos(this)" onkeyup="savePos(this)"
                  onmousedown="savePos(this)" onmouseup="savePos(this)" onfocus="savePos(this)"
        >這是一段測試文字刮便,測試文本域中替換選擇的文本空猜。如果末尾是空格 ,替換后把空格補上恨旱。</textarea>
    </span>
</div>

加一個按鈕

<input type="button" value="替換文本域中的選中文本" onclick="replaceSelection('editor','AAA')">

js代碼

/**
* 保存選中位置辈毯,用于老IE
*/
function savePos(editor) {
    // 判斷對象是否支持某方法:if (對象.方法名) {} 方法名后不必帶()
    if (editor.createTextRange && document.selection) { // 老IE
        if(document.selection.createRange) {
            editor.caretPos = document.selection.createRange().duplicate();
        }
}
/**
* 替換選擇的文本用于input 和 textarea
*/
function replaceSelection(name, text) {
    // 獲取編輯器textarea對象
    var editor = document.getElementById(name);
    if (!editor) {
        var editors = document.getElementsByName(name);
        if (editors && editors.length>0) {
            editor = editors[0];
        }
    }
    if (!text) { // 如果沒傳遞文本就不執(zhí)行
        editor.focus(); //歸還焦點
        return false;
    }
    if (editor.createTextRange && editor.caretPos) { // 老IE
        editor.focus(); // 防止無限擴選
        var selectStr = editor.caretPos.text;
        if (selectStr && selectStr.substring(selectStr.length - 1)==" ") {
            text += " "; // 右邊多選中一個空格,替換后再補一個空格搜贤,優(yōu)化編輯體驗
        }
        editor.caretPos.text = text;
    } else if (editor.setSelectionRange) { 
    // 非老IE谆沃,利用選區(qū)的開始索引和結束索引重新拼串,而不是直接操作選取仪芒,達到替換選取的目的
        // 獲取選中的問題
        var selectionStart; // textarea選中文本的開始索引
        var selectionEnd; // textarea選中文本的結束索引
        selectionStart = editor.selectionStart;
        selectionEnd = editor.selectionEnd;
        var selectStr = editor.value.substring(selectionStart, selectionEnd);
        if (selectStr && selectStr.substring(selectStr.length - 1)==" ") {
            text += " ";
        }
        var leftStr = editor.value.substring(0, selectionStart);
        var rightStr = editor.value.substring(selectionEnd, editor.value.length);
        editor.value = leftStr + text + rightStr;
        //重新選中新文本
        selectionEnd = selectionStart + text.length;
        editor.setSelectionRange(selectionStart, selectionEnd);
        //非IE瀏覽器必須獲取焦點
        editor.focus();
    }
}

查看效果

2017-09-25_17-34-10.gif

存在的Bug

程序中的bug就像哲學中講的矛盾唁影,都是普遍存在的耕陷,無法徹底解決。bug不一定要真的解決据沈,可以用其它方法回避哟沫,只要不影響使用,也是可以接受的锌介。下面是存在的bug:

  1. 1嗜诀、chrome瀏覽器中,焦點再textare上孔祸,點擊替換HTML選擇的文本隆敢,就會在textarea前面增加AAA
  2. 2、IE8中bug較多崔慧,應該是瀏覽器原因拂蝎,只能做到這樣了
    1. 焦點再textarea外,點擊替換文本域中的文本尊浪,有時就會在textarea上增加AAA
    2. 文本域通過雙擊選擇單詞,點替換文本域中的文本封救,選中后新文本依然是選擇狀態(tài)拇涤;而通過拉動光標選中的文本,替換后會失去選中狀態(tài)
    3. 替換HTML中選中的文本誉结,替換后會失去選中狀態(tài)

在IE11中較為正常鹅士,無明顯bug。如下是bug演示

Chrome里的bug

chromebug.gif

IE8里的bug

iebabug.gif
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撵儿,更是在濱河造成了極大的恐慌玉雾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溃槐,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機永票,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滥沫,“玉大人侣集,你說我怎么就攤上這事±夹澹” “怎么了世分?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缀辩。 經(jīng)常有香客問我臭埋,道長踪央,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任斋泄,我火速辦了婚禮杯瞻,結果婚禮上,老公的妹妹穿的比我還像新娘炫掐。我一直安慰自己魁莉,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布募胃。 她就那樣靜靜地躺著旗唁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痹束。 梳的紋絲不亂的頭發(fā)上检疫,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音祷嘶,去河邊找鬼屎媳。 笑死,一個胖子當著我的面吹牛论巍,可吹牛的內容都是我干的烛谊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘉汰,長吁一口氣:“原來是場噩夢啊……” “哼丹禀!你這毒婦竟也來了?” 一聲冷哼從身側響起鞋怀,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤双泪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后密似,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焙矛,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年残腌,在試婚紗的時候發(fā)現(xiàn)自己被綠了薄扁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡废累,死狀恐怖邓梅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情邑滨,我是刑警寧澤日缨,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站掖看,受9級特大地震影響匣距,放射性物質發(fā)生泄漏面哥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一毅待、第九天 我趴在偏房一處隱蔽的房頂上張望尚卫。 院中可真熱鬧,春花似錦尸红、人聲如沸吱涉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎爵。三九已至,卻和暖如春盅蝗,著一層夾襖步出監(jiān)牢的瞬間鳖链,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工墩莫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芙委,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓狂秦,卻偏偏與公主長得像灌侣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子故痊,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容

  • DOM DOM內容主要分為四部分: 什么是DOM和節(jié)點顶瞳; 獲取節(jié)點玖姑; 節(jié)點操作(3種)愕秫; 屬性操作(3種)。 什么...
    magic_pill閱讀 777評論 0 1
  • 本人做php的,最近發(fā)現(xiàn)JS真的是博大精深啊,比PHP難.在HTML中焰络,表單是由form元素來表示的戴甩,但是在jav...
    linfree閱讀 2,155評論 3 17
  • 表單基礎知識 在HTML中,表單是由 元素來表示的闪彼,而在JS中甜孤,表單對應的則是HTMLFormElement類型。...
    oWSQo閱讀 908評論 0 1
  • 我剛工作那會畏腕,簡直中了淘寶的毒缴川。每天大部分時間都用來逛淘寶。 有那么多東西可買嗎描馅?有那么多錢夠我買嗎把夸? 雙否。 即...
    玄玄被用了閱讀 166評論 0 1
  • meta 是用來在HTML文檔中模擬HTTP協(xié)議的響應頭報文铭污。meta 標簽用于網(wǎng)頁的<head>與<...
    __HAPPINESS_yh閱讀 1,087評論 1 1