HTML5 Web Workers可以在Firefox 4中工作,但不能在Chrome 12.0.742.122中工作
HTML5 Web Workers work in Firefox 4, but not in Chrome 12.0.742.122
当我尝试在HTML5中使用Web Workers功能时,我的firefox工作得很好,但chrome抱怨:
Uncaught TypeError: Cannot call method 'postMessage' of undefinedxstartWorkerworker.html:7(匿名函数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上试用样本时这次chrome可以工作了,但是firefox抱怨
错误:worker is undefinedhttp://playground.html5rocks.com/Line: 39
我猜你想在本地机器上运行这个,而不是在web服务器上。工人受到同源政策的限制,但正如链接的维基百科页面所指出的,
同源检查和相关机制的行为不是在许多极端情况下定义良好,例如对于协议没有明确定义的主机名或端口与其关联url (file:, data:,等).
加载本地文件,即使有相对URL,也与使用file:
协议加载文件相同。所以我的猜测是,问题是你试图加载worker.js
作为本地文件- Chrome不喜欢这样(出于一些良好的安全原因),尽管你可以通过启动Chrome这样强制问题:chrome.exe --allow-file-access-from-files
或者,尝试在本地或远程web服务器上提供脚本,看看是否可以解决问题。(如果您安装了Python,您可以转到相关目录并运行python -m SimpleHTTPServer 8000
,然后在浏览器中转到http://localhost:8000/)。
Chrome可以在没有--allow-file-access-from-files
的情况下本地使用worker。worker需要以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;
}
- JS可以在Chrome中工作,但不能在Firefox中工作
- jQuery Datepicker可以在Safari中工作,但不能在FF或Chrome中工作
- Javascript的某些部分在Chrome中不起作用,但在其他浏览器中可以完美工作
- javascript window.open将无法在Chrome控制台上工作
- 如何编写在Chrome和IE中正常工作的JavaScript
- 只有当Javascript控制台在chrome上打开时,Javascript才能工作
- Chrome地理定位在更新后停止工作
- 地理定位无法在chrome中工作
- Json到CSV下载,可以在chrome中工作,但不能在IE浏览器中工作
- prettyPhoto无法在Chrome和IE9中工作
- window.location.htm无法在chrome扩展中工作
- jQuery$.post可以在chrome、safari中工作,但不能在FF中工作(声明成功回调函数未定义)
- Chrome没有加载最新版本的web工作程序脚本(运行缓存版本)
- HTML5视频无法在chrome上工作,在服务器上托管后的IE,mov文件中的视频(quicktime格式)
- 异步加载的SVG过滤器feColorMatrix在Chrome中工作,而不是在Safari或Firefox中
- JQuery 灯箱不工作.Chrome 在显示控制台中报告错误
- 如何使工作 Chrome 扩展程序的未捕获异常处理程序(由于 CORS 保护而不起作用)
- JavaScript表单脚本工作Chrome,但没有其他地方
- 锚标记下载属性不工作:Chrome 35.0.1916.114中的错误
- JQuery&子选择器A>B: 不工作?[Chrome 24,JQmobile]