我想编写一个函数,用于读取一个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()"

应该工作,不是吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top