HTML Web Worker和Jquery Ajax调用

41
我想知道是否可以在 web worker 文件中使用 jQuery。谷歌浏览器给出了这个错误:"Uncaught ReferenceError: $ is not defined"。
这是代码: 父文件:
var loader = new Worker(BASE_URL + "js/rss_loader_worker.js");
// Ask the worker to start loading the RSS from the server
loader.postMessage("loadRss");
// When receive the response from the server
loader.onmessage = function (event) {
  console.log(event.data);
}

工作器文件:

onmessage = function (event) {
  if (event.data === "loadRss") {
    loadRss();
  }
}

/**
 * This function handles the AJAX request to the server side
 * then pass the content to the view page
 * @param none
 * @return html text
 */
loadRss = function () {
  $.ajax({
    data: {city: CITY_LOCATION},
    url: BASE_URL + "/getfeeds",
    onsucess: function (data) {

    }
  });
}

请帮忙,谢谢:)


导入脚本("jquery.js")无法工作:jQuery使用的'window'变量对Web Workers不可访问。 但是你可以使用另一个库来完成这个任务=) - Romain Durand
为了让搜索引擎更清楚,从Worker中运行ajax请求是可能的,并且通常是有益的。只是不能使用传统的jQuery,因为jQuery是一个DOM操作库,而Web Workers具有WorkerGlobalScope而不是Window,因此无法访问文档或DOM。 - buley
6个回答

39

不行,你不能这样做。没有访问非线程安全组件或DOM的权限,必须通过序列化对象在线程之间传递特定数据。因此,你需要非常努力地制造问题来破坏你的代码。jQuery是JavaScript DOM库

但你可以在worker中使用本机的XMLHttpRequest

并且,导入外部脚本不会通过一个script标签在页面中进行:在你的worker文件中使用importScripts()


好的,谢谢你的帮助。现在我明白了。我会另寻他法。 - Tri

25

也点个赞,因为您解释了关于DOM访问的问题。 - ametren

4

由于Web Worker在外部文件中,因此它们无法访问以下JavaScript对象:

  • window对象
  • document对象
  • parent对象

所以你不能在Worker文件内使用$。更好的方法是使用传统的AJAX,就像这样:

if (window.XMLHttpRequest)
{
  // code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
}
else
{
  // code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

参考 http://www.w3schools.com/html/html5_webworkers.asp

本文介绍了HTML5 Web Workers,Web Workers是在后台运行的JavaScript,可让浏览器在执行其他操作时继续运行脚本。它们可以提高Web应用程序的性能和响应速度,并允许长时间运行的脚本而不会导致页面停止响应。


1
非常抱歉我要挑剔一下,但如果您正在使用Web Workers,那么您只需要针对IE10+进行目标设置。因此,您的代码可能可以简化。 - Danny C
另一个需要注意的问题是,请链接到好的参考资料:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers - Andrew Ensley

3

jQuery主要用于操作DOM和处理网页。因此,它不适合于无法访问DOM的Web Workers。

你可能希望使用实用程序库而不是DOM库,例如underscore.js,或者有人应该制作一个jQuery Worker库,这是一个简化版的jQuery,没有所有DOM操作功能,只保留实用程序函数。


2
Node.JS的执行环境也缺乏本地DOM实现。我认为可以说Node.JS和HTML5 Web Workers共享某些限制。为了在Node.JS中使用jQuery,有一些模拟DOM实现的方法。如果你仍然想在Web Workers中使用jQuery,我认为你应该搜索Node.JS的解决方案并查看是否适用。

1

jQuery Hive是在jQuery中使用Web Workers的抽象,而不是相反的情况。 - thomaux
这个插件现在已经过时了。它的接口与您在当前jQ中使用的不同。 - Samuel
1
@Anzeo 当您编写DOM脚本时,应使用jQuery Hive。而在Worker内部应使用jQuery Hive Pollen。也许在撰写本文时,Pollen尚未推出。 - Gerard Sexton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接