Comment accéder à jQuery en HTML 5 web worker

Je ne peux pas accéder à jQuery à l'intérieur d'un travailleur Web HTML5. Est-ce que je peux faire ça?

Tl; dr: inclure ce script avant jQuery

JQuery accède initally beaucoup de propriétés de document pour vérifier les fonctionnalités du navigateur. document n'est pas défini dans Worker et vous ne pouvez pas créer une instance de Document dans les web workers en ce moment. JQuery n'est pas prêt pour cela – comme vous pouvez le voir dans les commentaires sur votre question, personne ne semble comprendre ce que vous feriez avec JQuery sans DOM.

Étant donné que, comme je l'ai dit, JQuery a besoin d'un document à initialiser, j'ai créé un faux document documental. Cet objet agit comme un document réel lors des tests 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;}; 

Veillez à ce que ce document faux soit uniquement destiné à permettre à jQuery de charger, il n'autorisera aucune opération DOM authentique.

Exemple d'utilisation:

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

Script de test

Vous permet d'essayer différentes versions de JQuery avec mon script.

JSfiddle

Vérifiez que vous utilisez http:// , mon domaine ne fonctionne pas avec https:// .

Télécharger en tant que script

Quelqu'un at-il essayé jQuery – No DOM Edition? https://github.com/kpozin/jquery-nodom .

Il s'agit d'un petit sous-ensemble de la bibliothèque jQuery destinée à être utilisée dans les contextes Web Worker, où la plupart des API du navigateur n'existent pas.

Ceci est obtenu principalement en modifiant les instructions de construction de jQuery (Makefile) pour inclure uniquement les modules non-DOM.

Cela pourrait aider à résoudre le problème car cette construction n'a pas de dépendance DOM, ce qui constitue un obstacle lors de l'importation de jQuery en tant que travailleur Web. Essayerons de fournir un certain code d'exemple bientôt pour cela

La réponse de Tomáš Zato était correcte, mais elle ne fonctionne plus avec la version jQuery plus récente. J'ai ajouté un peu plus pour 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; } } 

Il existe un bon plugin pour utiliser Web Worker avec jQuery par l'un des leaders de jQuery. Découvrez son plugin sur GitHub .

Utilise:

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

Ne fonctionne pas comme prévu? Je soupçonne qu'il va charger jQuery sans problème, mais la plupart des appels associés à good-ole $ ne fonctionneront pas comme prévu car il n'y a pas d'accès DOM dans un WebWorker.

En variante, vous pouvez utiliser Cheerio .

Mise en œuvre rapide, flexible et maigre de jQuery de base spécialement conçue pour le serveur.

Vous aurez simplement besoin de naviguer sur le module et de charger le fichier résultant dans votre travailleur Web. Ensuite, vous pourrez analyser votre document de chaîne et l'interroger comme jQuery:

 $ = cheerio.load('<h2 class="title">Hello world</h2>')