javascript - 在 IE 上使用 Selection.getRangeAt 时出现“IndexSizeError”
问题描述
在现代浏览器上的 contenteditable div 上运行window.getSelection().getRangeAt(0)
时,Internet Explorer 在某些情况下会引发“IndexSizeError”异常。
当 Selection 对象的 AnchorNode 是 TextNode 而不是 HTML 节点时,就会发生这种情况。
我想也许我会为此找到一个 polyfill,但似乎不存在。
是否有任何快速解决方案或替代方法getRangeAt()
?
解决方案
我发现 Safari Mobile 上也发生了同样的事情:
IndexSizeError: The index is not in the allowed range.
我发现了这篇关于它的帖子: 从 Safari 上的选择对象创建范围对象
使用此代码:
var rangeObject = getRangeObject(userSelection);
function getRangeObject(selectionObject) {
if (selectionObject.getRangeAt)
return selectionObject.getRangeAt(0);
else { // Safari!
var range = document.createRange();
range.setStart(selectionObject.anchorNode,selectionObject.anchorOffset);
range.setEnd(selectionObject.focusNode,selectionObject.focusOffset);
return range;
}
}
根据我的需要进行一些调整后:
var range = document.createRange();
if(selectionObject.anchorNode) {
range.setStart(selectionObject.anchorNode ,selectionObject.anchorOffset);
range.setEnd(selectionObject.focusNode,selectionObject.focusOffset);
}
else {
range.setStart(div_element ,selectionObject.anchorOffset);
range.setEnd(div_element, selectionObject.focusOffset);
}
该条件适用于 div 为空且为空的情况,anchorNode
因此null
在这种情况下,它应该使用 div_element 本身。如果有anchorNode(包括TextNode类型),第一部分在IE和safary mobile上也能正常工作。
推荐阅读
- c# - Gridview在编辑按钮上排序c#单击不工作
- php - 苗条框架上的“更新查询”返回错误
- php - 如何检查两个数字是否相等且容差为正或负 1
- android - Android/Firebase - 在 GCM 事件中解析时间戳时出错 - 时间戳为空
- javascript - 有没有办法在第一次登录时询问弹出权限?
- c# - 如何测试所有 ASP.NET Core 控制器依赖注入是否有效?
- entity-framework - 如何在数据库 asp.net core 2.1 中播种图像
- javascript - 有人可以解释一下这个 ( !! ) 运算符吗
- php - php单元测试-属性不存在
- android - 在 Android 上生成和导出 RSA 密钥对