javascript:can';t将oncontextmenu属性设置为预定义函数
我正在尝试编写一个函数,用于读取div项的oncontextmenu事件。(我需要它来确定是否按下了ctrl键,例如使用e.ctrlKey。) 这项工作: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 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>