【问题标题】:Why e is not used in Javascript methods called from onclick?为什么在从 onclick 调用的 Javascript 方法中不使用 e?
【发布时间】:2016-08-16 09:13:39
【问题描述】:

据我所知e 代表 Javascript 方法中的“事件”,但我不明白如果我想在调用它们时在 Javascript 方法中使用下面提到的某些属性怎么办。

例如我可以在这个方法中使用e.preventDefault()或e.ctrlKey:

$(".menuItem").click(function (e) {

    e.preventDefault();

    //Open url in new tab with ctrl key press
    if (e.ctrlKey) {
        window.open(url, '_blank');
        event.stopPropagation();
        return false;
    }

    //... code omitted for brevity
});   

但我不能在从表单元素调用的方法中使用它们,即.menuItem。有没有可能在下面那个方法中使用它?

function TestFunction(e, controller, action) {

        e.preventDefault();

        //Open url in new tab with ctrl key press
        if (e.ctrlKey) {
            window.open(url, '_blank');
            event.stopPropagation();
            return false;
        }

        //... code omitted for brevity
    });
};

更新:我调用TestFunction()如下图:

<a onclick="TestFunction('Account', '_Register')" id="test" class="nav-link ">

当我在那个方法中使用 e 时 “Uncaught ReferenceError: e is not defined” 遇到错误。有什么想法吗?

【问题讨论】:

  • 如您所见,您的TestFunction中没有e参数,您需要添加它
  • 是的,但是在使用它时,我遇到了问题中提到的错误。我也在问题中添加了 e 参数。有什么想法吗?
  • 如何将TestFunction与点击事件绑定?你的代码中有$(".menuItem").click(TestFunction); 吗?
  • 试试&lt;a onclick="TestFunction.bind(null,'Account', '_Register')" 和TestFunction 像这样:function TestFunction(controller, action, e) {
  • @T.J.Crowder "TypeError: e is null" 遇到错误。

标签: javascript jquery javascript-objects dom-events


【解决方案1】:

据我所知,“e”代表 Javascript 方法中的“事件”

仅按照惯例,因为人们使用该名称来声明事件处理程序接收的参数。也可以是gonzofish。

您不能在TestFunction 中使用事件对象,除非调用它来响应事件并将事件对象传递给它。

更新:你说过你像这样打电话给TestFunction:

<a onclick="TestFunction(e, 'Account', '_Register')" id="test" class="nav-link ">

如果是这样,请将TestFunction 更改为:

function TestFunction(e, controller, action)`

...并在其中始终使用e(不是event),并将onclick 属性更改为使用event,而不是e:

<a onclick="TestFunction(event, 'Account', '_Register')" id="test" class="nav-link ">

在onxyz 属性事件处理程序中,event 是一个范围内变量(在大多数浏览器上,它是围绕属性文本创建的生成函数的本地变量;在旧 IE 上,它是全局变量。


旁注:您可能会定期看到event(而不是e)而没有声明它。微软的 IE 曾经(可能仍然有)一个全局 event 对象(Chrome 决定放弃为 IE 编写的网站并复制它;Firefox 没有)。不要使用它。相反,请使用正确的事件处理并声明您收到的参数。

旁注 2:关于TestFunction,JavaScript 中压倒性的约定是函数名称仅在它们是构造函数时才以大写字母开头(例如,与new 一起使用)。按照惯例,所有其他函数名称应以小写字母开头。当然,您可以选择不遵守约定,但如果您遵守约定,您可以更轻松地阅读其他人的代码,反之亦然。

【讨论】:

  • 非常感谢您的详细解释。我在我的问题中更新了我的代码,现在它正在工作。在这种情况下,我们可以说“e 事件也可以用于这样调用的 javascript 方法吗?”
  • @binary:这里的关键是e 只是一个参数的名称。参数由函数的调用方式决定。在适当的事件处理程序(与addEventListener 挂钩)中,事件机制将参数传递给函数 for ryou。如果您使用onxyz 属性,则需要使用属性中的代码可以访问的event 变量显式传递它。
【解决方案2】:

event OR e 只能用于事件。并且您将在函数中访问。

要在函数中使用,您必须从事件中传递参数。

function TestFunction(controller, action,e) {.....

【讨论】:

  • 我不是downwoter,但只是为了提供信息,我也尝试过同样的方法但没有奏效:(
  • 谢谢,您是否从点击事件中传递了该参数?
  • 是的,但问题是 Rayon 提到的函数中参数的名称(我从 event 更改为 e)。投票+为您提供帮助。
  • 感谢您的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多