javascript:无法将oncontextmenu属性设置为预定义函数

时间:2010-01-03 10:19:03

标签: javascript right-click

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

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

感谢。

3 个答案:

答案 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()"

应该有效,不是吗?