【发布时间】:2020-05-16 17:14:34
【问题描述】:
我有一个带有溢出的 div:hidden 包含混合内容 html/文本。 我对这个 div 容器应用了 mousedown 和 mouseup 事件。如果用户在 mousedown 时突出显示内容,则选择会在 mouse up 事件中捕获。
一切正常,(直到/或如果)用户执行以下操作:
用户在 div 容器内按下 mousedown,突出显示特定内容,然后在按下鼠标按钮的同时将指针移到容器外,然后释放鼠标按钮,在 div 容器外调用 mouseup 事件。
我收到此错误: InvalidStateError:尝试使用不可用或不再可用的对象。
我想要实现的是: 如果鼠标按钮在 div 容器外释放,我只想保留容器内仍然突出显示的内容。如果这是不可能的,请删除所有范围/选择/突出显示。
我已阅读有关 .getSelection() 和无效状态错误的所有文档,并在谷歌上搜索所有试图找到结果的方法。
我读过的所有内容都无法捕获 InvalidStateError 或如何处理选择以将内容保留在 div 容器中。
这是我的代码示例:
<style>container{width:120px;height:120px;overflow:hidden;}</style>
<div class="container">testNode text testNode text testNode text testNode text testNode text testNode text testNode text testNode texttestNode text testNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode texttestNode text</div>
<script>$('.container').on('mouseup', function(){
var sel = getSelection();
var range = sel.getRangeAt(0).cloneRange();
var end = sel.toString().length;
var newNode = document.createElement('tmp');
/*on this following line i get invalidstate error
if mouse released outside the container div*/
range.surroundContents(newNode);
sel.removeAllRanges();
sel.addRange(range);
})
</script>
【问题讨论】:
-
更新: 我发现通过将范围内容放入字符串并在主容器 html/text 中找到 indexOf(字符串格式的范围值)来消除 invalidstateerror。如果 indexOf(range string) == -1 则不要用新节点包装容器的内容。这消除了错误。但是,我更愿意仅在 div 中获取高亮部分的内容。第一次选择尝试,即使它超出了边界
标签: javascript jquery getselection