2011-01-29 19 views
38

Zastanawiam się, czy mogę użyć jQuery wewnątrz pliku web worker. Google Chrome podaje mi ten błąd: "Uncaught ReferenceError: $ is not defined".HTML Web Worker i Ajax jquery call

Oto kod: Plik nadrzędny:

var loader = new Worker(BASE_URL + "js/rss_loader_worker.js"); 
// Ask the worker to start loading the RSS from the server 
loader.postMessage("loadRss"); 
// When receive the response from the server 
loader.onmessage = function (event) { 
    console.log(event.data); 
} 

Plik pracownik:

onmessage = function (event) { 
    if (event.data === "loadRss") { 
    loadRss(); 
    } 
} 

/** 
* This function handles the AJAX request to the server side 
* then pass the content to the view page 
* @param none 
* @return html text 
*/ 
loadRss = function() { 
    $.ajax({ 
    data: {city: CITY_LOCATION}, 
    url: BASE_URL + "/getfeeds", 
    onsucess: function (data) { 

    } 
    }); 
} 

Proszę o pomoc, dziękuję :)

+0

importScripts ("jquery.js"); nie może działać: jQuery używa zmiennej "window", która nie jest dostępna dla pracowników sieci. Ale możesz użyć innej biblioteki, która wykona zadanie =) –

+0

Aby być czystym dla wyszukiwarek przychodzących, możliwe jest i często korzystne uruchamianie żądań ajaxowych z 'Worker'. Po prostu nie z tradycyjnym 'jQuery', ponieważ' jQuery' jest biblioteką manipulacji DOM, a pracownicy sieci mają 'WorkerGlobalScope', a nie' Window', a zatem nie mają dostępu do dokumentu lub DOM. – buley

Odpowiedz

37

Nie jesteś nie może. Nie ma dostępu do komponentów niezwiązanych z wątkami ani do DOM i musisz przekazywać określone dane do wątku i usuwać je poprzez serializowane obiekty. Musisz więc bardzo ciężko pracować, aby spowodować problemy w kodzie. jQuery to biblioteka DOM języka JavaScript.

Ale możesz użyć natywnego XMLHttpRequest w swoim robotniku.

Ponadto, importowanie zewnętrznych skryptów nie przechodzi przez stronę z tagiem script: użyj importScripts() dla tego w twoim pliku roboczego.

+0

OK dziękuję za pomoc. Teraz jest jasne. Znajdę inny sposób. – Tri

2

Środowisko wykonawcze w pliku Node.JS również nie ma macierzystej implementacji DOM. Sądzę, że można powiedzieć, że Node.JS i HTML5 Web Workers mają pewne ograniczenia.

Istnieją sposoby symulacji implementacji DOM w celu używania jQuery w pliku Node.JS. Jeśli nadal chcesz używać jQuery w Web Workers, myślę, że powinieneś poszukać rozwiązań Node.JS i sprawdzić, czy mają one zastosowanie.

1

spojrzeć na ten plug-in https://github.com/rwldrn/jquery-hive

+0

rój jQuery to abstrakcja do używania robotów sieciowych w jQuery, a nie odwrotnie. – thomaux

+0

Ta wtyczka jest już nieaktualna. Jego interfejs różni się od tego, do czego przyzwyczaiłeś się w obecnym jQ. – Samuel

+1

@Azeze Podczas gdy jQuery Hive ma być użyty w twoich skryptach skierowanych do DOM, pyłek jQuery Hive powinien być użyty wewnątrz twojego Robotnika. Może w momencie pisania tego artykułu Pollen nie był dostępny. –

22

Oto co znalazłem:

You can load external script files or libraries into a worker with the importScripts() function.

http://www.html5rocks.com/en/tutorials/workers/basics/#toc-enviornment-loadingscripts

importScripts('script1.js'); 
importScripts('script2.js'); 

lub

importScripts('script1.js', 'script2.js'); 

Chociaż nie można załadować jQuery, ponieważ jQuery wymaga dostępu do DOM, którego nie mają pracownicy WWW.

+0

Wzwyższony za udzielenie odpowiedzi na pytanie w bardziej ogólnej sprawie – Tarynn

+0

Również trwało, ponieważ wyjaśniłeś problem dotyczący dostępu do DOM. – ametren

2

jQuery służy głównie do pracy z DOM i pracy ze stronami internetowymi. Więc nie jest tak odpowiedni dla pracowników sieci Web, którzy nie mają dostępu do DOM.

Może zaistnieć potrzeba użycia biblioteki narzędziowej zamiast biblioteki DOM, takiej jak underscore.js, lub może ktoś powinien stworzyć bibliotekę jQuery Worker, pozbawioną światła wersję jQuery bez całej funkcjonalności manipulacji DOM, po prostu zachowując funkcje użytkowe.

4

Ponieważ pracownicy internetowe są w plikach zewnętrznych, nie mają dostępu do następujących obiektów javascript:

  • Okno obiekt obiekt
  • Dokument
  • Przedmiotem rodzic

Więc nie możesz użyć pliku $ inside worker. Lepiej można wykorzystać tradycyjne AJAX coś takiego

if (window.XMLHttpRequest) 
{ 
    // code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
} 
else 
{ 
    // code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 

Reference w http://www.w3schools.com/html/html5_webworkers.asp

+1

Moje przeprosiny za nitpicking, ale jeśli korzystasz z Web Workers, to znaczy, że celujesz tylko w IE10 +. Więc twój kod mógłby prawdopodobnie zostać uproszczony. –

+0

Kolejny gnój do wyboru. Podaj link do * dobrych * referencji: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers –