我一直在尝试,它似乎只是表单元素,窗口对象可以触发按键事件。
我检查了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);
}
答案 0 :(得分:3)
还没有获得按键适用的元素的完整列表,但我相信你是正确的 - 只有控制按键才有意义 - 拥有它。举个例子 - 一个DIV 可以有按键事件,但只有当你可以在其中输入内容时,即当它具有属性集contenteditable="true"
更新
其实我站得更正了。我相信任何元素都可以生成按键事件,只要它可以获得焦点,这可以通过“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。元素的属性列表包含attrs
或events
个实体,例如(第二行):
<!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 node(node 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>.