如何在javascript中保存和恢复选择范围?

时间:2016-09-19 06:25:28

标签: javascript html range selection

我想保存(序列化)Selection范围,以便在 iOS应用UIWebView中的下一个用户会话中重复使用(反序列化)它。

Userpath

  1. 用户选择文本的一部分,点击保存
  2. 关闭内置移动浏览器
  3. 打开内置移动浏览器并查看已恢复的选择。
  4. 我的想法首先是通过调用window.getSelection().getRangeAt(0)来获取范围,然后保存其startContainerendContainer属性。请查看以下演示片段:

    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>

    如您所见,控制台会记录空startContainerendContainer个值,但startOffsetendOffset属性正常。我需要保存哪些值才能在进一步的会话中恢复选择范围?实现它的常用方法是什么?

    价: Range classSelection class

1 个答案:

答案 0 :(得分:0)

我终于通过使用@TimDown rangy-library和他的module解决了这个问题。

var highlightRange = window.getSelection().getRangeAt(0);
var serializedRange = rangy.serializeRange(highlightRange);
var deseriazedRange = rangy.deserializeRange(serializedRange);

重要提示: Rangy库创建自己的RangyRange类,以便进行交叉平台化(我猜),如果你想使用DOM Range类中的方法,有些在设置rangy以使用Native Range

之前,它们将无法使用