我必须制作一个firefox插件,根据一个单词列表(可能有6500个单词)搜索加载的页面,高亮显示匹配,并在悬停时显示同义词。
因此,我使用的是HightlightRegex.js,它遍历dom并基于regex进行搜索,regex使用regex \bMyWord\b。
主要的问题是,当在一个有很多搜索词出现的页面上测试这个插件时,Firefox挂起一段时间(5-6秒),然后显示高光。这是发生在一个字,所以你可以想象会发生什么,如果我搜索6500字。
那么,我是否可以在后台线程中或异步地运行pageMod,并在不冻结UI的情况下突出显示匹配的单词?
您可以查看https://builder.addons.mozilla.org/addon/1042263/latest/的外接程序。
目前,插件并没有绑定到单独的选项卡上,而是作为一个整体在浏览器上运行,但我怀疑这会导致Firefox挂起。
我需要尽可能有效地做到这一点,所以我们非常欢迎你的建议。
发布于 2012-04-24 14:14:03
DOM通常不是线程安全的,除了主线程之外,您不能访问它。唯一的解决方案是将工作分解成较小的块,并使用setTimeout(..., 0)异步运行下一个块,而不阻塞所有内容。
发布于 2012-04-24 21:51:23
您可以尝试的一件事是使用页面工作者模块加载页面并处理它:
https://addons.mozilla.org/en-US/developers/docs/sdk/1.6/packages/addon-kit/page-worker.html
而且,正如Wladimir所建议的,只需使用异步代码搜索文档文本,以避免锁定firefox。
发布于 2012-05-20 05:12:51
正如canuckistani所暗示的,更好的解决方案只需要两个同步的DOM操作:读和写。撕开整个页面(更好的是,只撕开它的<body>),并将其发送到将执行高亮显示的异步工作人员或线程。当它完成时,工作人员会发出一个事件并传递突出显示的内容,现在该插件可以将其插入到页面中。
这样,唯一完成的同步操作是快速、廉价的,而其余的则是异步完成的,远离主线程。但是,canuckistani建议将页面加载到page-worker中:没有必要这样做,因为页面已经加载在选项卡中。只需加载一个假页面并插入实际内容。
https://stackoverflow.com/questions/10296275
复制相似问题