0

我在右键单击页面中的按钮时显示上下文菜单。用于显示上下文菜单的代码是

window.addEventListener('contextmenu',function (e){e.preventDefault();},false);}

当我右键单击按钮时,调用的上下文菜单方法是

displaycontextmenu(obj,event)
{
      console.log("Context");
      console.log(event);
      // Displaying context menu
}

代码在 IE 浏览器中执行良好,即使在 chrome 中我也可以在控制台中看到“上下文”和打印事件。但在 Firefox 中,它打印为“上下文且未定义。看到这里事件未定义,我真的很困惑。

我正在使用该事件来获取 x 和 y 坐标以在正确的位置显示上下文菜单。由于事件未定义,因此无法继续进行。

4

1 回答 1

3

之所以能event在 chrome 和 IE 的控制台看到显示,是因为 IE 一直有将事件对象分配给全局引用(window.event)的坏习惯。
Chrome 已经正确实现了 W3C 模型,并按照您的预期将事件对象传递给处理程序,但准备好对该事件对象的全局引用,以防万一。

尝试 logging obj,它会在 FF 中记录事件对象......我对此很有信心。Chrome 的行为方式也完全相同:事件对象将被传递给处理程序。

由于event参数未定义,我只能假设它event被忽略(被视为保留关键字,但只是悄悄地),或者正在进行一些幕后范围扫描,将local event解析为global [window.]event

无论如何,不​​允许或不赞成使用可能是关键字或已经存在的变量名(例如documentwindow或)。this这就是为什么你会经常看到这个:

function eventHandler (e)
{
    e = e || event;
}

e允许作为 varname,并且没有名称冲突,除非我们自己创建一个。如果处理程序没有收到事件对象,我们引用event它,由于范围扫描,将被解析为window.event.

于 2013-04-16T18:21:47.057 回答