如何保存和恢复 javascript 中的选择范围?
How can I save and restore Selection range in javascript?
我想保存(序列化)Selection
范围,以便在 iOS 的 UIWebView
的下一个用户会话中重用(反序列化)它应用。
用户路径:
- 用户选中部分文字,点击保存
- 关闭内置移动浏览器
- 打开内置移动浏览器并查看恢复的选择。
我的想法是先通过调用window.getSelection().getRangeAt(0)
获取范围,然后保存其startContainer
、endContainer
属性。检查以下演示片段:
function saveSelectedRange() {
var highlightRange = window.getSelection().getRangeAt(0);
var range = document.createRange();
// ???
console.log("start container: " + JSON.stringify(highlightRange.startContainer));
console.log("end container: " + JSON.stringify(highlightRange.endContainer));
}
#intro {
font-size: 125%;
color: green;
}
p.small {
font-size: 75%;
}
#content {
margin-left: 330px;
}
#buttons {
left: 10px;
position: fixed;
border: solid black 1px;
background-color: background:#C0ED72;
padding: 5px;
width: 300px;
}
html.ie6 #buttons {
position: absolute;
}
#buttons h3 {
font-size: 125%;
font-weight: bold;
margin: 0;
padding: 0.25em 0;
}
<div id="buttons">
<h3>Save selection range</h3>
<p>Make a selection in the document and use the button below to save the selection range </p>
<input type="button" ontouchstart="saveSelectedRange();" onclick="saveSelectedRange();" value="Save selection range">
</div>
<div id="content">
<h1>Demo</h1>
<p id="intro">
Please use your mouse to make selections from the sample content and use the button
on the left to save the selection range.
</p>
</div>
如您所见,控制台记录空 startContainer
、endContainer
值,但 startOffset
、endOffset
属性正常。我需要保存哪些值才能在以后的会话中恢复选择范围?常见的实现方式有哪些?
我终于用@TimDown rangy-library
和他的 module 解决了这个问题。
var highlightRange = window.getSelection().getRangeAt(0);
var serializedRange = rangy.serializeRange(highlightRange);
var deseriazedRange = rangy.deserializeRange(serializedRange);
重要说明: Rangy 库创建自己的 RangyRange
class 以便跨平台(我猜),如果你想使用方法从 DOM Range
class 开始,其中一些将不可用,直到您将 rangy
设置为使用 Native Range
我想保存(序列化)Selection
范围,以便在 iOS 的 UIWebView
的下一个用户会话中重用(反序列化)它应用。
用户路径:
- 用户选中部分文字,点击保存
- 关闭内置移动浏览器
- 打开内置移动浏览器并查看恢复的选择。
我的想法是先通过调用window.getSelection().getRangeAt(0)
获取范围,然后保存其startContainer
、endContainer
属性。检查以下演示片段:
function saveSelectedRange() {
var highlightRange = window.getSelection().getRangeAt(0);
var range = document.createRange();
// ???
console.log("start container: " + JSON.stringify(highlightRange.startContainer));
console.log("end container: " + JSON.stringify(highlightRange.endContainer));
}
#intro {
font-size: 125%;
color: green;
}
p.small {
font-size: 75%;
}
#content {
margin-left: 330px;
}
#buttons {
left: 10px;
position: fixed;
border: solid black 1px;
background-color: background:#C0ED72;
padding: 5px;
width: 300px;
}
html.ie6 #buttons {
position: absolute;
}
#buttons h3 {
font-size: 125%;
font-weight: bold;
margin: 0;
padding: 0.25em 0;
}
<div id="buttons">
<h3>Save selection range</h3>
<p>Make a selection in the document and use the button below to save the selection range </p>
<input type="button" ontouchstart="saveSelectedRange();" onclick="saveSelectedRange();" value="Save selection range">
</div>
<div id="content">
<h1>Demo</h1>
<p id="intro">
Please use your mouse to make selections from the sample content and use the button
on the left to save the selection range.
</p>
</div>
如您所见,控制台记录空 startContainer
、endContainer
值,但 startOffset
、endOffset
属性正常。我需要保存哪些值才能在以后的会话中恢复选择范围?常见的实现方式有哪些?
我终于用@TimDown rangy-library
和他的 module 解决了这个问题。
var highlightRange = window.getSelection().getRangeAt(0);
var serializedRange = rangy.serializeRange(highlightRange);
var deseriazedRange = rangy.deserializeRange(serializedRange);
重要说明: Rangy 库创建自己的 RangyRange
class 以便跨平台(我猜),如果你想使用方法从 DOM Range
class 开始,其中一些将不可用,直到您将 rangy
设置为使用 Native Range