Javascript 在web worker中解析HTML DOM
我正在尝试使用firefox/chrome/safari扩展从网页中提取内容。捕获工作正常,但当我捕获整个网页时,需要很长时间,UI会被阻塞。我想将捕获/DOM解析代码移动到另一个线程(Web Worker)。但是web工作者没有访问DOM的权限。我有办法解决这个问题吗 我正在使用以下代码将脚本注入网页:Javascript 在web worker中解析HTML DOM,javascript,html,firefox-addon,web-worker,Javascript,Html,Firefox Addon,Web Worker,我正在尝试使用firefox/chrome/safari扩展从网页中提取内容。捕获工作正常,但当我捕获整个网页时,需要很长时间,UI会被阻塞。我想将捕获/DOM解析代码移动到另一个线程(Web Worker)。但是web工作者没有访问DOM的权限。我有办法解决这个问题吗 我正在使用以下代码将脚本注入网页: function executeScript(script, messageKey, callback) { var wm = Components.classes["@moz
function executeScript(script, messageKey, callback) {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
var mainWindow = wm.getMostRecentWindow("navigator:browser");
mainWindow.gBrowser.selectedBrowser.messageManager.loadFrameScript(script, true);
mainWindow.gBrowser.selectedBrowser.messageManager.addMessageListener(messageKey, callback);
}
executeScript("chrome://extension/content/contentscript.js", "onSelectionReceived", onSelection);
所有的DOM处理都是在这个脚本“contentscript.js”中进行的。如果您试图执行的工作需要与DOM交互,而且需要很长时间,并且您无法将其重构为不需要与DOM交互,那么有一种方法可以不使用WebWorkers (因为正如您所发现的,WebWorkers没有访问DOM的权限) 考虑使用数组处理。基本思想是将需要执行的工作划分为不同的块,在完成reach块工作后,使用计时器定期将控制权返回给DOM(UI线程) 以下是阵列处理的基本示例:
function saveDocument(id){
var tasks = [openDocument,writeText,closeDocument,updateUI]
setTimeout(function(){
//execute the next task
var task = tasks.shift();
task(id);
//determine if there's more
if (tasks.length > 0) {
setTimeout(arguments.calee, 25);
}
}, 25);
}
这里的“提取”是什么意思?我试图从当前选项卡中打开的网页中获取html数据。我正在使用firefox中的以下api向网页中注入一个脚本:一旦数据被解析,您希望数据看起来如何?@Jake我正在向网页中注入脚本,然后尝试发送一个JSON对象和处理后的数据。JSON对象中的每个属性都是一个字符串。问题是我无法访问web worker中的DOM。如果有替代方案。请建议。@quad_损坏:不,访问DOM必须发生在主线程上。因此,您可能应该询问如何改进捕获代码,使其不会阻塞UI,而不是使用web workers来完成他们无法完成的任务。术语
数组处理
实际上与这种方法无关。这个解决方案的核心作用在于它使用了异步执行
@WillemD'haeseleer,从技术上讲,这个术语可能是正确的。但我觉得你好像在吹毛求疵,因为我确实用外行的术语解释过,在每次工作之后,都要使用超时将控制权返回给DOM。你在it中的解决方案本身是好的,我的观点是,你不应该引入不存在的术语。你可以利用这些反馈来改进你的问题,甚至可能赢得我的支持票。