Лучший способ извлечь innerText вокруг getSelection()
Я работаю над расширением Chrome, которое будет извлекать URL-адрес в виде простого текста из выделения, но выделение всегда будет частью URL-адреса, поэтому мне нужно сканировать влево и вправо. В основном мне нужно извлечь 500 символов вокруг выделения из innerText, так как я не хочу анализировать HTML-элементы, а также не хочу повторно собирать textContent.
Вот что у меня пока есть, это работает довольно хорошо, но я чувствую, что есть лучший способ, который не изменяет объект документа, а затем восстанавливает его обратно в исходное состояние...
// create a random 8 digit number - or bigger since we don't want duplicates
var randId = Math.floor(Math.random()*(90000000)+10000000);
var selection = document.getSelection();
var selectionRange = selection.getRangeAt(0);
// backup content, and then clone selection the user has made
var selectionContents = selectionRange.cloneContents();
var selectionContentsTxt = selectionContents.textContent;
// add random number to previous selection, this will expand selection
selectionContents.textContent = randId;
selectionRange.insertNode(selectionContents);
// find the random number in the document (in innerText in document.body)
var everything = document.body.innerText;
var offset = everything.indexOf(randId);
// restore backed up content to original state,- replace the selection
selectionContents = selectionRange.extractContents();
selectionContents.textContent = selectionContentsTxt;
selectionRange.insertNode(selectionContents);
// now we have the selection location offset in document.body.innerText
everything = document.body.innerText;
var extract = everything.substring(offset-250, offset+250);
Извлечение содержит извлеченный текст, с разрывами строк и т. д., оцененные браузером. Кстати, это будет только Chrome, так что мне вообще не нужна перекрестная совместимость. Теперь я могу проанализировать выделение - от середины до краев, чтобы найти URL-адрес, обратите внимание, что начинать синтаксический анализ с середины очень важно, поэтому я не просто извлекал innerText из parentNode моего getSelection(), не зная смещений...
Есть ли лучший способ сделать это? возможно, копирование всего документа в DOMParser, но как мне применить к нему getSelection из исходного документа?
------ ОБНОВИТЬ ------
Я упростил приведенный выше код (забыл упомянуть, что я работаю с щелчками мыши, поэтому я определяю щелчок события после двойного щелчка, чтобы выделить какой-либо текст), и теперь он находит значение caretOffset в document.body.innerText, но все равно изменяет документ, а затем восстанавливает его, поэтому все еще думает о лучшем способе сделать это. Мне интересно, если insertNode и deleteContents это плохо в некотором роде?
var randId = Math.floor(Math.random()*(90000000)+10000000);
var range = document.caretRangeFromPoint(event.clientX, event.clientY);
range.insertNode(document.createTextNode(randId));
var everything = document.body.innerText;
var offset = everything.indexOf(randId);
range.deleteContents();
var everything = document.body.innerText;
var extract = everything.substring(offset-250, offset+250);
document.getSelection().anchorNode.parentNode.normalize();
Какие-нибудь мысли?