如何删除用Range.setStart/setEnd选择的字符
How to delete a character selected with Range.setStart/setEnd?
下面的代码监听分配给div的事件。按h
选择左边的下一个字符。按l
选择右侧的下一个字符。
// HTML
<div class="editable" contenteditable="true">
<p>This is a test</p>
</div>
// JS
e.preventDefault()
const range = document.createRange()
const content = e.target.querySelector('p').firstChild
if (e.keyCode === 72) { // h
range.setStart(content, this.start -= 1)
range.setEnd(content, this.end -= 1)
}
if (e.keyCode === 76) { // l
range.setStart(content, this.start += 1)
range.setEnd(content, this.end += 1)
}
if (e.keyCode === 88) { // x
range.selectNode(content)
range.deleteContents()
}
window.getSelection().removeAllRanges()
window.getSelection().addRange(range)
按下x
应删除选定的字符。我能做的最好的事情是使用range.selectNode(content)
,但这会删除所有字符。
如何只删除选定的字符?
编辑:CodePen:http://codepen.io/alexcheninfo/pen/QNZeQy(点击文本,然后可以按键并查看选择移动。)
从代码中删除range.selectNode(content)
,它会选择p
中的所有文本。
const input = document.getElementById('editable')
const range = document.createRange()
const content = input.querySelector('p').firstChild
let start = 0
let end = 1
range.setStart(content, 0)
range.setEnd(content, 1)
input.addEventListener('keydown', function(e) {
e.preventDefault()
if (e.keyCode === 72) { // h
range.setStart(content, start -= 1)
range.setEnd(content, end -= 1)
}
if (e.keyCode === 76) { // l
range.setStart(content, start += 1)
range.setEnd(content, end += 1)
}
if (e.keyCode === 88) { // l
//range.selectNode(content)
range.deleteContents()
}
window.getSelection().removeAllRanges()
window.getSelection().addRange(range)
});
<div id="editable" contenteditable="true">
<p>This is a test</p>
</div>