如何在HTML 5 Web worker中访问jQuery

我无法在HTML5 Web工作者中访问jQuery。 有没有办法可以做到这一点?

tl; dr:在jQuery之前包含这个脚本

JQuery最初访问许多document属性以检查浏览器function。 document未在Worker中定义,此时您实际上无法在Web worker中创建Document实例。 JQuery没有为此做好准备 – 正如你在评论中看到的那样,没有人似乎理解你在没有DOM的情况下对JQuery做什么。

因为,正如我所说,JQuery需要document初始化,我创建了一个假的伪文档对象。 在JQuery测试期间,此对象充当真实文档:

 var document = self.document = {parentNode: null, nodeType: 9, toString: function() {return "FakeDocument"}}; var window = self.window = self; var fakeElement = Object.create(document); fakeElement.nodeType = 1; fakeElement.toString=function() {return "FakeElement"}; fakeElement.parentNode = fakeElement.firstChild = fakeElement.lastChild = fakeElement; fakeElement.ownerDocument = document; document.head = document.body = fakeElement; document.ownerDocument = document.documentElement = document; document.getElementById = document.createElement = function() {return fakeElement;}; document.createDocumentFragment = function() {return this;}; document.getElementsByTagName = document.getElementsByClassName = function() {return [fakeElement];}; document.getAttribute = document.setAttribute = document.removeChild = document.addEventListener = document.removeEventListener = function() {return null;}; document.cloneNode = document.appendChild = function() {return this;}; document.appendChild = function(child) {return child;}; 

请注意,这个假文档只是为了允许加载jQuery,它不允许任何真正的DOM操作。

用法示例:

 importScripts("workerFakeDOM.js"); importScripts('jquery-2.1.4.min.js'); console.log("JQuery version:", $.fn.jquery); 

测试脚本

允许您使用我的脚本尝试各种版本的JQuery。

的jsfiddle

检查您是否使用http:// ,我的域无法使用https://

下载为脚本

TomášZato的答案是正确的,但不再适用于较新的jQuery版本。 我为jQuery 3.1.1添加了一些:

 var document = self.document = { parentNode: null, nodeType: 9, toString: function () { return "FakeDocument" } }; var window = self.window = self; var fakeElement = Object.create(document); fakeElement.nodeType = 1; fakeElement.toString = function () { return "FakeElement" }; fakeElement.parentNode = fakeElement.firstChild = fakeElement.lastChild = fakeElement; fakeElement.ownerDocument = document; document.head = document.body = fakeElement; document.ownerDocument = document.documentElement = document; document.getElementById = document.createElement = function () { return fakeElement; }; document.createDocumentFragment = function () { return this; }; document.getElementsByTagName = document.getElementsByClassName = function () { return [fakeElement]; }; document.getAttribute = document.setAttribute = document.removeChild = document.addEventListener = document.removeEventListener = function () { return null; }; document.cloneNode = document.appendChild = function () { return this; }; document.appendChild = function (child) { return child; }; document.childNodes = []; document.implementation = { createHTMLDocument: function () { return document; } } 

有没有人尝试过jQuery – 没有DOM版? https://github.com/kpozin/jquery-nodom

这是用于Web Worker上下文的jQuery库的一小部分,其中大多数浏览器API不存在。

这主要是通过修改jQuery构建指令(Makefile)以仅包含非DOM模块来实现的。

这可能有助于解决问题,因为此构建没有DOM依赖性,这在webworker中导入jQuery时是一个障碍。 将尝试尽快提供一些示例代码

有一个很好的插件可以通过jQuery自己的领导者之一使用Web Worker和jQuery。 看看他在GitHub上的插件 。

使用:

 importScripts("jQueryWhatever.js"); $.blahblahblah(); 

不按预期工作? 我怀疑它会毫无困难地加载jQuery,但是与good-ole $相关的大多数调用都不能正常工作,因为WebWorker中没有DOM访问。

作为替代方案,您可以使用Cheerio

快速,灵活和精简的核心jQuery实现,专为服务器而设计。

您只需要对模块进行浏览,然后将生成的文件加载到Web worker中。 然后,您将能够解析您的字符串文档并像jQuery一样查询它:

 $ = cheerio.load('

Hello world

')