Веб-работники HTML5 работают в Firefox 4, но не в Chrome 12.0.742.122 - PullRequest
9 голосов
/ 25 июля 2011

Когда я пытался поиграться с функцией Web Workers в HTML5, мой Firefox работал успешно, но Chrome жалуется, что:

Uncaught TypeError: Невозможно вызвать метод 'postMessage' из неопределенного xstartWorkerworker.html: 7 (анонимная функция) 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>

worker.js

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

Что я могу сделать, чтобы он работал в Chrome?

Кстати, когда я попробовал образец в http://playground.html5rocks.com/#inline_workers и на этот раз хром работает, но Firefox жалуется, что

Ошибка: рабочий не определен Исходный файл: http://playground.html5rocks.com/ Строка: 39

Ответы [ 2 ]

8 голосов
/ 26 июля 2011

Полагаю, вы пытаетесь запустить это на локальном компьютере, а не на веб-сервере. Работники ограничены Одинаковой политикой происхождения , но, как указано на связанной странице Википедии,

Поведение чеков одного происхождения и связанных с ними механизмов не четко определены в ряде ключевых случаев, например, для протоколов, которые не имеют четко определенного имени хоста или порта, связанного с их URL (файл :, данные: и т. Д.).

Загрузка локального файла, даже с относительным URL, аналогична загрузке файла по протоколу file:. Поэтому я предполагаю, что проблема в том, что вы пытаетесь загрузить worker.js как локальный файл - Chrome это не нравится (по некоторым причинам безопасности), хотя вы можете вызвать проблему, запустив Chrome следующим образом: chrome.exe --allow-file-access-from-files

В качестве альтернативы, попробуйте запустить ваш скрипт на локальном или удаленном веб-сервере и посмотрите, решит ли это проблему. (Если у вас установлен Python, вы можете перейти в соответствующий каталог и запустить python -m SimpleHTTPServer 8000, а затем перейти к http://localhost:8000/ в вашем браузере).

6 голосов
/ 28 августа 2013

Chrome может использовать рабочий локально без --allow-file-access-from-files.Работник должен быть загружен как BLOB-объект.

Пример:

<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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...