2016-03-31 6 views
2

Ich möchte Daten aus einer HTML-Zeichenfolge in einem Web Worker extrahieren.CSS-Auswahl in Web Workers?

Ich möchte dies klar machen Ich möchte nicht das DOM manipulieren. Ich sende eine HTML-Zeichenfolge an den Web Worker, der dann Daten aus dem HTML extrahieren und die extrahierten Daten zurückgeben soll.

im Browser kann ich tun:

var html = $("<body><div>...more html...</div></body>"); 

    var extractedText = $(".selector", html).text(); 

Meine Frage:

Was ist das Äquivalent des obigen Codes in einer Umgebung mit Web Worker, wenn den gleichen HTML-String gegeben? Es gibt kein jQuery, kein DOMParser, kein querySelector im Web Worker usw. Gibt es Alternativen?

die Warum:

ich in einem Browser im Fluge Schaben von Seiten mache und will nicht den UI-Thread blockieren, weil es ziemlich schwere Arbeit ist.

Ich habe jsdom, cheerio usw. angeschaut, aber ich konnte nicht herausfinden, wie man sie zum Laufen bringt.

Bezüglich vorgeschlagen Duplikate:

Ich habe beide der vorgeschlagenen Duplikate überprüft und sie sind diejenigen, die ich vorher gelesen haben, während für Antworten auf diese Frage zu suchen. Sie adressieren das XML-Parsing und nicht das HTML-Parsing und behandeln auch nicht die Verwendung der CSS-Auswahl in Web Workers.

+0

Mögliches Duplikat [Parsen von XML in einem Web-Worker] (http://stackoverflow.com/questions/10494632/parsing-xml-in-a-web-worker) und [Parsen von XML in einem Web-Worker] (http : //stackoverflow.com/questions/9133918/parsing-xml-in-web-workers) – Kaiido

+0

@Kaiido Ich habe beide überprüft, sie lösen dieses Problem nicht. – yehyaawad

+0

@dandavis querySelector & jQuery's AJAX existiert leider nicht in der Web-Worker-Umgebung. – yehyaawad

Antwort

0

Kurze Antwort:

Sie können nicht jede Art von HTML/CSS-Manipulation tun, einschließlich der Abfrage, in einem Web-Arbeiter.

Lange Antwort:

Es gibt viele Dome. Es gibt das Haupt-DOM, das auf der Seite gerendert wird, aber alles, was ein Browser tut, der eine HTML- oder XML-Struktur berührt, einschließlich querySelector und Freunde, erfordert, dass der Browser ein DOM für diese Struktur erstellt. (Siehe auch: DocumentFragment)

Einer der Mozilla-Entwickler sprachen ein wenig über einige Gründe, warum sie keinen Dom auf Worker-Threads nicht bauen kann (gefunden über this question, auf nabble):

Sie gehen davon aus dass keiner der DOM-Implementierungscodes jemals irgendeine Art von Nicht-DOM-Objekten verwendet, oder dass, wenn dies der Fall ist, diese Objekte vollständig threadsicher sind. Das ist einfach nicht der Fall, zumindest in Gecko.

Das Problem in diesem Fall ist nicht das gleiche DOM-Objekt auf mehreren Threads berührt. Das Problem besteht darin, dass zwei DOM-Objekte in verschiedenen Threads ein globales drittes Objekt berühren.

Zum Beispiel hat der XML-Parser einige Dinge zu tun, dass in Gecko kann nur auf dem Haupt-Thread ausgeführt werden (DTD Laden, freihändig, es gibt ein paar andere, die ich vor, aber kann mich nicht erinnern offhand gesehen habe) .

So. Wir können natürlich nicht querySelector, createElement oder etwas Nützliches in einem Worker verwenden. Was können wir also tun?

eigenen DOM-Parser/Auswahlmodule bauen, natürlich!

Nicht wirklich. Versuchen Sie, eine Kopie von htmlparser2 in Ihrem Arbeiter, vielleicht über browserify (so dass Arbeit ist seine eigene Frage). Damit und mit CSSselect zu ermöglichen querySelector-wie Auswahl, sollten Sie bereit sein zu gehen.

Zugegebenermaßen können Sie jQuery nicht mit diesen verwenden, aber für einfache Abfragen müssen sie (und querySelector/querySelectorAll) mehr als ausreichend sein.