2011-01-29 12 views
38

Me pregunto si puedo usar jQuery dentro del archivo de trabajo web. Google Chrome me da este error: "Unbeught ReferenceError: $ no está definido".Trabajador web HTML y Jquery Ajax llame al

Aquí está el código: El archivo principal:

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

El archivo trabajador:

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

    } 
    }); 
} 

Por favor ayuda, gracias :)

+0

importScripts ("jquery.js"); no puede funcionar: jQuery usa la variable 'ventana', que no es accesible para los trabajadores web. Pero puede usar otra biblioteca que hará el trabajo =) –

+0

Para ser claros para los buscadores entrantes, es posible y a menudo beneficioso ejecutar solicitudes ajax de un 'Worker'. Simplemente no con 'jQuery' tradicional, ya que' jQuery' es una biblioteca de manipulación DOM y Web Workers tiene 'WorkerGlobalScope' y no' Window' y por lo tanto no tiene acceso al documento, o DOM. – buley

Respuesta

37

No, no puede . No hay acceso a componentes que no sean seguros para subprocesos o al DOM y debe pasar datos específicos dentro y fuera de un subproceso a través de objetos serializados. Entonces debes trabajar muy duro para causar problemas en tu código. jQuery es una biblioteca DOM de JavaScript.

Pero puede utilizar un XMLHttpRequest nativo en su trabajador sin embargo.

Y, la importación de scripts externos no pasa por la página con una etiqueta script: use importScripts() para eso en su archivo de trabajador.

+0

ok gracias por su ayuda. Está claro ahora. Encontraré otra forma. – Tri

2

El entorno de ejecución en Node.JS también carece de una implementación DOM nativa. Creo que es justo decir que Node.JS y HTML5 Web Workers comparten ciertas restricciones.

Existen formas de simular una implementación de DOM con el fin de utilizar jQuery en Node.JS. Si aún desea usar jQuery en Web Workers, creo que debería buscar las soluciones Node.JS y ver si se aplican.

1

echar un vistazo en este plug-in https://github.com/rwldrn/jquery-hive

+0

jQuery hive es una abstracción para usar web workers en jQuery, no al revés – thomaux

+0

Este plugin ya no está actualizado. Su interfaz difiere de lo que está acostumbrado en el jQ actual. – Samuel

+1

@Anzeo Si bien jQuery Hive se va a utilizar en las secuencias de comandos DOM frente a usted, jQuery Hive Pollen se debe utilizar dentro de su trabajador. Quizás en el momento de escribir, Polen no estaba disponible. –

22

Esto es lo que encontré:

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

o

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

Aunque no se puede cargar jQuery, porque jQuery requiere acceso DOM, que los trabajadores de la web no tienen.

+0

Upvoted para responder a la pregunta en un fasion más general – Tarynn

+0

También votando porque explicó el problema con respecto al acceso DOM. – ametren

2

jQuery es principalmente para trabajar con DOM y trabajar con páginas web. Por lo tanto, no es tan adecuado para Web Workers que no tienen acceso al DOM.

Es posible que desee utilizar una biblioteca de utilidad en lugar de una biblioteca DOM, como underscore.js, o tal vez alguien debería crear una biblioteca jQuery Worker, una versión simplificada de jQuery sin toda la funcionalidad de manipulación DOM, simplemente manteniendo el funciones de utilidad.

4

Dado que los trabajadores web están en archivos externos, que no tienen acceso a los siguientes objetos JavaScript:

  • La ventana de objeto
  • El documento objeto
  • El objeto principal

Entonces no puede usar $ dentro del archivo de trabajador. Mejor puede utilizar AJAX tradicional algo como esto

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

referencia a http://www.w3schools.com/html/html5_webworkers.asp

+1

Mis disculpas por la nitidez, pero si está usando las probabilidades de los Trabajadores web, de todas maneras está apuntando a IE10 +. Entonces su código probablemente podría simplificarse. –

+0

Otro detalle para elegir. Por favor, enlace a * buenas * referencias: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers –

Cuestiones relacionadas