2011-07-25 18 views
8

çalışmak, benim firefox mutlu çalışır ancak krom şikayet:HTML5 Web İşçileri Firefox 4'te değil Chrome 12.0.742.122

Uncaught TypeError: Cannot call method 'postMessage' of undefined xstartWorkerworker.html:7 (anonymous function)worker.html:1 onclickworker.html:2

worker.html

<button onclick="xstartWorker()">Start worker</button> 
<output id="result"></output> 
<script> 
function xstartWorker() 
{ 
    worker.postMessage({'cmd': 'startWorker', 'msg': 'Start now!'}); 
} 

var worker = new Worker('worker.js'); 

worker.addEventListener('message', function(e) 
    { 
     document.getElementById('result').textContent = e.data; 
    } 
    , false); 
</script> 

Ben krom çalışır hale getirmek için ne yapabilirsiniz

self.addEventListener('message', function(e) 
{ 
    var data = e.data; 
    switch (data.cmd) 
    { 
    case 'startWorker': 
     self.postMessage('worker thread start now:' + data.msg); 
     break; 
    default: 
     self.postMessage('default'); 
    } 
} 
, false); 

worker.js? Ben http://playground.html5rocks.com/#inline_workers de örnek ve bu kez krom işleri çalıştı, ama ne zaman

BTW, firefox

Error: worker is undefined Source File: http://playground.html5rocks.com/ Line: 39

+1

Eğer worker.js için doğru kodu sonrası mı? Yanlışlıkla worker.html dosyasını yeniden yayınlamış gibi görünüyor. – nrabinowitz

+0

Evet, haklısınız. Benim hatam. Worker.js dosyasını şimdi yapıştırdım. – janetsmith

cevap

6

ben değil üzerinde, yerel makinenizde bu çalıştırmak için çalışıyoruz tahmin ediyorum şikayet bir web sunucusu. İşçi Same Origin Policy tarafından kısıtlanmış, hatta göreli bir URL ile, yerel bir dosya yükleme bağlantılı Vikipedi sayfası notları,

The behavior of same-origin checks and related mechanisms is not well-defined in a number of corner cases, such as for protocols that do not have a clearly defined host name or port associated with their URLs (file:, data:, etc.).

olarak, file: protokolü ile bir dosyayı yüklerken aynıdır edilir. Benim tahminim şu ki, sorun yerel bir dosya olarak worker.js'u yüklemeye çalıştığınızdır - Chrome'u (bazı iyi güvenlik nedenleriyle) bu durumu beğenmemekle birlikte, Chrome'u şu şekilde başlatarak zorlayabilirsiniz: chrome.exe --allow-file-access-from-files

Alternatif olarak, komut dosyanızı yerel veya uzak bir web sunucusunda sunmayı deneyin ve sorunun giderilip giderilmediğini görün. (Python yüklüyse, söz konusu dizine gidebilir ve python -m SimpleHTTPServer 8000'u çalıştırabilir, ardından tarayıcınızda http://localhost:8000/'a gidebilirsiniz).

+0

Önerinizi Tomcat 7 ile denedim, mükemmel çalışıyor! – janetsmith

+0

Bu "iyi güvenlik nedenleriyle" bir bağlantı kurabileceğinizi sanmıyorum? İnternette aramayı denedim ve çok fazla şey göremiyorum. Sadece dosya sistemini kullanarak yerel olarak geliştirebilirsek çok güzel olurdu: -/ – Sophistifunk

+0

Bir bağlantım yok, fakat sisteminizde herhangi bir dosyaya erişebilecek kötü niyetli bir yerel web sayfasını yanlışlıkla çalıştırmayı hayal edin - okuyun, gönderin keyfi bir sunucuya, potansiyel olarak bazı komutları bile çağırır. Genellikle Kötü Bir Fikir. – nrabinowitz

5

Chrome, çalışanı --allow-file-access-from-files olmadan yerel olarak kullanabilir. İşçinin blob olarak yüklenmesi gerekiyor.

Örnek:

<body> 
    <button>Start</button> 
    <div id="output"></div> 
    <script id="worker_1" type="text/js-worker"> 
     importScripts(base_url + '/worker_lib2.js'); 

     function run(event) { 
      var msg = event.data; 
      this.postMessage({ answer: hello(event.data.name)}); 
     } 

     this.addEventListener('message', run, false); 
    </script> 

    <script> 
     var base_url = window.location.href.replace(/\\/g,'/').replace(/\/[^\/]*$/, ''); 
     var array = ['var base_url = "' + base_url + '";' + $('#worker_1').html()]; 
     var blob = new Blob(array, {type: "text/javascript"}); 

     $('button').click(function() { 
      var url = window.URL.createObjectURL(blob); 
      console.log(url); 
      var worker = new Worker(url); 
      worker.addEventListener('message', function(event) { 
       $('#output').html(event.data.answer); 
      }, false); 
      worker.postMessage({ 
       name: 'Yannis' 
      }); 
     }); 
    </script> 
</body> 

dosya worker_lib2.js:

function hello(msg) { 
    return 'Hello... ' + msg; 
}