web-dev-qa-db-fra.com

Appel Web HTML Worker et Jquery Ajax

Je me demande si je peux utiliser jQuery dans le fichier de travail Web. Google Chrome me donne cette erreur: "Uncaught ReferenceError: $ n'est pas défini".

Voici le code: Le fichier parent:

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);
}

Le dossier de travail:

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) {

    }
  });
}

Aidez-moi, merci :)

39
Tri

Non, vous ne pouvez pas . Il n'y a pas d'accès aux composants non thread-safe ou au DOM et vous devez passer des données spécifiques dans et hors d'un thread via des objets sérialisés. Vous devez donc travailler très dur pour provoquer des problèmes dans votre code. jQuery est une bibliothèque DOM JavaScript .

Mais vous pouvez cependant utiliser un XMLHttpRequest natif dans votre travailleur.

Et, importer des scripts externes ne passe pas par la page avec une balise script: utilisez importScripts () pour cela dans votre fichier de travail.

38
Caspar Kleijne

Voici ce que j'ai trouvé:

Vous pouvez charger des fichiers de script ou des bibliothèques externes dans un travailleur avec la fonction importScripts().

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

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

ou

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

Cependant, vous ne pouvez pas charger jQuery, car jQuery nécessite un accès DOM, ce que les travailleurs Web n'ont pas.

24
Sherzod

Étant donné que les travailleurs Web se trouvent dans des fichiers externes, ils n'ont pas accès aux objets JavaScript suivants:

  • L'objet fenêtre
  • L'objet document
  • L'objet parent

Vous ne pouvez donc pas utiliser $ à l'intérieur du fichier de travail. Mieux vaut utiliser le traditionnel AJAX quelque chose comme ça

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

Référence sur http://www.w3schools.com/html/html5_webworkers.asp

4
user1968960

jQuery est principalement destiné à travailler avec le DOM et à travailler avec des pages Web. Il n'est donc pas aussi adapté aux Web Workers qui n'ont pas accès au DOM.

Vous voudrez peut-être utiliser une bibliothèque d'utilitaires au lieu d'une bibliothèque DOM, comme nderscore.js , ou peut-être que quelqu'un devrait faire une bibliothèque jQuery Worker, une version allégée de jQuery sans toute la manipulation DOM fonctionnalité, tout en gardant les fonctions utilitaires.

2
Fred

L'environnement d'exécution dans Node.JS n'a pas non plus d'implémentation DOM native. Je pense qu'il est juste de dire que Node.JS et HTML5 Web Workers partagent certaines restrictions.

Il existe des moyens de simuler une implémentation DOM dans le but d'utiliser jQuery dans Node.JS. Si vous souhaitez toujours utiliser jQuery dans Web Workers, je pense que vous devriez rechercher les solutions Node.JS et voir si elles s'appliquent.

2
jokeyrhyme

jetez un oeil sur ce plug-in https://github.com/rwldrn/jquery-Hive

1
Alexandre