【发布时间】:2025-07-13 15:45:01
【问题描述】:
假设我有一个带有标记的文本,例如:
而且我想禁用选择以使选择的开始或结束不在标记中。因此,所有这些选择都应该是可能的:
另一方面,应该禁用这些选择:
到目前为止,我只尝试使用一些简单的 css,
mark {
-khtml-user-select: all;
-webkit-user-select: all;
-o-user-select: all;
user-select: all;
}
This is <mark>marked text</mark>. I want to disable selecting only part of <mark>marked text</mark>.
有没有办法做到这一点?任何答案将不胜感激!
我实现了我想做的,所以在这里分享。
function checkSelection () {
var sel = window.getSelection();
var marks = document.getElementsByTagName('mark');
for(var i = 1; i < sel.rangeCount; i++) {
sel.removeRange(sel.getRangeAt(i));
}
var range = sel.getRangeAt(0);
var startnode = range.startContainer;
var endnode = range.endContainer;
for (var i = 0; i < marks.length; i++) {
if (marks[i].contains(startnode)) {
range.setStartBefore(startnode);
}
if (marks[i].contains(endnode)) {
range.setEndAfter(endnode);
}
}
}
document.addEventListener('mouseup', checkSelection)
document.addEventListener('touchend', checkSelection)
This is <mark>marked text</mark>. I want to disable selecting only part of <mark>marked text</mark>.
【问题讨论】:
-
我没有看到任何简单的方法来做到这一点。您必须解析文本、使用鼠标事件、添加类等。
-
您可以提交一些错误报告并希望浏览器供应商修复它。 drafts.csswg.org/css-ui-4/#valdef-user-select-all “如果选择包含元素的一部分,那么选择必须包含整个元素,包括其所有后代” - 它没有说明选择必须以单击开始(MDN 告诉我们)跨度>
-
至于“有没有办法做到这一点”部分,见*.com/questions/985272/…(是)
-
请考虑将现有答案之一标记为已接受或创建并接受您自己的答案,以便解决此问题。
标签: javascript html css selection