2013-01-11 82 views
0

我一直在閱讀有關自定義事件,並看了一些例子。也許我誤解了什麼是自定義事件,以及它們是如何觸發的,並希望得到一些幫助。究竟是什麼作爲一個觸發器的自定義事件的Javascript

例題

觸發事件時的從一種顏色到另一個div變化的背景色。

情況A)顏色因腳本內可檢測的用戶活動而改變,例如通過onclick,onmouseover,onkeypress,然後我將爲這些事件設置一個監聽器並作出相應的響應。這我明白該怎麼做。

情況B)由於用戶活動的結果而導致的顏色變化無法從腳本中檢測到,例如應用於頁面的新主題,那麼我是否認爲以下內容是正確的?

  1. 我需要爲顏色更改創建自定義事件。
  2. 爲事件添加監聽到合適的DIV
  3. 監聽器需要輪詢DIV,週期性地檢查變爲彩色

真正的第3步,我不清楚。如果您未輪詢DIV,事件顏色變化如何觸發事件?換句話說,劇本如何知道顏色發生了變化?

+0

什麼是「正在應用的新主題」?這仍然是用戶編寫的自定義代碼,並且該代碼可能會觸發所需的事件。 –

+0

使用瀏覽器選項,用戶可以更改字體大小,背景顏色等,即應用一個新的主題。據我所知在javascript中沒有本地事件來處理這些,所以我需要在我的腳本中創建一個自定義事件。我想問的是如何找出何時發生定製事件?在我的示例中,顏色變化是如何作爲觸發器的,或者您是否必須繼續檢查(例如使用setTimeout)是否發生顏色變化? – jing3142

+0

*您自己的代碼*必須激發自定義事件。 *您編寫的程序*必須決定何時調用['.dispatchEvent'](https://developer.mozilla.org/en-US/docs/DOM/Creating_and_triggering_events)(或['.trigger'] (http://api.jquery.com/trigger/),在jQuery中)。自定義事件只是事件偵聽器的消息。你決定何時發送;他們不會自己發生。有時,檢測什麼時候觸發事件(即向事件偵聽器發送消息)的唯一方法是使用輪詢。 – apsillers

回答

1

在JavaScript中,自定義事件只是一條消息,向所有事件監聽器廣播,即「每個人都注意:事件X剛剛發生!」任何關心該事件的監聽者都可以運行一些功能。

但是,您的自定義事件仍然需要以某種方式被解僱。自定義事件不會被解僱,除非在代碼中的某處,您可以調用.dispatchEvent(或.trigger,在jQuery中)。您的計劃必須決定何時開始舉辦活動。如果瀏覽器本身並不觸發您可以用作自定義事件的提示的事件,那麼通常輪詢是瞭解何時觸發事件的唯一方法。

這裏的底線是事件只是消息。這取決於您和您編寫的代碼以決定何時解僱他們。

2

自定義事件不像DOM事件,它們不會觸發,因爲瀏覽器中發生了一些交互。當編寫代碼的人決定讓他們發生時,他們就會發生。當你需要時你必須明確地觸發自定義事件。

例如,您可能有功能類似

function updateBackground (element, color) { 
    elmenet.css('background-color', color); 
    // element has to be an object that has `trigger` function on its prototype 
    // like jQuery wrapped element, for example 
    element.trigger('updated-background', color); 
} 

然後每次你都'updated-background'打響了這個element的上下文中執行該代碼的時間。

UPD

使用瀏覽器選項,用戶可以改變字體大小,背景顏色等 ,即應用一個新主題。據我所知在JavaScript內部沒有本地事件 來處理這些,所以我需要在我的腳本中創建一個 自定義事件。我想問的是如何找到自定義事件發生的時間?

您發現是因爲您創建了它們。正如你所說的,你是正確的(據我所知)當用戶改變font-size/default body background等時,沒有任何DOM事件被觸發。當你檢測到一個改變時,你可以輪詢body和fire自定義事件。