JS挑战:在页面重新加载时将更改的文本加载到DOM中

时间:2015-04-16 15:08:01

标签: javascript jquery google-chrome-extension

我正在开发一个JS chrome扩展程序,允许用户修改任何网页上的文本。挑战在于,当用户再次访问网页时,他/她应该看到修改后的文本而不是原始页面的文本。 让我们假设用户只能修改段落元素(p)

换句话说,在页面加载时,扩展程序需要扫描文档 - 找到匹配的文本并进行修改。

这是具有挑战性的问题因为:
- 在两次访问之间,页面可能会发生变化 - 可能有任意数量的文本出现。例如,字符串"我是忍者"可能会在页面中出现10次。 - 其他扩展也可以修改DOM(谁知道用户安装了哪些扩展)。 - 这需要在任何网页上工作

在后续页面访问中,当用户需要查看他/她修改过的文本时 - 您将如何确定要修改的文本?现在我正在进行简单的字符串匹配这远非理想。

理想情况下,我将使用一个函数扫描文档中的每个元素,并返回一个百分比确定度(0-1),表示这是用户修改的元素。

FOOTNOTE: 我意识到会有一些情况会完全修改页面并且找不到元素但是,我对这些实例不感兴趣 - 在这些情况下,我会以不同的方式呈现

1 个答案:

答案 0 :(得分:1)

简单地考虑一下,我想出了这个(但不是完整的解决方案): 每当用户选择要修改的文本,右键单击并调用您的扩展时,您应该做的是:

使用SelectionRange个对象获取最近的正确节点(具有类和ID)(如果不存在,则只是最近的节点)存在。我假设标记的文字不能在textareainput元素内。然后,获取所选文本的offset。抓取最近的正确节点的详细信息,即classid

将此所有数据存储到同步或本地配额存储中,然后使用此数据在用户下次访问该页面时重新显示文本。

请注意,这假定在以后的某个时间点不会修改这些正确的节点。比如,如果我在这个答案中标记了一些文字,那么删除答案的其他部分,这使得这些文本偏移左移,那么上述解决方案将无效。