【问题标题】:edit v-model in contenteditable div / Highlight text in div在 contenteditable div 中编辑 v-model / 在 div 中突出显示文本
【发布时间】:2019-07-05 05:46:36
【问题描述】:

我正在处理的组件在完成后应该是一个 textarea 或 contenteditable div,其中文本后跟一个井号标签会突出显示/或类似芯片。

目前我正在使用 contenteditable div,周围是另一个建议关键字的组件。在那个组件中有一个 v-model

我的目标是将文本放在# 之后,在一个跨度中

<template>
    <at :ats=['#'] v-model="vmodel">
        <div contenteditable @keypress.enter="highlight"></div>
    </at>
<template>

这不是我想要的,因为它在 div 的开头添加了文本。所以例如当我写的时候“你好#Something” 我明白了: “#Something Hello”

<script>
import At from 'vue-at'
export default {
components: { At },
   data() {
     return { vmodel: '', };
   },
methods: {
   highlight(){
      this.vmodel = this.vmodel.replace(/\B#([^ ]+)/g,"<span class='highlight-Text'>$&</span>")
   }
}
</script>

如何操作 vmodel,例如在键入时向文本添加一个跨度,它不会输出乱码?

【问题讨论】:

  • at 组件对其 v-model 有什么作用?
  • 它只是将它传递给 div 组件。写documents.activeElement.innerHtml = documents.activeElement.innerHtml.replace(/\B#([^ ]+)/g,"$&") 做同样的工作,但我想避免使用 Dom.- 这是同样的问题

标签: javascript html vue.js vue-component vuetify.js


【解决方案1】:

我认为你的问题是正则表达式。您将整个比赛 ($&amp;) 放在跨度内。这包括哈希。我不确定您希望它如何完成,但这会将散列放回原来的位置,并将散列后面的部分放在跨度内。

new Vue({
  el: '#app',
  components: {
    at: {
      props: ['value'],
      template: '<div>{{value}}<slot></slot></div>'
    }
  },
  data() {
    return {
      vmodel: 'Something#-else',
    };
  },
  methods: {
    highlight() {
      this.vmodel = this.vmodel.replace(/(#\B)([^ ]+)/g, "$1<span class='highlight-Text'>$2</span>");
      console.log("New vmodel", this.vmodel);
    }
  }
});
.highlight-Text {
  border-radius: 5px;
  color: black;
  background-color: #5297f1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <at v-model="vmodel">
    <div contenteditable @keypress.enter="highlight">editable stuff</div>
  </at>
</div>

【讨论】:

  • 谢谢。然而这不是我的意思。可以包含主题标签。像这样更改 vmodel 不起作用。例如,当我输入:Hello #Roy - 我得到 - #Roy Hello。当按键而不是按键输入时激活:olleH yoR#。不知何故,旧文本出现在我的新文本之后。
  • 您能否详细描述一下 vmodel 应包含的内容、contenteditable 应包含的内容、您输入的内容以及您期望发生的情况?
  • v-model 等于 div 的 innerHtml。 div 的工作方式类似于带有 v 模型的文本区域。但它包含 Html:我输入:“Hello Roy,这是一个测试”我得到:
    Hello Roy
    这是一个测试
    在 div/v-model 中。当我按 # 时,我的代码会扫描文本并将 # 替换为 # 但是,之后光标会回到整个文本的开头。当我输入 # 时,我希望光标停留在我上次输入的位置。例如,当我写#Thomas 时,我得到:#Thomas
  • 当值被更新时,整个值被替换。系统无法知道光标所属的位置。您必须跟踪它并将其作为更新过程的一部分自己放置。 This question 可能会有所帮助。
  • @webprogrammer 我认为这应该是可能的,但我还没有做过类似的事情。棘手的部分是让 Vue 在 contentEditor 中管理一些东西。您可以将 contentEditable 设置为具有动态子级的 Vue 父级。 this answer 可能有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2021-04-22
  • 1970-01-01
相关资源
最近更新 更多