Javascript/DOM 事件名称约定

Javascript/DOM event name convention

本文关键字:约定 事件 DOM Javascript      更新时间:2023-09-26

当我开始做Web开发时,我意识到Javascript事件名称都是小写的,没有分隔符,即"mousedown",">mouseup">等。在使用 jQuery UI 库时,我注意到它们也使用相同的约定;即"dropdeactivate">,如以下示例所示

$( ".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事件名称

这个奇怪的约定背后的原因是什么? 为什么不使用任何形式的分隔符或驼峰约定以更易读的方式命名事件?

我认为这是有原因的,很多聪明的人都在做这件事......但过了一会儿,我仍然想知道为什么?

不幸的是,当您处理遗留约定时,这并不那么简单。DOM Events 背后有很多历史。

以下是在 DOM2 事件规范中定义事件类型属性的方式:

接口事件(在 DOM 级别 2 中引入(
类型(类型为 DOMString,只读(

事件的名称(不区分大小写(。该名称必须是 XML 名称。

我想,这背后的原因在同一文档中的这一段中得到了解释:

在 HTML 4.0 中,事件侦听器被指定为 元素。[...]为了实现与HTML 4.0的兼容性, 实现者可以查看表示事件的属性的设置 处理程序作为在 事件目标。

现在,虽然 DOM3 中的立场发生了变化(其中事件名称区分大小写(,但我想原始方法通常被认为是最安全的选择——所以人们不必依赖用户代理的正确性(查看此讨论和这个有趣的问题作为示例(。

请注意,W3C 本身已经在 DOM2 中注册了大量 PascalCased 事件(所有 MutationEvents、DOMActivateDOMFocusInDOMFocusOut(。

据我所知,没有关于这个问题的官方实践。在我看来,由于 camelCase 是 js 中名称的普遍接受标准,因此同样适用于事件命名。但是,正如您所指出的,js 本身和许多库都这样做。我见过伟大的程序员使用的两种约定,所以我相信它根本无关紧要。在我看来,在"有史以来最长的 JavaScript 事件名称"的情况下,这是一个很好的事件应该使用 camelCase 的例子......或者也许他们可以缩短它:)

如果您想坚持更频繁地看到的内容,请使用小写。如果你认为这对眼睛很难(我这样做(,请使用camelCase。如果你想符合一个标准,我可能不会使用其他任何东西。

我喜欢Bootstrap的工作方式:hidden.bs.modal

然而:正如@raina77ow的回答中提到的,你应该遵循DOM2规范。

该规范提到了以下 XML 命名准则:https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name

从我收集到的信息来看:

  • 尽可能使用小写
  • 可以使用其中任何字符来帮助命名空间. - _ :
  • 我会使用其中任何一个。 大概是这样的apporlibraryname:componentname.eventtype

我这样做的理由是因为有时你有单独的应用程序或库,这些应用程序或库可能是完全独立的小部件。 一目了然,很容易识别出这个事物事件所在的位置,:组件位于.之前,因为大多数组件都是作为对象编写的。

更新:

但你可以做任何事情。 只要是一致的。 最好有一些开放标准,这样库就可以有一定程度的一致性。

也许以上是library-component namespace. 艾德克。但我也会记录你的理由。任何额外的细节都将帮助用户使用你的应用。

说到

约定,它在某种程度上是一种习惯,JavaScript框架似乎遵循JavaScript DOM事件API的约定,我不知道是否有原因或至少有一个明确的推理,但它就是这样。对于一般惯例,克罗克福德是最好的参考之一,但没有提到事件命名,但同时这里的事件似乎有点不同,这让我把它作为一个选择问题,不多也不少