在网络工作者中注册事件侦听器
问题描述:
是否有可能在网络工作者中注册侦听器到'message'
和'error'
以外的事件?例如。在网络工作者中注册事件侦听器
addEventListener('keydown', function (e) {
postMessage('test');
});
编辑:
据@ T.J.Crowder,这是不可能的。然而,在我的情况,我能够用消息来模拟它,不知何故像这样:
在工人:
const handlers = {};
function registerKeyHandler(keycode, callback) {
postMessage({
type: 'REGISTER_KEY_HANDLER',
keycode: keycode,
});
handlers[keycode] = handlers[keycode] || [];
handlers[keycode].push(callback);
}
function onKeydown(keycode) {
const hs = handlers[keycode] || [];
hs.forEach(h => h());
}
self.onmessage = function(msg) {
switch (msg.type) {
case 'KEYDOWN':
onKeydown(msg.payload.keycode);
break;
}
};
外:
worker.onmessage = function(msg) {
switch (msg.type) {
case 'REGISTER_KEY_HANDLER':
window.addEventListener('keydown', function (e) {
if (e.keyCode !== msg.keycode) {
return;
}
worker.postMessage({
type: 'KEYDOWN',
keycode: msg.keycode,
});
});
break;
}
};
答
号网络工作者不有访问DOM,至少因为
- 允许多个线程访问DOM打开基于浏览器的代码到一个全新的(非常棘手的)类的多线程错误;只允许在主UI线程更新DOM避免了
- 一些浏览器的DOM实现不能处理从多个线程
的global scope object *的工人都可以不是一个窗口,只有最小的功能调出由web workers specification,如addEventListener
,postMessage
,所述onmessage
和onerror
性质(尽管这奇怪仅在规格通过提及)等
* (这是常见的一种,有dedicated [为Worker
]和shared [对于SharedWorker
]取决于工人类型的子接口)