Herbert Gao

Never be satisfied

Hi there, I'm herbert gao, a Developer from China. Live in Chengdu, work in IBM.


Welcome to onboard

可编辑div插入html

背景

业务中需要在输入框中输入文本和html,所以采用了可编辑DIV。在插入html元素之后需要设置需要设置range开始位置为插入元素之后,然后再插入一个​以保证可以继续在插入html元素之后继续进行输入内容。

代码示例

<template>
    <div>
      <div class="editable-div" contenteditable="true" placeholder="hahahah" v-html="fillContent" @keyup="getlastRange" @mouseup="getlastRange"></div>
      <button type="text" @click="insertBlank">插入填空</button>
    </div>
</template>

<script lang="ts">
import { Component, Prop, Emit, Vue } from "vue-property-decorator"
@Component({
    name: "EditableDiv"
})
export default class EditableDiv extends Vue {
  public fillContent = ""
  public lastRange:any = null
  
  public getlastRange () {
    this.lastRange = window.getSelection()?.getRangeAt(0)
  }
  
  public insertBlank () {
    let selection = getSelection()
    selection?.removeAllRanges()
    selection?.addRange(this.lastRange)
    let range = selection?.getRangeAt(0)

    let blankBox = document.createElement('div')
    blankBox.setAttribute("class", "blank-box");
    blankBox.setAttribute("contenteditable", "true");

    range?.insertNode(blankBox);
    range?.setStartAfter(blankBox)
    
    /*
     * insert &ZeroWidthSpace; after blankBox
     */
    range?.insertNode(document.createTextNode('\u200b'))
    range?.collapse(false);
  }
  
}
</script>

<style lang="less" scoped>
.editable-div {
  background: #ffffff;
  padding: 10px !important;
  border: 1px solid #00000000;
  border-style: dashed!important;
  
  &:empty:before{
    /** add placeholder use attribute */
    content: attr(placeholder);
    color:#ddd;
  }

  &:focus:before{
    content:none;
  }
  &:hover {   border: 1px solid #3f94ff; }
  &:focus{
    border: 1px solid #3f94ff;
    outline:none;
  }
}
</style>

最近的文章

Javascript获取浏览器和系统缩放比例

背景做屏幕适配,除pxtorem的另外一种方案代码示例// 获取缩放倍数(1*系统缩放倍数*浏览器缩放倍数)function getZoom() { let zoom = 1; const screen = window.screen, ua = navigator.userAgent.toLowerCase(); if (window.devicePixelRatio !== undefined) { zoom = window.devicePixelRatio; }...…

javascript继续阅读
更早的文章

vue transition-group 添加缓动效果

原理vue transition-group缓动效果的原理添加moveClass, moveClass的特性核心代码在 transition-group 组件中的 update 钩子中(在修改数据时就会触发这个函数):1、获取 moveClass,如果没有在 transition-group 组件节点中定义 moveClass 属性,那么就在 name 属性值后面拼接 move;2、如果没有子节点或者检测到子节点没有通过 transition 监听 transform 或者 all(通过 ...…

svg继续阅读