Как получить доступ к jQuery в веб-работнике HTML 5 - программирование
Подтвердить что ты не робот

Как получить доступ к jQuery в веб-работнике HTML 5

Я не могу получить доступ к jQuery внутри веб-рабочего HTML5. Есть ли способ, которым я могу это сделать?

4b9b3361

Ответ 1

tl; dr: включить этот script перед jQuery

JQuery инициирует доступ к множеству свойств document для проверки функций браузера. document не определен в Worker, и вы фактически не можете создать экземпляр document в веб-работниках в данный момент. JQuery не готов к этому - как вы могли видеть в комментариях к вашему вопросу, никто, кажется, не понимает, что бы вы сделали с JQuery без DOM.

Поскольку, как я уже сказал, для инициализации 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);

Тест script

Позволяет вам попробовать разные версии JQuery с помощью script.

JSfiddle

Убедитесь, что вы используете http://, мой домен не работает с https://.

Загрузить как script

Ответ 2

Кто-нибудь пробовал jQuery - No DOM Edition? https://github.com/kpozin/jquery-nodom.

Это небольшое подмножество библиотеки jQuery, предназначенное для использования в контекстах Web Worker, где большая часть API браузера не существует.

Это достигается, прежде всего, путем изменения инструкций сборки jQuery (Makefile) только для включения модулей, отличных от DOM.

Это может помочь решить проблему, так как эта сборка не имеет зависимости DOM, которая является препятствием при импорте jQuery в webworker. Попытаемся предоставить некоторый пример кода для этого

Ответ 3

Ответ 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; }
}

Ответ 4

Есть хороший плагин для использования Web Worker с jQuery одним из собственных лидеров jQuery. Проверьте его плагин на GitHub.

Ответ 5

Используется ли:

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

Не работает, как ожидалось? Я подозреваю, что он будет загружать jQuery без проблем, но большинство вызовов, связанных с good-ole $, не будут работать так, как ожидалось, поскольку в WebWorker нет доступа DOM.

Ответ 6

В качестве альтернативы вы можете использовать Cheerio.

Быстрая, гибкая и плавная реализация основного jQuery специально для сервера.

Вам просто нужно browserify модуль и загрузить результирующий файл в ваш веб-рабочий. Затем вы сможете проанализировать свой строковый документ и запросить его, как это делает jQuery:

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