2011-12-08 25 views
3

在我的javascript代碼有像JavaScript的事件常量?

document.addEventListener("mousedown", mouseDownHandler); 

偶爾我可能胖手指像

document.addEventListener("mouzedown", mouseDownHandler); 

和JavaScript將不承認,我是一個白癡,我會很困惑,爲什麼我的處理程序不起作用。

Actionscript3規定,像這樣

MouseEvent.MOUSE_DOWN // equiv to the String "mouseDown" 

事件常量如果我胖手指variableconstant然後JS得到氣死我了,我可以解決這個問題真正的快。 JavaScript有沒有類似於這個或我需要爲事件類型創建自己的JS僞常量?

+0

哈哈,是的。在靜態語言中,您會遇到編譯器錯誤。在動態語言中,字符串與變量一樣安全。 (雖然沒有。) –

+1

我個人從來沒有遇到類似這樣的事情,通過谷歌幾分鐘沒有提供任何東西。然而,我確實知道JavaScript有一個'const'關鍵字:https://developer.mozilla.org/en/JavaScript/Guide/Values%2C_Variables%2C_and_Literals#Constants – peterp

+2

@Diodeus JavaScript會抱怨一個未定義的變量;所以不正確地輸入它會給你想要的結果。 – peterp

回答

1

沒有內置功能來爲你做這個。

你可以創建自己的事件列表:

var EventNames = { 
    MOUSE_DOWN : "mousedown", 
    MOUSE_UP : "mouseup", 
    CLICK  : "click", 
    // etc 
}; 

但是,這並不能防止輸入錯誤,因爲這樣會EventNames.MOUZE_DOWN只給你undefined(這將可能由addEventListener()被接受,但 - 顯然 - 不做你想做的)。

您可以創建一系列單獨的全局變量,然後如果你做的「常量」名稱的拼寫錯誤,瀏覽器應該給出一個錯誤(和你的IDE或棉絨產品可以檢測你的拼寫錯誤):

var Event_MOUSE_DOWN = "mousedown", 
    Event_MOUSE_UP = "mouseup", 
    // etc 

但是,當然,「全球性是邪惡的」旅團的成員已經開始從口中起泡沫了。你可以通過包裝所有的代碼(包括那些「常量」)在一個大的立即執行的匿名函數做上述無全局,或者你可以代替做這樣的事情:

// YNH: "Your Namespace Here" (insert your own namespacing 
//        code as desired) 
var YNH_Events = { 
    validEvents : ["mouseup","mousedown","click","etc"], 

    bindEvent = function(element, eventType, handler, isCustomEvent) { 
     if (!isCustomEvent && -1 === this.validEvents.indexOf(eventType)) 
     throw "Invalid event type requested: " + eventType; 

     if (element.addEventListener) 
     element.addEventListener(eventType, handler, false); 
     else if (element.attachEvent) 
     element.attachEvent("on" + eventType, handler); 
     else 
     element["on" + eventType] = handler; 
    } 
} 

YNH_Events.bindEvent(someElement, "mousedown", function() { });   // OK 
YNH_Events.bindEvent(someElement, "customevent", function() { }, true); // OK 
YNH_Events.bindEvent(someElement, "mouzedown", function() { });  // Error! 

當然,平常關於使用Array.indexOf()的說明適用,也就是說,在舊版瀏覽器中不支持,但可以按照MDN,blah,blah,blah所述的方法對其進行填充。

或者你可以像jQuery那樣做,並定義你自己的.mousedown(),.click()等方法,只通過這些方法附加事件 - 如果你輸錯方法名,你肯定會得到一個錯誤。

+0

我一直在「立即執行的匿名函數」中執行常量一段時間,但是我可能會喜歡您更好地定義自己的函數的想法。也許甚至是我自己的「addEventListener」變體,它會檢查「undefined」event_type。爲這個想法+1! – Jacksonkr

+1

當不使用像jQuery這樣的庫時,我總是定義自己的事件綁定函數,而不是直接使用'addEventListener()',只是爲了封裝上面顯示的跨瀏覽器if/else無稽之談。假設你也這樣做,把一個快速的事件名稱驗證檢查也沒有什麼大不了的。 (這不是一個很大的開銷,但是如果你想在部署到生產環境之前再想一下,那麼它只是一個數組聲明和一個if測試。我故意寫了上面的代碼來使用一個字符串數組,因爲它是比一堆常量要少得多。) – nnnnnn

2

沒有預定義的常量/屬性可用於定義addEventListener的事件。

以下(並且在revision history)剝離原來的答案:
Event對象定義的以下常量。使用Firefox 8.0,下面的代碼:

  • alert(Object.keys(Event).map(function(name){return name + "\t" + Event[name]}).join('\n'))
+3

但是,'Event.MOUSEDOWN'作爲'addEventListener()'的參數是無效的。 – Phrogz

+1

根據你在'Event'對象上尋找任何已定義的常量的印象,我發佈了這個答案。 **但是,如果您正在尋找包含「mousedown」之類的常量,則答案爲:否,不存在這樣的常量。**有關「Event」對象的更多信息,請參見https:// developer.mozilla.org/en/DOM/event –

0

也許使用jQuery?一個小問題的大開關,但jQuery有很多JS處理程序的別名函數,如果你拼寫錯誤的函數名,你肯定會得到一個錯誤。

也就是說,

document.addEventListener("mousedown", mouseDownHandler); // right 
$(document).mousedown(mouseDownHandler); // right 

document.addEventListener("mouzedown", mouseDownHandler); // wrong, no error 
$(document).mouzedown(mouseDownHandler); // wrong, throws error 
+1

歡迎來到Stack Overflow Ben。如果你選擇你的代碼並按下'{}'按鈕,它將被很好地格式化,或者你可以通過打開四個空格來手動完成。或者通過引用字符來格式化代碼'inline'。 – nnnnnn