JavaScript的事件常量?

Jac*_*nkr 6 javascript constants javascript-events mouseevent

在JavaScript中,我有类似的代码

document.addEventListener("mousedown", mouseDownHandler);
Run Code Online (Sandbox Code Playgroud)

有时候我可能会用手指发胖

document.addEventListener("mouzedown", mouseDownHandler);
Run Code Online (Sandbox Code Playgroud)

而且javascript不会意识到我是个白痴,并且会困惑为什么我的处理程序无法正常工作。

Actionscript3 像这样指定事件常量

MouseEvent.MOUSE_DOWN // equiv to the String "mouseDown"
Run Code Online (Sandbox Code Playgroud)

如果我胖了一个手指variableconstant然后JS生气了,那么我可以很快地解决问题。是否JavaScript有与此类似的东西,或者我需要为事件类型创建自己的JS伪常量?

nnn*_*nnn 3

没有内置功能可以为您执行此操作。

您可以创建自己的事件列表:

var EventNames = {
  MOUSE_DOWN : "mousedown",
  MOUSE_UP   : "mouseup",
  CLICK      : "click",
  // etc
};
Run Code Online (Sandbox Code Playgroud)

但这并不能保护你免受打字错误的影响,因为那样EventNames.MOUZE_DOWN只会给你undefined(这可能会被接受addEventListener(),但显然 - 不会做你想做的事)。

您可以创建一系列单独的全局变量,然后如果您在“常量”名称上输入错误,浏览器应该会给出错误(并且您的 IDE 或 lint 产品可能会为您检测到输入错误):

var Event_MOUSE_DOWN = "mousedown",
    Event_MOUSE_UP   = "mouseup",
    // etc
Run Code Online (Sandbox Code Playgroud)

当然,“全球化是邪恶的”阵营的成员刚读完上面的内容就已经开始口吐白沫了。您可以通过将所有代码(包括那些“常量”)包装在一个大的立即执行的匿名函数中来在没有全局变量的情况下执行上述操作,或者您可以执行如下操作:

// 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!
Run Code Online (Sandbox Code Playgroud)

当然,有关使用的常见警告适用Array.indexOf(),即旧版浏览器不支持,但您可以按照MDN 的描述对其进行填充,等等,等等。

或者你可以像 jQuery 一样定义你自己的等方法.mousedown().click()并且只通过这些方法附加事件 - 如果你输错了方法名称,你肯定会得到一个错误。