如何解决“无法在“选择”上执行“ addRange”:参数1的类型不是“ Range”
我想在另一个浏览器的一个浏览器中镜像内容可编辑div中的文本选择。该代码的简化和相关部分是:
在源浏览器中:
function someFunc() {
if (window.getSelection().isCollapsed)
return;
var range = window.getSelection().getRangeAt(0);
//Send range over websockets to another browser
sendToAnotherBrowser(...) //Send range
}
在远程浏览器中,我执行以下代码:
var sel = window.getSelection();
sel.addRange(range); //Where range is the range transmitted over webSockets
我收到以下错误:
"Failed to execute 'addRange' on 'Selection': parameter 1 is not of type 'Range'
问题: 如何通过websockets传输“范围”对象?它不是要进行字符串化和发送的JSON对象。我可以以某种方式对其进行序列化,将其更改为base64,然后在接收端进行逆向处理吗?
解决方法
您不能序列化对象本身,可以创建一个包含Range
对象数据的对象,将其发送到套接字并从那里构建一个新的Range
对象。 / p>
const sendRange = range => {
const {
startContainer,endContainer,startOffset,endOffset,collapsed
} = range;
const package = JSON.stringify({
startNodeId: startContainer.id,endNodeId: endContainer.id,endOffset
collapsed
});
sendToAnotherBrowser(package);
}
const range = window.getSelection().getRangeAt(0);
sendRange(range);
并在构建新对象的其他地方接收它。
const buildRange = package => {
const {
startNodeId,endNodeId,collapsed
} = JSON.parse(package);
const selection = window.getSelection();
const range = document.createRange();
const startNode = document.getElementById(startNodeId);
const endNode = document.getElementById(endNodeId);
range.setStart(startNode,startOffset);
range.setEnd(endNode,endOffset);
if (collapsed) {
range.collapse();
}
selection.addRange(range);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。