js实现可编辑的div,并在光标处插入元素
定义一个可以编辑的div,用户可以输入内容,并根据需要在光标处插入HTML元素或文本内容。 并且实现placeholder的效果一、可编辑的div 和 placeholder效果
关键点:contenteditable属性
标签的contenteditable属性可以设置元素内容是否可以编辑,属性值为true,可以编辑
<div
id="inputContent"
class="edit"
placeholder="请在这输入内容"
contenteditable="true"
onblur="blurEdit"
onfocus="focusEdit"
oninput="changeText"></div>
此时placeholder是不生效的,要实现此效果需要进行样式设置。
.edit[contenteditable]:empty:before {
content: attr(placeholder);
color: #cccccc;
}
.edit[contenteditable]:focus {
content: none;
}
效果如下:
二、在光标位置插入元素
1. 获取div输入的内容
关键点:innerText 获取元素内的文本内容
如果需要在失去焦点时获取输入的内容,则监听blur事件: οnblur=“blurEdit”
// 失去焦点时获取
function blurEdit(){
let inputText = document.getELementById('inputContent').innerText
}
2.在光标位置插入按钮
关键点:window.getSelection().getRangeAt(0) 获取光标位置
在div内输入内容后,点击按钮,会在div的光标处插入一个按钮。
思路:在div失去焦点时,获取光标的位置,点击按钮时在该位置插入一个节点。
<body>
<div
class="edit"
id="inputContent"
contenteditable="true"
placeholder="请在这输入内容"
onblur="blurEdit()"></div>
<button onclick="clickInsert()">点击插入一个按钮</button>
</body>
<script>
let position = ''
function blurEdit() {
position = window.getSelection().getRangeAt(0)
}
function clickInsert() {
if(position === ''){
// 如果div没有光标,则在div内容末尾插入
const div = document.getElementById('inputContent')
div.focus()
const range = window.getSelection()
range.selectAllChildren(div)
range.collapseToEnd()
position = window.getSelection().getRangeAt(0)
}
// 创建一个元素
const span = document.createElement('span')
// 插入的按钮不可编辑,设置contenteditable为false
span.innerHTML = '<button contenteditable="false" class="btn" id="btn1">插入的按钮1</button>'
// 将按钮插入
position.insertNode(span)
}
</script>
实例:在div中输入内容,将鼠标移到某位置,然后点击按钮,将会在该位置插入一个按钮。
点击