2016-01-06 106 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]取決於工人類型的子接口)