2

我正在尝试编写一个函数来读取 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>

我需要做什么来修复第二个?

谢谢。

4

3 回答 3

5
<div oncontextmenu="asdf(event)">

<script type="text/javascript">
    function asdf(event){
        if (event.ctrlKey)
            alert('foo');
    }
</script>

为什么会这样:在由事件处理程序属性字符串创建的匿名函数内部,有一个event初始化为指向 Event 实例的局部变量。IE 有一个损坏的事件模型,但这段代码仍然有效,因为eventnow 指的不是局部变量而是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 应用程序中的上下文菜单仅用作快捷功能,而不是必不可少的访问方法。

于 2010-01-03T12:49:57.623 回答
2
oncontextmenu="asdf()"

您不能使用属性值直接分配预定义函数。只有匿名函数(其中function () {and}被替换为attribute="and "。这使得捕获事件对象相当困难(也许不可能,这不是我觉得需要调查的事情)。

如果您想直接分配函数,请使用带有 attachEvent/addEventListener 的 JavaScript 来完成。

于 2010-01-03T10:23:36.057 回答
1
oncontextmenu="asdf()"

应该工作,不是吗?

于 2010-01-03T10:20:39.487 回答