Javascript 在插入符号位置将文本从引导模式插入可编辑div

Javascript 在插入符号位置将文本从引导模式插入可编辑div,javascript,jquery,bootstrap-modal,contenteditable,Javascript,Jquery,Bootstrap Modal,Contenteditable,我有一个contenteditable div,试图从引导模式中插入特殊字符。但我无法在插入符号/光标位置插入字符,因为当modal打开时,光标会散焦 这是我的密码 <script> jQuery(document).ready(function($){ function pasteHtmlAtCaret(html) { var sel, range; if (window.getSelection) { sel = wind

我有一个contenteditable div,试图从引导模式中插入特殊字符。但我无法在插入符号/光标位置插入字符,因为当modal打开时,光标会散焦

这是我的密码

 <script>
 jQuery(document).ready(function($){
      function pasteHtmlAtCaret(html) {
      var sel, range;
       if (window.getSelection) {
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt( 0 );
            range.deleteContents();
            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 );
            if (lastNode) {
                range = range.cloneRange();
                range.setStartAfter( lastNode );
                range.collapse( true );
                sel.removeAllRanges();
                sel.addRange( range );
            }
        }
        } else if (document.selection && document.selection.type != "Control") {
            document.selection.createRange().pasteHTML( html );
            }
        }
         function placeCaretAtEnd(el) {
         el.focus();
        if (typeof window.getSelection != "undefined"
        && typeof document.createRange != "undefined") {
        var range = document.createRange();
        range.selectNodeContents( el );
        range.collapse( false );
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange( range );
         } else if (typeof document.body.createTextRange != "undefined") {
           var textRange = document.body.createTextRange();
            textRange.moveToElementText( el );
            textRange.collapse( false );
                textRange.select();
            }
        }

       saveSelection = function(el) {
                var sel = window.getSelection && window.getSelection();
            if (sel && sel.rangeCount > 0) {
            return sel.getRangeAt( 0 );
            }
        }

       editer = jQuery('#whats-new');

     jQuery(document).on('shown.bs.modal','#mceu_83', function (e) {

                
      jQuery('.mce-charmap td div').click(function () {
        if ( ! editer.is( ':focus' )) {
                    placeCaretAtEnd( editer[0] );
                }

                saveSelection( editer[0] );
                
    // var curPos = getCaretPosition("#whats-new");
    // will get the value of the text area
    let x=  jQuery('#whats-new').text();
    // will get the value of the input box
    let text_to_insert=jQuery(this).text(); 
            jQuery("#mceu_83").modal("hide");

    // setting the updated value in the text area

   //jQuery('#whats-new').text(x.slice(0,curPos)+text_to_insert+x.slice(curPos));
    pasteHtmlAtCaret(text_to_insert);

   });

   jQuery(document).off("shown.bs.modal");

   });
// jQuery('#mceu_83').unbind('show.bs.modal');


  });
   </script>

jQuery(文档).ready(函数($){
函数pasteHtmlAtCaret(html){
var-sel,范围;
if(window.getSelection){
sel=window.getSelection();
if(sel.getRangeAt&&sel.rangeCount){
范围=选择范围(0);
range.deleteContents();
var el=document.createElement(“div”);
el.innerHTML=html;
var frag=document.createDocumentFragment(),节点,lastNode;
while((node=el.firstChild)){
lastNode=frag.appendChild(节点);
}
range.insertNode(frag);
如果(最后一个节点){
range=range.cloneRange();
range.setStartAfter(lastNode);
范围。塌陷(真);
选择removeAllRanges();
选择添加范围(范围);
}
}
}else if(document.selection&&document.selection.type!=“控制”){
document.selection.createRange().pasteHTML(html);
}
}
函数placeCaretAtEnd(el){
el.focus();
if(typeof window.getSelection!=“未定义”
&&typeof document.createRange!=“未定义”){
var range=document.createRange();
范围。选择节点内容(el);
范围。塌陷(假);
var sel=window.getSelection();
选择removeAllRanges();
选择添加范围(范围);
}else if(typeof document.body.createTextRange!=“未定义”){
var textRange=document.body.createTextRange();
textRange.moveToElementText(el);
textRange.collapse(false);
textRange.select();
}
}
保存选择=功能(el){
var sel=window.getSelection&&window.getSelection();
如果(选择和选择范围计数>0){
返回sel.getRangeAt(0);
}
}
editer=jQuery(“#什么是新的”);
jQuery(document).on('show.bs.modal','mceu83',函数(e){
jQuery('.mce charmap td div')。单击(函数(){
如果(!editer.is(':focus')){
placeCaretAtEnd(编辑程序[0]);
}
保存选择(编辑程序[0]);
//var curPos=getCaretPosition(“什么是新的”);
//将获取文本区域的值
设x=jQuery('#whatsnew').text();
//将获取输入框的值
让text_to_insert=jQuery(this).text();
jQuery(“#mceu83”).modal(“隐藏”);
//在文本区域中设置更新的值
//jQuery(“#什么是新的”).text(x.slice(0,curPos)+text_to_insert+x.slice(curPos));
pasteHtmlAtCaret(文本插入);
});
jQuery(document).off(“show.bs.modal”);
});
//jQuery('#mceu_83').unbind('show.bs.modal');
});
但此代码总是在div的开头插入字符,而不是最后一个光标/插入符号位置