JavascriptDOM事件名称约定

问题描述 投票:41回答:4

当我开始做网络开发时,我意识到Javascript事件名称都是小写的,没有分隔符,即:"mousedown "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.comblogsafari-ios7-html5-problems-apis-review 当他说。

我认为 "webkitcurrentplaybacktargetiswirelesschanged" 赢得了这个记录。最长的JavaScript事件名称.

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

我想这是有原因的,很多聪明的人在这上面下了功夫... 但过了一段时间,我还是想知道为什么?

javascript dom javascript-events conventions
4个回答
25
投票

不幸的是,当你处理遗留的惯例时,就不是那么简单了。而DOM事件的背后有很多历史。

以下是DOM事件的类型属性 事件 是在DOM2事件规范中定义的。

接口事件(在DOM 2级中引入 类型 (DOMString, readonly)

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

这背后的原因,我想,在同一个文档中的这段话可以解释。

在HTML 4.0中,事件监听器被指定为元素的属性。[...]为了与HTML 4.0兼容,实现者可以将代表事件处理程序的属性设置视为在EventTarget上创建和注册一个EventListener。

现在,虽然DOM3中的立场已经改变了(事件名称为 区分大小写),我想,最初的方法后来被认为是最安全的赌注--这样就不必依赖用户代理的正确性了(检查一下 本次讨论这个有趣的问题 为例)。)

请注意,W3C自己已经在DOM2中注册了一大堆PascalCased事件(所有的MutationEvents, DOMActivate, DOMFocusInDOMFocusOut).


7
投票

据我所知,目前还没有关于这个问题的官方实践。在我看来,既然 camelCase 是 js 中普遍接受的名称标准,那么同样也适用于事件命名。然而,正如你所提到的,js本身和许多库都有不同的做法。我看到这两种约定都被伟大的程序员使用,所以我相信这根本是无关紧要的。就 "史上最长的JavaScript事件名 "而言,在我看来,这是一个很好的例子,它应该使用camelCase......或者他们可以把它缩短 :)

如果你想坚持你见过的更多的东西,使用小写。如果你觉得那样很难看(我是这么认为的),就用camelCase。如果你想符合一个标准,我可能不会使用其他任何东西。


2
投票

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

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

该规范提到要遵循XML命名准则。https:/www.w3.orgTR1998REC-xml-19980210#NT-Name

从我收集到的信息来看。

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

我对他的推理是因为有时候你有单独的应用或库,可以是完全独立的小部件。 一目了然,很容易就能识别出这个事情事件的所在,用一个 : 该组件的前面是一个 . 因为大多数组件都是以对象的形式写的。


1
投票

说到约定俗成,在某种程度上,这是一种习惯,JavaScript框架似乎遵循JavaScript DOM事件API的约定,我不知道是否有原因,或者至少有一个明确的理由,但它就是这样.为了一般的约定。克罗克福德 是最好的参考资料之一,但对于事件命名却没有提及,但与此同时 此处 事件似乎有些不同,这让我觉得这是一个选择的问题,不多也不少。

© www.soinside.com 2019 - 2024. All rights reserved.