0

我很想知道什麼類型的事件處理API瀏覽器,以及我如何在一些根本不處理DOM的JavaScript邏輯中使用它們,所以我給了Event一個嘗試。瀏覽器中的事件處理API除了DOM嗎?

顯然,EventCustomEvent意味着只與DOM中使用,我沒有看到任何其他的API,所以我最終爲了溝通創建一個「虛擬」 <div>元素爲事件處理(事件目標)代碼兩個部分,像之間:

// shared file 
export 
let eventHandler = document.createElement('div') 

// ... some other file 
import {eventHandler} from './sharedFile' 
eventHandler.addEventListener('foobar', function(event) { 
    console.log('foobar event fired!') 
}) 

// ... some other file 
import {eventHandler} from './sharedFile' 
console.log('About to trigger "foobar" event.') 
eventHandler.dispatchEvent(new Event('foobar')) 

這工作,但你可以看到,我創建了一個<div>元素我不打算在所有的DOM使用,只用它作爲事件處理機制。

創建一個我不打算用作DOM元素的DOM元素似乎很浪費。有沒有其他的方式來使用本地瀏覽器API來做到這一點,還是我們必須創建自己的(或使用)事件庫,以避免創建一個虛擬元素?

回答

0

您可以使用javascript對象和函數來創建自己的事件總線而不使用DOM。

的基本想法是,你可以定義一個API,用於註冊回調和調度的事件,就像這樣:

var EventBus = (function() { 
    var listeners = {}; 
    return { 
     'addEventListener': function(eventName, callback) { 
      if (!listeners[eventName]) { 
       listeners[eventName] = []; 
      } 
      listeners[eventName].push(callback); 
     }, 
     'dispatchEvent': function(event) { 
      if (listeneres[eventName]) { 
       listeners[event.name].forEach(function(callback) { 
        callback(event); 
       }); 
      } 
     } 
    } 
}()); 
+0

這就是我想,我們需要實現它自己。如你所示,這很容易做到。我很想知道爲什麼W3C會將瀏覽器API連接到DOM,而不是使其更適用於非DOM用例。 – trusktr