js实现可编辑的div,并在光标处插入元素

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中输入内容,将鼠标移到某位置,然后点击按钮,将会在该位置插入一个按钮。
在这里插入图片描述
点击
在这里插入图片描述

  • 14
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值