【重要重要】如何在div是contentEditable=true的里面獲取光標的位置,並在光標位置處插入內容。焦點位置插入指定內容


 為什么要在contentEditable=true的div里面獲取光標呢?因為這篇文章https://blog.csdn.net/qq_33769914/article/details/85002918我們知道想在一個內容里面插入一個新的內容,如果這個新的內容是段html代碼。最后顯示的是有樣式的。那么用input是無法實現的。

所以我們考慮用contentEditable=true的div。在這里面輸入的html就沒問題啦。
————————————————
版權聲明:本文為CSDN博主「夏天想」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_33769914/article/details/93596502

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>獲取焦點位置並在焦點位置插入指定內容</title>
</head>

<body>
 
<div contenteditable="true" class="fxAnswer" οnblur="getblur()"></div>

<input type="text" id="text" placeholder="想要添加進去的內容"/>
<button type="button" id="btn">添加</button>

<script type="text/javascript" src="js/jquery.min.js" ></script>
<script type="text/javascript">
    var sel,range;
    var textContent;
//失去焦點時獲取光標的位置
    function getblur(){
       sel = window.getSelection();    
       range = sel.getRangeAt(0);
       range.deleteContents();
    }

    //在復雜公式的div contenteditable=true的位置獲取焦點並插入內容
     function insertHtmlAtCaret(html){
            if (window.getSelection) {
                // IE9 and non-IE
                if (sel.getRangeAt && sel.rangeCount) {
                    var el = document.createElement("div");
                    el.innerHTML = html;
                    var frag = document.createDocumentFragment(), node, lastNode;
                    while ((node = el.firstChild)) {
                        lastNode = frag.appendChild(node);
                    }
                    range.insertNode(frag);
                    // Preserve the selection
                    if (lastNode) {
                        range = range.cloneRange();
                        range.setStartAfter(lastNode);
                        range.collapse(true);
                        sel.removeAllRanges();
                        sel.addRange(range);
                    }
                }
            } else if (document.selection && document.selection.type != "Control") {
                // IE < 9
                document.selection.createRange().pasteHTML(html);
            }
            
            textContent=$(".fxAnswer").html();//這個也很重要。因為如果不寫可能就會覆蓋了原來內容替換成你添加的。或者是干脆不顯示了。textContent是全局變量是你輸入的內容。
    } 

//如果默認沒有獲取焦點,你去直接寫內容點添加可能報錯。因為他沒有走失去焦點函數。sel和range還沒有定義呢。就會報錯。加上$(".fxAnswer").focus();這句讓他默認就獲取焦點就能解決這個報錯。

 

//如果你去先把焦點放在可編輯的div,再失去焦點此時sel和range就已經賦值了,就沒問題。
//$(".fxAnswer").focus();

$("#btn").click(function(){
    textContent=$("#text").val();
    insertHtmlAtCaret(textContent)
})
</script>


</body>
</html>


直接上代碼了。

自己輸入的內容插入到光標的位置。

在你輸入你想插入的內容之前就觸發可編輯的div的失去焦點事件。此時光標的位置就獲取到了。然后你插入內容的時候直接在剛才失去光標的地方就可以了。所以這里sel和range都是全局變量。insertHtmlAtCaret這個函數里直接用的是失去焦點時定義的那個sel和range。
————————————————
版權聲明:本文為CSDN博主「夏天想」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_33769914/article/details/93596502

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM