2012-04-24 22 views
1

我必须制作一个Firefox插件,用于搜索加载页面上的单词列表(可能包含6500个单词),并突出显示匹配项并显示悬停时的同义词。在firefox addon sdk中运行pageMod后台线程?

所以我使用HightlightRegex.js遍历dom和基于正则表达式使用正则表达式搜索\ bMyWord \ b

最主要的问题是,当在有多次搜索词出现的页面上测试插件时,Firefox挂起一段时间(5-6秒),然后显示高亮显示。这发生在1个单词中,所以我可以想象如果我搜索6500个单词会发生什么。

那么有没有什么办法可以在后台线程或异步运行pageMod,并在不冻结UI的情况下突出显示单词?

你可以看看附加在https://builder.addons.mozilla.org/addon/1042263/latest/

目前该加载项是不依赖于单独的选项卡,并运行作为一个整体上的浏览器,但我怀疑这会导致Firefox挂起。

我需要尽可能有效地做到这一点,所以建议非常受欢迎。

回答

1

DOM通常不是线程安全的,您无法从主线程以外的任何地方访问它。唯一的解决方案是将工作分解为更小的块,并使用setTimeout(..., 0)异步运行下一个块,而不会阻塞所有内容。

+0

请您详细说明一下吗?即使我在setTimeout中执行搜索,在设置超时函数正在运行时也不会执行该搜索。一个简单的例子来解释这一点会很有帮助。 – 2012-04-25 05:12:47

+0

@PankajKumar:是的,它会阻止 - 这就是为什么只有一个小块应该在一个超时处理。然后它应该调用'setTimeout()'并允许浏览器在处理下一个块之前处理事件。 – 2012-04-25 05:19:41

1

正如canuckistani暗示的,更好的解决方案只需要两个同步的DOM操作:读取和写入。翻阅整个页面(或者,更好的办法是只有它的<body>)并将它发送到异步工作者或线程,这将执行突出显示。完成后,工作人员发出一个事件并传递突出显示的内容,该插件现在可以将其重新插入到页面中。

这样,唯一的同步操作是快速,廉价的操作,而其余的操作是异步完成的,远离主线程。但是,Canuckistani建议在page-worker中加载页面:不需要这样做,因为页面已经加载到标签中。只需加载一个虚假的页面并插入实际的内容。