我试图记录下每一个字,从一段文字时,它是点击。然而,我也想提供视觉反馈给用户,当他们点击了一个词。code非常有用。但是我不知道怎么给它加一个类。我已经标记了我添加的代码不起作用的地方:
var book = 'Lorem ipsum dolor sit amet, cu eum eros vitae persequeris, laudem possit nam ex. Labore eloquentiam per an. Sit ex omnesque interpretaris, habeo tantas eos ad, ea eos ludus inciderint. Facete tritani pro ei, vim evertitur liberavisse ex. Ridens indoctum duo cu, est utamur aliquando expetendis ne. Cum nusquam definiebas ex, id esse neglegentur cum, eu libris bonorum volumus vis. Ius et quis omnis graeco, no his nullam perpetua dissentiet. No vix possim scripserit consequuntur, te mnesarchum philosophia sed. Ne mea putent iudicabit, in eam ipsum viris dicunt. Eum amet accommodare ex, sint malis adversarium at qui.'
new Vue({
el: '#app',
data: { book: '' },
methods: {
doSomething(e) {
var content = e.target.textContent
var pos = window.getSelection().anchorOffset
content = content
.substring(0, content.indexOf(' ', pos))
.trim()
content = content
.substr(content.lastIndexOf(' ') + 1)
.replace(/[.,:;!?()+-]/g, '')
// not working code
.add('highlight')
console.log(content)
}
},
created() {
// load external data
this.book = book
}
})
.highlight {
background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<p @click="doSomething" v-html="book"></p>
</div>
我想每一个字,以保持突出显示时,点击。例如,如果你点击“Lorem ipsum dolor”所有3个字应该突出显示在黄色。最好是,如果再次点击,它们也将被取消高亮显示。
3条答案
按热度按时间xwbd5t1u1#
我看了你的帖子中提到的stackoverflow answer,并提出了以下解决方案。
1.使用将
spans
添加到每个单词的解决方案1.在事件处理程序中,您可以检查是否存在任何样式。对于我们的例子,我们可以检查是否存在
color
属性,即event.target.style.color
1.如果它确实存在,那么你知道这已经被点击,你可以恢复颜色,以您的选择
1.如果它不存在,那么你知道这是第一次点击它,可以设置颜色为您的选择
我也不知道什么是
vue
lolbbmckpt72#
使用
\b
正则表达式将文本拆分为单词,使每个单词都是自己的,然后突出显示这些单词操场
p1tboqfb3#
您可以获取相对于最近段落元素的绝对
anchorOffset
,然后查找开始/结束索引,以确定单击了哪个单词。确保索引是从端到端排序的,这样替换不会移动子串的位置。您可以将每个开始/结束位置存储为一个状态,并使用替换的单词(突出显示)重新呈现原始文本。
这里是相对与绝对选择锚位置的演示。选择始终相对于最近的图元。
这里是Halapgos 1解决方案的修改版本。我简化了逻辑,只在事件目标元素上切换
.highlight
类。