HTML5内のjQueryにアクセスできません webworker 。それを行う方法はありますか?
JQueryは最初に多くのdocument
プロパティにアクセスして、ブラウザの機能をチェックします。 document
はWorkerで定義されておらず、現時点ではWebワーカーで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を試すことができます。
http://
を使用していることを確認してください。私のドメインはhttps://
で機能しません。
TomášZatoの答えは正しかったが、新しいjQueryバージョンでは機能しなくなった。 jQuery3.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 。
これは、ほとんどのブラウザAPIが存在しないWebWorkerコンテキストでの使用を目的としたjQueryライブラリの小さなサブセットです。
これは主に、jQueryビルド命令(Makefile)を変更して非DOMモジュールのみを含めることで実現されます。
このビルドにはDOM依存関係がないため、これは問題の解決に役立つ可能性があります。これは、WebworkerにjQueryをインポートする際のハードルです。このためにすぐにいくつかのサンプルコードを提供しようとします
JQuery独自のリーダーの1人がjQueryでWebWorkerを使用するためのNiceプラグインがあります。チェックアウト GitHubの彼のプラグイン 。
使用していますか:
importScripts("jQueryWhatever.js");
$.blahblahblah();
期待どおりに動作しませんか?問題なくjQueryをロードできると思いますが、WebWorker内にDOMアクセスがないため、good-ole $に関連付けられたほとんどの呼び出しは期待どおりに機能しません。
別の方法として、 Cheerio を使用できます。
サーバー専用に設計されたコアjQueryの高速で柔軟かつ無駄のない実装。
browserify モジュールを作成し、 結果のファイル をWebワーカーにロードするだけです。次に、jQueryと同じように、文字列ドキュメントを解析してクエリを実行できるようになります。
$ = cheerio.load('<h2 class="title">Hello world</h2>')