【重要重要】如何在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

原文地址:https://www.cnblogs.com/BluceLee/p/12099981.html

时间: 2024-08-03 12:46:19

【重要重要】如何在div是contentEditable=true的里面获取光标的位置,并在光标位置处插入内容。焦点位置插入指定内容的相关文章

可编辑DIV (contenteditable=&quot;true&quot;) 在鼠标光标处插入图片或者文字

近期需开发一个DIV做的编辑器,插入表情图片可直接预览效果,仔细参考了下百度贴吧的过滤粘贴过来文件的THML代码,自己整理了下.写出来只是和大家分享下,我自己也不大懂,经过努力,幸好搞定. 蛋疼的事情出来了,当编辑框失去焦点时候,再插入图片时候总是插入在最前面(谷歌和火狐,IE没问题).还没搞定,,, <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/

contenteditable=&quot;true&quot;让div可编辑

今天才知道有这个属性,真是out了. 不过以前一直没做编辑器有关的,毕竟开源的很多. 现在觉得开源的也不是这么好用,自己写写简单的吧 用了 <div class="content-box" contenteditable="true"> 我们就能在这个div内部进行编辑了. 有人要问了,有textarea,还需要这个吗 当然,用它的好处就是能插入标签. 比如说图片和视频标签 配合Jquery的html方法就能获取里面的内容了 var content=$(

&lt;div&gt;标签仿&lt;textarea&gt;。contentEditable=‘true’,赋予非表单标签内容可以编辑

需求:web页面需要一个文本输入框.1.该文本输入框默认状态下有个仿‘placeholder’的默认文本提示信息,2.文本框输入状态下其高度会随文本内容自动撑开. 方案选择:1.使用<textarea>标签.但是标签高度不会随文本高度自动撑开,而是出现滚动条.使用JS动态计算文本内容高度赋予<textarea>标签高度. 2.使用<div>或者<p>.<span>等非表单标签,通过赋予其contentEditable='true'属性,是其获得内

input、textarea、div(contenteditable=true)光标定位到最后

1.针对input.textarea //定位input.textarea function po_Last(obj) { obj.focus();//解决ff不获取焦点无法定位问题 if (window.getSelection) {//ie11 10 9 ff safari var max_Len=obj.value.length;//text字符数 obj.setSelectionRange(max_Len, max_Len); } else if (document.selection)

苹果手机IOS中div contenteditable=true无法输入

问题: 在苹果手机IOS中 contenteditable="true" 做文本输入,点击可以弹出键盘但是无法输入,安卓都正常. 经测试,记得加一个样式-webkit-user-select:text就可以了.

div的contenteditable和placeholder蹦出的火花

今天在做手机端发布描述内容时,需要实现换行,还需要有plachholder. 在文本框中换行自然想到了textarea. 问题似乎已经解决了,但是当内容发布后,在html中显示换行都丢失了. 这个时候就用到了contenteditable和placeholder <div class="con" contenteditable="true" placeholder="请输入描述内容..."></div> .con:empt

关于 div 的 contenteditable 使用,placeholder 和 复制图片显示并上传

当使用文本编辑的时候,首先会使用 textarea ,但是,这个里面不能加入其它标签,也就是不能富文本化. 于是可以使用 contenteditable 就是给 div 加上该属性.就变得丰富起来.使用的时候,发现有两个问题. 1.placeholder 无法正常使用,解决办法,是加上一段css: .con:empty:before{ content: attr(placeholder); color:#bbb; } .con:focus:before{ content:none; } 2.复制

h5新属性,可编辑的段落 contenteditable=“true”

HTML 5 全局 contenteditable 属性 HTML 5 全局属性 实例 一段可编辑的段落: <p contenteditable="true">这是一段可编辑的段落.请试着编辑该文本.</p> 亲自试一试 定义和用法 contenteditable 属性规定是否可编辑元素的内容. HTML 4.01 与 HTML 5 之间的差异 contenteditable 属性是 HTML5 中的新属性. 语法 <element contentedit

vue 中contenteditable=&quot;true&quot;添加可编辑属性后v-model双向绑定失效的解决办法

在项目中会遇到需要编辑单元格的双向绑定问题,v-model双向绑定会在添加contenteditable="true"属性后失效解决方法如下,亲测好用(v-html和@blur实现): <td class="width90" contenteditable="true" v-html="name3.LastProduct" @blur="name3.LastProduct=$event.target.inner