HTML Web Worker 和 Jquery Ajax 调用

Posted

技术标签:

【中文标题】HTML Web Worker 和 Jquery Ajax 调用【英文标题】:HTML Web Worker and Jquery Ajax call 【发布时间】:2011-06-17 20:31:51 【问题描述】:

我想知道是否可以在 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) 

    
  );

请帮忙,谢谢:)

【问题讨论】:

importScripts("jquery.js");不能工作:jQuery 使用'window' 变量,网络工作者无法访问该变量。但是您可以使用其他库来完成这项工作 =) 为了让入站搜索者清楚,从Worker 运行 ajax 请求是可能的,而且通常是有益的。与传统的jQuery 不同,因为jQuery 是一个DOM 操作库,而Web Worker 有一个WorkerGlobalScope 而不是Window,因此无法访问文档或DOM。 【参考方案1】:

不,你不能。无法访问非线程安全组件或 DOM,您必须通过序列化对象将特定数据传入和传出线程。所以你必须非常努力地在你的代码中引起问题。 jQuery 是一个 JavaScript DOM 库

但是您可以在您的工作人员中使用本机 XMLHttpRequest

而且,导入外部脚本不会通过带有script 标签的页面:在您的工作文件中使用importScripts()。

【讨论】:

好的,感谢您的帮助。现在很清楚了。我会找到另一种方式。【参考方案2】:

Node.JS 中的执行环境也缺少原生 DOM 实现。我认为可以公平地说 Node.JS 和 HTML5 Web Workers 有一定的限制。

为了在 Node.JS 中使用 jQuery,有一些方法可以模拟 DOM 实现。如果您仍然想在 Web Workers 中使用 jQuery,我认为您应该搜索 Node.JS 解决方案,看看它们是否适用。

【讨论】:

【参考方案3】:

看看这个插件https://github.com/rwldrn/jquery-hive

【讨论】:

jQuery hive 是在 jQuery 中使用 web worker 的抽象,而不是相反 这个插件现在已经过时了。它的界面与您在当前 jQ 中习惯的不同。 @Anzeo 虽然 jQuery Hive 将用于面向 DOM 的脚本中,但 jQuery Hive Pollen 将用于您的 Worker 内部。也许在撰写本文时,Pollen 不可用。【参考方案4】:

这是我发现的:

您可以使用 importScripts()函数。

http://www.html5rocks.com/en/tutorials/workers/basics/#toc-enviornment-loadingscripts

importScripts('script1.js');
importScripts('script2.js');

importScripts('script1.js', 'script2.js');

虽然,你不能加载 jQuery,因为 jQuery 需要 DOM 访问权限,而 web worker 没有。

【讨论】:

也赞成,因为您解释了有关 DOM 访问的问题。【参考方案5】:

jQuery 主要用于处理 DOM 和处理网页。所以它不太适合没有访问 DOM 的 Web Worker。

您可能想要使用实用程序库而不是 DOM 库,例如 underscore.js,或者也许有人应该制作一个 jQuery Worker 库,这是 jQuery 的精简版,没有所有 DOM 操作功能,只是保持实用函数。

【讨论】:

【参考方案6】:

由于网络工作者在外部文件中,他们无权访问以下 javascript 对象:

窗口对象 文档对象 父对象

所以你不能在工作文件中使用 $。更好的是你可以使用像这样的传统 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

【讨论】:

我很抱歉吹毛求疵,但如果您使用的是 Web Workers,那么您可能只针对 IE10+。所以你的代码可能会被简化。 另一个挑剔的人。请链接到 good 参考:developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/…

以上是关于HTML Web Worker 和 Jquery Ajax 调用的主要内容,如果未能解决你的问题,请参考以下文章

在vue中怎么使用Web Worker

是否可以在 ChromeCast 上的 Web Worker 中使用 setTimeout

HTML5多线程JavaScript解决方案Web Worker——专用Worker和共享Worker

HTML5多线程JavaScript解决方案Web Worker——专用Worker和共享Worker

Web Worker是什么

web worker 简介