Estoy trabajando en un proyecto que utiliza un web worker.

En mi sección de la cabeza tengo este código:

var worker = new Worker("worker.js");
//More code

Esto funciona bien en Safari, pero Chrome reporta el siguiente error:

Uncaught SecurityError: Failed to create a worker: script at '(path)/worker.js' cannot be accessed from origin 'null'.

Por qué funciona perfectamente en Safari pero no en Chrome? ¿Cómo puedo solucionar este problema?

Gracias.

  • Estás trabajando en el archivo de protocolo? Si se establece el acceso a la bandera y a ver si funciona: stackoverflow.com/questions/18586921/…
  • Sí, la ruta de acceso de la web trabajador es este: file:///E:/programming/web/project/worker.js. La ruta de acceso para el proyecto principal es este: file:///E:/programming/web/project/index.html.
  • Intente esto: stackoverflow.com/questions/18586921/…
InformationsquelleAutor Progo | 2014-01-28

14 Comentarios

  1. 73

    Chrome no dejar que la carga de la web a los trabajadores cuando se ejecuta secuencias de comandos desde un archivo local.

    • Para qué buenas razones?
    • Desde esta respuesta, Loading a local file, even with a relative URL, is the same as loading a file with the file: protocol. — y no es genial para las páginas web para poder acceder a su sistema de archivos en un capricho.
    • -1 firsfox te permitirá hacer esto, por supuesto, siempre te vas a también usando el archivo como archivo de origen (por ejemplo. estás viendo el archivo local en el navegador). Es sólo chrome que está roto.
    • Firefox todavía funciona (sí, de file://), Chrome no en este caso.
  2. 47

    Yo uso una solución. Chrome bloquea Worker pero no <script>. Por lo tanto la mejor manera de hacer una solución universal es este:

    function worker_function() {
        //all code here
    }
    //This is in case of normal worker start
    //"window" is not defined in web worker
    //so if you load this file directly using `new Worker`
    //the worker code will still execute properly
    if(window!=self)
      worker_function();

    Usted, a continuación, enlace como normal <script src="...". Y una vez que la función está definida, se utiliza esta abominación de un código:

    new Worker(URL.createObjectURL(new Blob(["("+worker_function.toString()+")()"], {type: 'text/javascript'})));
    • Esta es una genial solución, gracias.
    • Esta solución es buena. ¿por qué en este mundo nada es perfecto? Cada software está agitando los usuarios con errores,defectos,infantil-comportamientos etc. Firefox también es arrogante se niega a apoyar el «clip-path» propiedad de css.
    • Yo no soy un js dev y no conseguir el punto de la etiqueta de script a utilizar aquí. Y ¿qué es la ventana != self check para? Por favor alguien puede explicar esto de la secuencia de carga? Thx.
    • Etiquetas de secuencia de comandos será cargado por google chrome, si están en el mismo directorio como HTML. window!=seld comprueba si se está ejecutando el código en la web del trabajador. Esto hace que este código portátil en caso de que se carga el archivo javascript directamente en otros contextos.
    • te refieres a si la ventana != yo es verdadera, se ejecuta código en webworker contexto? Yo estaba con el google y no pude encontrar este tipo de verificación.
    • A continuación, google lo window y self variables decir en javascript. Verás que window no está definido en el web de los trabajadores.
    • Lo consiguió. Gracias por las respuestas y la buena solución.
    • pregunta tonta, pero soy bastante nuevo en la web los trabajadores… lo que pasa en el ‘worker_function’? gracias…
    • El código que se debe ejecutar en la web trabajador contexto.
    • Debo señalar que no se puede usar importScript de un trabajador por escrito como este. Al menos, no sin una solución adicional. Así que usted necesitará más la manipulación de un multi-archivo trabajador.
    • cómo hacer u depuración de este código, si se convierte por blob?
    • Bueno bro! Gracias
    • gracias por esta solución, pero ¿cómo pasar argumentos al trabajador? Antes de que se utilice BackgroundWorker.postMessage(xArgs);. El postMessage función es todavía el gatillo para el trabajador, sino el xArgs no se pasan. Hay un aprouch para pasar argumentos a los trabajadores con esta solución? Mi console.log parece Blob {size: 1420, type: "text/javascript"} WorkerMain.js:17, blob:null/94d14ccf-19a8-4322-aff9-9519ab9359d8 WorkerMain.js:21, {array: Array(16)} (el argumento de que debe pasarse) blob:null/94d14ccf-19a8-4322-aff9-9519ab9359d8:3 WORKER START undefined
    • Probablemente lo estés haciendo algo mal. Usted debe preguntar a una pregunta por separado acerca de no ser capaz de postMessage
    • También me di cuenta de eso, pero stringify la variable pasar (json) var json = JSON.stringify(xJsonArgs); y que pase como new Worker(URL.createObjectURL(new Blob([(${xFunction.toString()})(${json})], { type: 'text/javascript' }))); funciona para mí. Gracias por tu respuesta.

  3. 33

    El problema ha sido debidamente explicado por Nobles de Pollo, pero tengo una solución más general para ello. En lugar de instalar wamp o xamp, con python puede navegar hasta la carpeta de tu proyecto está alojado en y escriba: python -m http.server

    Sólo eso, y usted se tiene un servidor en ejecución en esa carpeta, accesible desde localhost.

    • Mac probablemente tendrá que ir con python -m SimpleHTTPServer 8000 ya que está cargado con < Python 3 (sólo para salvar a otro de búsqueda de google :D)
    • también puede instalar el servidor http de nodo del módulo y, a continuación, desplácese hasta la carpeta deseada de la terminal y ejecutar ‘http-server-p 3000’.
    • vale la pena mencionar esta secuencia de comandos «python -m http.el servidor de» la necesidad de Python 3.
    • También trate de php -S localhost:8000
  4. 28

    También puede utilizar el –allow-archivo-acceso-de-archivos bandera al lanzamiento de Chrome.

    Ejemplo para MacOsX :

    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files

    Más info : Web trabajador de la configuración de chrome

    • En la ventana de comandos de windows, localice: «C:\Users\NAME\AppData\Local\Google\Chrome SxS\Application», a continuación, ejecute chrome.exe –allow-archivo-acceso-de-archivos, copiar ruta de archivo local por ejemplo, c:\temp\myWeb\index.html y pegar en la barra de direcciones del navegador, de hecho.
    • También puede crear un acceso directo y pasar la bandera en la ruta de destino.
    • Ah, y de los vinculados pregunta, recuerda cerrar todas las ventanas de Chrome antes de iniciar con la bandera.
    • Sí, otra opción también puede ser el código de una Extensión de Chrome con derecho a permiso en su manifiesto : «permisos»: [«file://*/*»], como en stackoverflow.com/questions/19493020/…
  5. 8

    Es debido a las restricciones de seguridad. Usted necesidad de utilizar http:// o https:// protocolo en lugar de file:///.

    Si usted tiene instalado NodeJS, usted puede simplemente hacer lo siguiente.
    – Tenga en cuenta que esta es una de las muchas opciones disponibles

    Instalar local-web-server

    $ npm install -g local-web-server

    Ahora se puede utilizar en cualquier carpeta a la que desea acceder a los contenidos a través de http .

    $ ws

    Vaya a http://localhost:8000 (puerto predeterminado: 8000)

  6. 6

    Yo tenía el mismo problema que tu post también. La solución es que usted tiene que ejecutar con localhost (wamp o xamp). Va a hacer.

    • Esa es otra buena solución.
    • Wow, yo nunca habría encontrado esto … gracias! (Espero que gracias están permitidos en los comentarios)
  7. 3

    necesita un servidor web para la solicitud de protocolo HTTP en Lugar de archivos local
    y funcionan correctamente 🙂

    • Tú No. Es necesario hacer caso omiso de los navegadores que no siguen los estándares web sólo porque ellos son los principales.
  8. 3

    Chrome carga el archivo pero no se puede ejecutar. Uso Firefox. Se está trabajando para mí.

    • Para explicar mi downvote: Este puede ser mejor comenzar con un comentario, tal vez averiguar más acerca de su navegador requerimientos de apoyo, en lugar de ser presentada como la respuesta. Parece bastante probable que no una respuesta, dado lo que el usuario ya ha dicho acerca de la compatibilidad con navegadores.
    • Si has leído la pregunta cuidadosamente estoy seguro de que usted no va a voto de la respuesta como tres antes de que hasta votar! El usuario está diciendo que el Chrome no se puede cargar el trabajador. No, el cromo puede cargar el trabajador, pero no se puede ejecutar. Las razones por las que me puso como una respuesta es la primera pregunta es de hace un año y la segunda de muchas de las respuestas están diciendo que Firefox no se está ejecutando el trabajador que no puedo comentar todos ellos. Sólo estoy explicando pero has derecho a voto o hasta votar.
  9. 2

    Con Python 2.x ser más ampliamente desplegado de Python 3.x, algo así como python -m SimpleHTTPServer 8000 es de aplicación más general, y no sólo para Mac OS X. me pareció necesario para el uso bajo Cygwin, por ejemplo.

    Con que en el lugar, este ejemplo trabajado como un campeón.

  10. 1
    function worker_fun(num){
        num ++
        //console.log(num)
        postMessage(num);
        setTimeout(worker_fun.bind(null,num), 500)
    }
    
    var w
    
    function startWorker(){
        var blob = new Blob([
            "onmessage = function(e){\
                " + worker_fun.toString() + "\
                worker_fun(e.data.num);}"
        ]);
        var blobURL = window.URL.createObjectURL(blob);
        if (typeof(Worker) != 'undefined'){
            if (typeof(w) == 'undefined'){
    
                w = new Worker(blobURL);
                w.onmessage = function(event){
                    document.getElementById('num').innerHTML = event.data;
                } 
                w.postMessage({
                   num:parseInt(document.getElementById('num').innerHTML)})
            }
        }
    }
    
    
    function stopWorker() { 
        w.terminate();
        w = undefined;
    }

    Como se mencionó chrome no lo admite. Me gusta definir mi a los trabajadores en el mismo archivo. Esta es una solución que se incrementará un número encontrado en el innerHTML del elemento con el id=num cada 500ms.

  11. 1

    Manera fácil de hacer servidor http local en chrome es esta aplicación:

    Servidor Web para Chrome

    https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb/related

    Descripción:

    Un Servidor Web para Chrome, sirve las páginas web desde una carpeta local a través de la red, utilizando el protocolo HTTP. Funciona sin conexión.
    Servidor Web para Chrome es una fuente abierta (MIT) servidor HTTP para Chrome.

    Se ejecuta en cualquier lugar que usted tiene Chrome instalado, así que usted puede tomar en cualquier lugar. Incluso funciona en el BRAZO chromebooks.

    Ahora tiene la opción de escuchar en la red local, para que otros equipos puedan acceder a sus archivos. Además, se puede intentar y conseguir una dirección de internet.

    Muchas personas utilizan esto para hacer básicos de desarrollo web en un chromebook. También es útil para el intercambio de archivos a través de una red local entre equipos, o incluso en internet.

    Una vez que lo instale, vaya a http://127.0.0.1:8887

    Y no es insegura como bandera –allow-archivo-acceso-de-archivos

  12. 0

    Probablemente, la razón es chrome no dejar que la carga de la web a los trabajadores cuando se ejecuta secuencias de comandos desde un archivo local. Y yo trato de ejecutar el código en mi firefox, no puede tampoco.

    • Los Web workers funcionando bien en file:// en Firefox 51.0.1
  13. -3

    Sí, no va a funcionar en chorome si su carga de archivos local. Pero funciona bien en el navegador firefox. Y usted tiene que agregar a continuación el código en un archivo HTML.

    <head>
        <meta charset="UTF-8" />
    </head>

Dejar respuesta

Please enter your comment!
Please enter your name here