Contenteditable:按删除或退格键时如何完全删除跨度
Contenteditable: How to completely remove span when pressing del or backspace
我有一个 contenteditable div,如下面的 HTML 所示(由 |
标记的插入符号)。
我想在按 backspace 或 delete 时删除 span.label
(即跨度充当单个字母,因此对于用户来说,它看起来好像 Name
在一次按键中被删除)
<div contenteditable="true">
Hallo, <span class="label">Name</span>|,
this is a demonstration of placeholders!
Sincerly, your
<span class="label">Author</span>
</div>
您可以在 div 上监听 onKeyDown 事件:
<div contenteditable="true" id="editable">
Hallo, <span class="label">Name</span>|,
this is a demonstration of placeholders!
</div>
这是事件监听处理程序:
document.addEventListener('keydown', function (e) {
var keycode = event.keyCode;
console.log(keycode);
if (keycode === 8 || keycode === 46) {
var spnLables = document.querySelectorAll('#editable span.label');
if (spnLables.length) {
Array.prototype.forEach.call(spnLables, function (thisnode) {
document.getElementById('editable').removeChild(thisnode);
});
}
}
});
您需要检查光标是否位于跨度结束的确切位置,如果是 - 将其删除:
document.querySelector('div').addEventListener('keydown', function(event) {
// Check for a backspace
if (event.which == 8) {
s = window.getSelection();
r = s.getRangeAt(0)
el = r.startContainer.parentElement
// Check if the current element is the .label
if (el.classList.contains('label')) {
// Check if we are exactly at the end of the .label element
if (r.startOffset == r.endOffset && r.endOffset == el.textContent.length) {
// prevent the default delete behavior
event.preventDefault();
if (el.classList.contains('highlight')) {
// remove the element
el.remove();
} else {
el.classList.add('highlight');
}
return;
}
}
}
event.target.querySelectorAll('span.label.highlight').forEach(function(el) { el.classList.remove('highlight');})
});
span.label.highlight {
background: #E1ECF4;
border: 1px dotted #39739d;
}
<div contenteditable="true">
Hallo, <span class="label">Name</span>|,
this is a demonstration of placeholders!
</div>
I didn't implement the del
key functionality, but the general idea is there and I think you can complete it based on the above example
我有一个 contenteditable div,如下面的 HTML 所示(由 |
标记的插入符号)。
我想在按 backspace 或 delete 时删除 span.label
(即跨度充当单个字母,因此对于用户来说,它看起来好像 Name
在一次按键中被删除)
<div contenteditable="true">
Hallo, <span class="label">Name</span>|,
this is a demonstration of placeholders!
Sincerly, your
<span class="label">Author</span>
</div>
您可以在 div 上监听 onKeyDown 事件:
<div contenteditable="true" id="editable">
Hallo, <span class="label">Name</span>|,
this is a demonstration of placeholders!
</div>
这是事件监听处理程序:
document.addEventListener('keydown', function (e) {
var keycode = event.keyCode;
console.log(keycode);
if (keycode === 8 || keycode === 46) {
var spnLables = document.querySelectorAll('#editable span.label');
if (spnLables.length) {
Array.prototype.forEach.call(spnLables, function (thisnode) {
document.getElementById('editable').removeChild(thisnode);
});
}
}
});
您需要检查光标是否位于跨度结束的确切位置,如果是 - 将其删除:
document.querySelector('div').addEventListener('keydown', function(event) {
// Check for a backspace
if (event.which == 8) {
s = window.getSelection();
r = s.getRangeAt(0)
el = r.startContainer.parentElement
// Check if the current element is the .label
if (el.classList.contains('label')) {
// Check if we are exactly at the end of the .label element
if (r.startOffset == r.endOffset && r.endOffset == el.textContent.length) {
// prevent the default delete behavior
event.preventDefault();
if (el.classList.contains('highlight')) {
// remove the element
el.remove();
} else {
el.classList.add('highlight');
}
return;
}
}
}
event.target.querySelectorAll('span.label.highlight').forEach(function(el) { el.classList.remove('highlight');})
});
span.label.highlight {
background: #E1ECF4;
border: 1px dotted #39739d;
}
<div contenteditable="true">
Hallo, <span class="label">Name</span>|,
this is a demonstration of placeholders!
</div>
I didn't implement the
del
key functionality, but the general idea is there and I think you can complete it based on the above example