我有一些ML模型在100个段落中生成的内容,每个段落都有一些突出显示的内容。
有时,突出显示的数据不正确,我们希望用户选择文本并再次突出显示以更正它。
<p> Contrary to popular belief, <span class='highlighted'>Lorem</span>Ipsum is not simply random text. It has roots in a piece of popular classical Latin literature from 45 <span class='highlighted'>BC</span>, making it over 2000 years old.</p>
在此示例中,用户可能希望选择:
下面的代码适用于#2和#4,但我无法为#1和#3执行此操作,因为它已经突出显示。
我正在使用此函数getSelectionText()来选择文本。
$('div.content>p').on('mouseup', function(e){
var toselected = getSelectionText();
var para = $(this).html();
var start = para.indexOf(toselected);
var end = start + toselected.length;
var html = para.replace(toselected, '<span class="highlighted">' toselected + '</span>');
var obj = {"content": $(this).text(), "indices_range":[[start, end]]}
$.post('/update/<content_id>', data:tojson(obj), function(){ $(e.target).html(html);})
});
还想知道,如果相同的文本出现两次或多次,我怎样才能获得开始,结束索引,例如。 popular
?
使用Range和Selection API来控制文本节点的选择。而不是使用<span>
,使用<mark>
标签。
使用<mark>
的原因
用法:像往常一样使用鼠标突出显示文本。 <mark>s
不嵌套(这是一件好事)。要删除突出显示的区域,请使用鼠标右键单击它。
const mark = event => {
const current = event.currentTarget;
const target = event.target;
const select = document.getSelection();
if (event.which === 1) {
const range = select.getRangeAt(0);
const text = range.toString();
const content = range.extractContents();
const mark = document.createElement('MARK');
mark.textContent = text;
range.insertNode(mark);
} else if (event.which === 3) {
event.preventDefault();
if (target.tagName === 'MARK') {
const text = target.textContent;
const tNode = document.createTextNode(text);
target.parentNode.replaceChild(tNode, target);
}
}
select.removeAllRanges();
current.normalize();
return false;
}
$(document).on("contextmenu mouseup", mark);
::selection {
background: tomato;
color: white;
}
<p> Contrary to popular belief, <mark>Lorem</mark>Ipsum is not simply random text. It has roots in a piece of popular classical Latin literature from 45 <mark>BC</mark>, making it over 2000 years old.</p>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>