1

我正在开发一个 Chrome 扩展程序,它将从选择中提取纯文本 url,但选择始终是 url 的一小部分,所以我需要左右扫描。我基本上需要从 innerText 的选择中提取 500 个字符,因为我不想解析 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);

extract 保存由浏览器评估的提取文本、换行符等。顺便说一句,这只是 Chrome,所以我根本不需要交叉兼容性。现在我可以解析选择 - 从中​​间到边缘找到 url,注意从中间开始解析很重要,所以我不只是从我的 getSelection() 的 parentNode 中提取一个 innerText 而不知道偏移量......

有没有更好的方法来做到这一点?也许将整个文档复制到 DOMParser,但是如何将原始文档中的 getSelection 应用到它?

- - - 更新 - - -

我已经简化了上面的代码(忘了提到我正在使用鼠标点击,所以我检测到事件点击,在双击以选择一些文本后),现在它在 document.body.innerText 中找到了 caretOffset 但它仍然修改了文件然后恢复它,所以仍然在想一个更好的方法来做到这一点。我想知道 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();

有什么想法吗?

4

0 回答 0