Range
オブジェクトとdocument.execCommand
かなり簡単に選択を操作することができます。あなたの場合の主な問題は、範囲オブジェクトをテキスト形式で保存することです。
基本的には何が必要範囲オブジェクトを作成するために必要な値でありstartContainer
、startOffset
、endContainer
とendOffset
を得ることです。 Offsets
は数字なのでかなり簡単です。コンテナはノードです。これは文字列として直接保存することはできませんので、それが主な問題です。あなたができることの1つは、DOMにキーを追加してキーを保存することです。しかし、範囲コンテナはテキストノードなので、テキストノードのインデックスを保存する必要があります。このような何かは、再帰関数を使用して、キーでDOMをタグ付けできるようにする必要があります。
function addKey(element) {
if (element.children.length > 0) {
Array.prototype.forEach.call(element.children, function(each, i) {
each.dataset.key = key++;
addKey(each)
});
}
};
addKey(document.body);
これが完了すると、あなたは文字列として保存することができ、オブジェクトの範囲オブジェクトを変換することができます。このように:
これを使用して、ユーザーが作成した各選択を配列に保存できます。このように:
document.getElementById('textToSelect').addEventListener('mouseup', function(e) {
if (confirm('highlight?')) {
var range = document.getSelection().getRangeAt(0);
selectArray.push(rangeToObj(range));
document.execCommand('hiliteColor', false, 'yellow')
}
});
ハイライトを保存するには、各オブジェクトをJSONに保存します。これをテストするには、レンジオブジェクト配列からJSON文字列を取得するだけです。このように(これは、上部にあるのget Seletionボタンを使用している):
document.getElementById('getSelectionString').addEventListener('click', function() {
alert('Copy string to save selections: ' + JSON.stringify(selectArray));
});
空のHTMLを読み込むときに、あなたはJSONに保存されたオブジェクトからの範囲を作成します逆の機能を使用することができます。
オブジェクトに変換して追加できる範囲オブジェクトに変換する文字列の範囲の配列を持つことができます。次に、execCommandを使用して、いくつかの書式設定を行います。
document.getElementById('setSelection').addEventListener('click', function() {
var selStr = prompt('Paste string');
var selArr = JSON.parse(selStr);
var sel = getSelection();
selArr.forEach(function(each) {
sel.removeAllRanges();
sel.addRange(objToRange(each));
document.execCommand('hiliteColor', false, 'yellow')
})
});
参照:https://jsfiddle.net/sek4tr2f/3/
、これは動作しません場合がある。なお、メインこのように(これが一番上にセット選択ボタンを使用している、あなたはフィドルを更新した後にこれを行います)問題のあるケースは、ユーザが既に強調表示されたコンテンツのコンテンツを選択する場合である。これらのケースは処理できますが、より多くの条件が必要になります。
は、なぜあなたは、アレイ内の強調表示された単語のインデックス、およびその長さを保存しませんか? –
私は@mohammedessamに同意して、 'xyz'をハイライト表示するユーザーが 'xyz'を配列に追加し、 'xyz'の特定のインスタンスを示すインデックスを含むように配列を作成します(つまり、 'xyz'のインスタンスはインデックスが3になります。 – tamak
'innerHTML.indexOf(text)'は何かを提供しますが、インデックスだけでなく、 'ReferenceError'の可能性もあります。 – KooiInc