我正在尝试编写一个函数来读取div项的oncontextmenu事件。 (我需要它来确定是否按下了ctrl键,例如使用e.ctrlKey。)
这有效:
<div id="item_2" class="lineitem" align=center oncontextmenu="alert('foo');">test</div>
但这不是:
<script language="JavaScript">
function asdf(e){
alert('foo');
}
</script>
<div id="item_2" class="lineitem" align=center oncontextmenu=asdf>test</div>
我需要做些什么来修复第二个?
感谢。
答案 0 :(得分:5)
<div oncontextmenu="asdf(event)">
<script type="text/javascript">
function asdf(event){
if (event.ctrlKey)
alert('foo');
}
</script>
为什么会这样:在由事件处理程序属性字符串创建的匿名函数内部,初始化的局部变量event
指向Event实例。 IE有一个破碎的事件模型,但此代码仍然有效,因为event
现在不是局部变量而是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
是IE扩展,在HTML5之前不会标准化。)
您也可以将相同的功能迁移到addEventListener
,但请注意IE不支持它,因此您需要嗅探addEventListener
的存在,如果缺少则使用IE特定的{{} 1}}而不是。如果您在同一个对象上不需要多个处理程序,那么只需使用旧式attachEvent
样式处理程序就可以更容易(并且与古代浏览器更兼容)。
请注意onevent
是不可靠的事件。它在所有浏览器中都不受支持,可能会被禁用或者可能始终显示浏览器的真实上下文菜单,而在Mac上,获取它的常用方法是使用按住Control键,这可能会使您对{{1}的检查感到困惑}。当然还有可访问性问题。仅将Web应用程序中的上下文菜单用作快捷功能,而不是必不可少的访问方法。
答案 1 :(得分:2)
oncontextmenu="asdf()"
您无法使用属性值直接指定预定义函数。只有匿名函数(其中function () {
和}
被attribute="
和"
替换。这使得捕获事件对象变得相当困难(可能不可能,它不是我觉得有必要进行调查。
如果要直接分配函数,请使用带有attachEvent / addEventListener的JavaScript来执行此操作。
答案 2 :(得分:1)
oncontextmenu="asdf()"
应该有效,不是吗?