2013-09-28 80 views
30

嗨,當我開始做網站開發,我意識到JavaScript事件名稱都是在沒有分隔小寫,即「的mousedown」「鼠標鬆開」,等。隨着工作時jQuery UI庫,我注意到他們也使用相同的約定;即「dropdeactivate」如下面的例子的JavaScript/DOM事件名稱約定

javascript $(".selector").on("dropdeactivate", function(event, ui) {})

雖然這非常適用於那些只有2名或3個字的名字,它是上面有多個字的名字是非常糟糕的。

儘管如此,我還是遵循該公約,當我必須開始創建自定義(合成)事件時,直到最近我決定開始使用某種形式的分隔符時更好。現在我使用類似「drop:deactivate」「app:ready」

上蘋果iOS

最近增加了該事件的HTML 5的Airplay API,和我這個職位http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review的作者日期達成一致時,他說:

我覺得「webkitcurrentplaybacktargetiswirelesschanged」贏得了記錄: 有史以來最長的JavaScript事件名稱

這個古怪的約定背後的原因是什麼?爲什麼不使用任何形式的分隔符或camelCase約定來以更可讀的方式命名事件?

我認爲有一個原因,很多聰明的人在這工作......但過了一段時間,我還在想爲什麼?

回答

16

不幸的是,處理遺留約定並不那麼簡單。 DOM Events有很多背後的歷史。

以下是如何的Event類型屬性在DOM2事件規範定義:

接口事件
類型(DOM級別2中引入)(的類型DOMString,只讀)

事件的名稱(不區分大小寫)。該名稱必須是XML名稱。

這背後的原因,我想,是由本段中相同的文檔解釋:

在HTML 4.0,事件偵聽器被指定爲 元素的屬性[...]爲了實現與HTML 4.0的兼容性, 實現者可以將代表事件 處理器的屬性設置作爲EventLarget的EventListener的創建和註冊來實現。

現在,而立場DOM3(其中事件名稱爲case-sensitive),原來的做法是,我想,ofter被認爲是最安全的賭注已經改變了 - 這樣一個將不必依賴於用戶代理'正確性(以this discussionthis funny issue爲例)。

請注意,W3C本身已在DOM2中記錄了整個CamelCased事件(所有MutationEvents,DOMActivateDOMFocusInDOMFocusOut)。

+3

這些應該叫做「PascalCased」嗎? – m59

5

據我所知,關於這個問題沒有官方的做法。在我看來,由於camelCase是js中公認的標準名稱,這同樣適用於事件命名。但是,正如你所指出的那樣,js本身和很多圖書館都是這樣做的。我見過優秀程序員使用的兩種慣例,所以我相信這是無關緊要的。在「有史以來最長的JavaScript事件名稱」這是一個應該使用camelCase的事件的一個很好的例子,在我看來......或者他們可能只是縮短它:)

如果你想要堅持到你更經常看到的,使用小寫字母。如果你認爲這很難(我做),使用camelCase。如果你想要符合標準,我可能不會使用其他任何東西。

1

談到慣例時,它是某種方式或某種習慣,JavaScript框架似乎遵循JavaScript DOM事件API的慣例,我不知道是否有理由或至少是清楚的推理爲什麼,但它只是。 對於一般約定,crockford是有最好的參考之一,但沒有提及事件命名,但在同一時間here事件似乎有點不同,這讓我覺得它是一個選擇的問題,不多,不少於