哪些对象可以触发DOM中的按键事件?

时间:2013-12-02 01:16:50

标签: javascript html events

我一直在尝试,它似乎只是表单元素,窗口对象可以触发按键事件。

我检查了MDN文档以及规范,但找不到列出可触发此事件的有效对象的任何地方。在下面的代码示例中,如果我注释掉从“窗口”开始的行,那么我没有得到控制台消息,暗示div元素没有触发按键事件,但是,如果我留在行中来定义一个处理程序按键事件在窗口上,然后我看到控制台消息。

有人能指点我(或确认/列出)可以触发按键事件的有效对象吗?谢谢!

window.onload = function() {
    var div = document.getElementById("div");
    div.onclick = clickMeHandler;
    div.onkeypress = clickMeHandler;
    window.onkeypress = clickMeHandler;
};
function clickMeHandler(e) {
    console.log("click me handler, type: ", e.type);
    console.log("click me handler, target: ", e.target);
}

3 个答案:

答案 0 :(得分:3)

还没有获得按键适用的元素的完整列表,但我相信你是正确的 - 只有控制按键才有意义 - 拥有它。举个例子 - 一个DIV 可以有按键事件,但只有当你可以在其中输入内容时,即当它具有属性集contenteditable="true"

演示:http://jsfiddle.net/qny4A/

更新

其实我站得更正了。我相信任何元素都可以生成按键事件,只要它可以获得焦点,这可以通过“tabindex”属性获得

以下是SPAN的演示,该事件在焦点为焦点时生成事件:http://jsfiddle.net/qny4A/1/

答案 1 :(得分:2)

编辑:解释后添加了HTML5注释。

以下标记包含与它们相关的任何on *事件(即onkeypress)(按字母顺序列出):

  

a,abbr,首字母缩写词,地址,区域,b,bdo,大,blockquote,正文,按钮,标题,引用,代码,col,colgroup,dd,del,dfn,div,dl,dt,em,fieldset ,形式,h1,h2,h3,h4,h5,h6,hr,i,img,输入,ins,kbd,标签,图例,li,链接,地图,noscript,对象,ol,optgroup,选项,p,pre ,q,samp,select,small,span,strong,sub,sup,table,tbody,td,textarea,tfoot,th,thead,tr,tt,ul,var

以下标签有任何on *事件:

  

base,br,head,html,meta,param,script,style,title

根据XHTML 1.0 Strict DTD。元素的属性列表包含attrsevents个实体,例如(第二行):

<!ATTLIST img
  %attrs;
  src         %URI;          #REQUIRED
  alt         %Text;         #REQUIRED
  longdesc    %URI;          #IMPLIED
  height      %Length;       #IMPLIED
  width       %Length;       #IMPLIED
  usemap      %URI;          #IMPLIED
  ismap       (ismap)        #IMPLIED
  >

分解如下......首先,您的onkeypress事件在实体%events中定义:

<!ENTITY % events
 "onclick     %Script;       #IMPLIED
  ondblclick  %Script;       #IMPLIED
  onmousedown %Script;       #IMPLIED
  onmouseup   %Script;       #IMPLIED
  onmouseover %Script;       #IMPLIED
  onmousemove %Script;       #IMPLIED
  onmouseout  %Script;       #IMPLIED
  onkeypress  %Script;       #IMPLIED
  onkeydown   %Script;       #IMPLIED
  onkeyup     %Script;       #IMPLIED"
  >

然后在实体%attrs中使用别名:

<!ENTITY % attrs "%coreattrs; %i18n; %events;">

这两个实体未在DTD中的任何其他位置引用。然后搜索包含至少一个实体的任何ATTLIST。


另一方面, HTML5 不是基于SGML的,它不能有DTD;见Where is the HTML5 Document Type Definition?。因此,我针对XHTML 1.0进行的分析不适用于HTML5。

According to the HTML5 spec,任何和所有元素都可以应用事件:

  

[E] vent处理程序(及其相应的事件处理程序事件类型)...必须由所有HTML元素支持,作为事件处理程序内容属性和事件处理程序IDL属性;和...必须由所有Document和Window对象支持,作为事件处理程序IDL属性。

在事件表中包含事件类型为onkeypress的{​​{1}}事件处理程序。

理论上任何事件都适用于任何element nodenode type ELEMENT_NODE 1),但在所有浏览器中我都不会指望它。我会说坚持使用XHTML实现会更安全。


我使用以下PHP脚本来解析和编译列表:

keypress

答案 2 :(得分:1)

假设您正在谈论纯JS,而不是C#或VB事件:

“onkeypress属性可以在所有HTML元素中使用,除了:

<base>, <bdo>, <br>, <head>, <html>, <iframe>, <meta>, <param>, <script>, <style>, and <title>.

来源: http://www.w3schools.com/jsref/event_onkeypress.asp