<div oncontextmenu="asdf(event)">
<script type="text/javascript">
function asdf(event){
if (event.ctrlKey)
alert('foo');
}
</script>
为什么会这样:在由事件处理程序属性字符串创建的匿名函数内部,有一个event
初始化为指向 Event 实例的局部变量。IE 有一个损坏的事件模型,但这段代码仍然有效,因为event
now 指的不是局部变量而是window.event
全局变量。
但是,这些天您通常希望避免使用事件处理程序属性。最好从脚本本身分配事件处理程序,例如:
<div id="thing">
<script type="text/javascript">
document.getElementById('thing').oncontextmenu= function(event) {
if (event===undefined) event= window.event; // fix for IE
if (event.ctrlKey)
alert('foo');
};
</script>
将它放在脚本中也意味着您的 HTML 保持可验证性。(oncontextmenu
是一个直到 HTML5 才会标准化的 IE 扩展。)
您也可以将相同的功能迁移到addEventListener
,但请注意 IE 不支持它,因此您需要嗅探是否存在,addEventListener
如果缺少,请改用 IE-specific attachEvent
。如果您不需要多个处理程序来处理同一对象上的同一事件,则更容易(并且与古老的浏览器更兼容)只使用 old-schoolonevent
样式的处理程序。
请注意,这contextmenu
是一个不可靠的事件。并非所有浏览器都支持它,它可能已被禁用,或者可能始终会显示浏览器的真实上下文菜单,而在 Mac 上,获取它的常用方法是按住 Control 键单击,这可能会使您对ctrlKey
. 另外,当然还有可访问性问题。将 Web 应用程序中的上下文菜单仅用作快捷功能,而不是必不可少的访问方法。