Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:can';t将oncontextmenu属性设置为预定义函数_Javascript_Right Click - Fatal编程技术网

javascript:can';t将oncontextmenu属性设置为预定义函数

javascript:can';t将oncontextmenu属性设置为预定义函数,javascript,right-click,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){ a

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

功能asdf(e){
警报(“foo”);
}
测试
我需要做什么来修复第二个

谢谢

oncontextmenu="asdf()"
应该有用吧

oncontextmenu="asdf()"
不能直接使用属性值指定预定义函数。只有匿名函数(其中
function(){
}
attribute=“
替换。这使得捕获事件对象变得相当困难(可能不可能,我从来没有觉得有必要对其进行调查)

如果要直接分配函数,请使用带有attachEvent/addEventListener的JavaScript进行分配

<div oncontextmenu="asdf(event)">

<script type="text/javascript">
    function asdf(event){
        if (event.ctrlKey)
            alert('foo');
    }
</script>
将其放入脚本中也意味着您的HTML保持可验证性。(
oncontextmenu
是一个IE扩展,在HTML5之前不会被标准化。)

您也可以将相同的函数迁移到
addEventListener
,但请注意,IE不支持该函数,因此您需要嗅探是否存在
addEventListener
,如果缺少该函数,请改为使用IE特定的
attachEvent
。如果不需要对同一对象上的同一事件使用多个处理程序,则更容易(与古代浏览器更兼容)只需使用老式的
onevent
样式的处理程序即可


请注意,
contextmenu
是一个不可靠的事件。并非所有浏览器都支持它,它可能被禁用或可能始终显示浏览器的真实上下文菜单,在Mac电脑上,获取它的常用方法是控制点击,这可能会混淆您对
ctrlKey
的检查。当然,还存在可访问性问题。使用上下文web应用程序中的菜单仅作为快捷方式功能,而不是基本的访问方法。

是的,但我需要asdf()将事件作为输入(以便我可以检查是否按住ctrl键)。呜呜呜!addEventListener工作正常;谢谢。为了将来的参考,下面是允许我捕获事件的解决方案:function load(){var el=document.getElementById(“item_2”);el.addEventListener(“contextmenu”,asdf,false);}
事件侦听器中的参数[0]
属性是事件对象。要使用
窗口.event |(参数和参数[0])
而不是属性one中的
事件
。是否需要任何浏览器?我记得,名为
事件的第一个参数是由JavaScript 1.2在Netscape 4.0中引入事件对象时指定的,并且从那时起每个浏览器都复制了它(当然,IE除外,它的
window.event
混乱似乎源于对
onclick=“f(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>