2011-07-25 18 views
8

で働いて、私のFirefoxは喜んで動作しますが、Chromeはその文句:HTML5のWebワーカーは、Firefox 4ではなく、クロム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> 

は、私はそれがクロムで動作させるために何ができるか

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?私はhttp://playground.html5rocks.com/#inline_workers でサンプルと今回クロム作品を試してみたが、とき

ところで、Firefoxは

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

+1

あなたはworker.jsのための正しいコードを投稿しましたか?誤ってworker.htmlを再転記したようです。 – nrabinowitz

+0

はい、あなたは正しいです。私の悪い。私はworker.jsを貼り付けました。 – janetsmith

答えて

6

ことを、私はあなたがいない上、ローカルマシン上でこれを実行しようとしている推測している不平を言いますウェブサーバー。労働者はSame Origin Policyによって制限されないが、でも相対URLで、ローカルファイルをロードするリンクWikipediaのページのノート、

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

として、file:プロトコルを使用してファイルをロードすると同じですされています。だから私の推測では、ローカルファイルとしてworker.jsをロードしようとしているということです。Chromeはこれを(何らかのセキュリティ上の理由から)好きではありませんが、Chromeをこのように起動して強制することができます:chrome.exe --allow-file-access-from-files

また、ローカルまたはリモートのWebサーバーでスクリプトを実行し、問題が解決するかどうか確認してください。 (Pythonがインストールされている場合は、問題のディレクトリに移動してpython -m SimpleHTTPServer 8000を実行し、ブラウザでhttp://localhost:8000/に移動してください)。

+0

私はTomcat 7であなたの提案を試みました、それは完全に動作します! – janetsmith

+0

「良いセキュリティ上の理由」へのリンクを張ることはできないと思いますか?私はオンラインで検索しようとしましたが、あまり見つけられないようです。 -/ – Sophistifunk

+0

私はリンクを持っていませんが、あなたのシステム上のファイルにアクセスできる悪意のあるローカルWebページを誤って実行していると想像してください - それを読んで投稿してください特定のコマンドを起動する可能性もあります。一般的に悪い考え。 – nrabinowitz

5

クロムは--allow-file-access-from-filesを使わずにローカルで作業者を使用できます。作業員はブロブとしてロードする必要があります。

例:

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

ファイルworker_lib2.js:

function hello(msg) { 
    return 'Hello... ' + msg; 
} 
関連する問題