JavaScript的:不能设置oncontextmenu属性预先定义的函数
-
22-09-2019 - |
题
我想编写一个函数,用于读取一个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>
什么我需要做修复第二个?
感谢。
解决方案
oncontextmenu="asdf()"
可以不分配预定义的直接使用属性值的函数。只有匿名函数(其中function () {
和}
与attribute="
和"
更换。这使得相当困难的陷阱事件对象(也许是不可能的,这是不是我曾经觉得有必要进行调查)。
如果您想要的功能直接分配,不使用JavaScript用的attachEvent /的addEventListener它。
其他提示
<div oncontextmenu="asdf(event)">
<script type="text/javascript">
function asdf(event){
if (event.ctrlKey)
alert('foo');
}
</script>
为什么这样的作品:由事件处理程序属性字符串创建匿名函数里面,有初始化为指向事件实例的局部变量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
,但请注意,所以你需要嗅探的addEventListener
的存在,若没有使用IE特定attachEvent
代替IE不支持它。如果您不需要对同一对象为同一事件的多个处理程序更容易(与古老的浏览器更兼容)只使用老派onevent
式的处理程序来代替。
请注意contextmenu
是不可靠的事件。它不是在所有的浏览器都支持,可以禁止或可能还总是打开浏览器真实的上下文菜单,然后在Mac上常见的方式来获得它与按住Control键单击,这可能混淆你的ctrlKey
检查。另外当然也有可访问性问题。在Web应用程序的快捷方式功能使用上下文菜单只,而不是作为主要的访问方法。
oncontextmenu="asdf()"
应该工作,不是吗?