2016-01-06 104 views
1

是否有可能在网络工作者中注册侦听器到'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; 
    } 
}; 

回答

3

号网络工作者不有访问DOM,至少因为

  • 允许多个线程访问DOM打开基于浏览器的代码到一个全新的(非常棘手的)类的多线程错误;只允许在主UI线程更新DOM避免了
  • 一些浏览器的DOM实现不能处理从多个线程

global scope object *的工人都可以不是一个窗口,只有最小的功能调出由web workers specification,如addEventListenerpostMessage,所述onmessageonerror性质(尽管这奇怪仅在规格通过提及)等

* (这是常见的一种,有dedicated [为Worker]和shared [对于SharedWorker]取决于工人类型的子接口)