2010-01-03 53 views
2

我正在尝试编写一个读取div项目的oncontextmenu事件的函数。 (我需要找出是否被按下Ctrl键进行,例如,通过使用e.ctrlKey。)javascript:无法将oncontextmenu属性设置为预定义函数

这工作:

<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> 

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

谢谢。

回答

2
oncontextmenu="asdf()" 

您不能直接使用属性值分配预定义的函数。只有匿名函数(其中function() {}attribute=""更换。这使得相当困难的陷阱事件对象(也许是不可能的,这是不是我曾经觉得有必要进行调查)。

如果要功能直接分配,不使用JavaScript用的attachEvent /的addEventListener它

+0

woohoo! addEventListener工作;谢谢。以供将来参考,这里是允许我捕获该事件的解决方案: \t功能负载(){ \t \t变种EL =的document.getElementById( “ITEM_2”); \t \t el.addEventListener(“contextmenu”,asdf,false); \t} \t – unsorted 2010-01-03 10:36:10

+0

事件监听器属性中的arguments [0]是事件对象。 – 2010-01-03 15:14:27

1
oncontextmenu="asdf()" 

应该工作,不是吗?

+0

这应该做的工作。 – 2010-01-03 10:23:55

+0

是的,但我需要asdf()将事件作为输入(以便我可以检查ctrl是否被按住)。 – unsorted 2010-01-03 10:27:37

5
<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不支持它,如果缺少使用IE特定的attachEvent代替。如果同一个对象上的同一个事件不需要多个处理程序,那么只需使用旧式onevent类型的处理程序就可以更容易(并且与古代浏览器更兼容)。

请注意,contextmenu是一个不可靠的事件。它在所有浏览器中都不受支持,可能会被禁用,或者可能始终显示浏览器的真实上下文菜单,在Mac上,常见的方法是使用按住Control键单击,这可能会混淆您的支票ctrlKey。另外当然还有无障碍问题。仅将Web应用程序中的上下文菜单用作快捷方式功能,而不是作为基本访问方法。

+0

你想在属性1中使用'window.event‖(arguments && arguments [0])'而不是'event'。 – 2010-01-03 15:16:07

+0

有什么需要的浏览器?正如我记得的那样,命名为'event'的第一个参数是在事件对象在Netscape 4.0中引入时由JavaScript 1.2指定的,并且已被每个浏览器复制(因为当然除了IE,其'window.event'混乱似乎源于误解为什么'onclick =“f(event)”'应该工作)。 – bobince 2010-01-03 21:27:43

相关问题