【问题标题】:General way to provide the event argument in a function in JavaScript在 JavaScript 中的函数中提供事件参数的一般方法
【发布时间】:2015-03-07 04:41:03
【问题描述】:

我多年来以大致相同的方式声明事件参数:

 element.onclick = function(e){};
 element.onclick = function(event){};

 element.addEventListener("click", function(e){}, false);
 element.addEventListener("click", eventHandler, false); //preferred version

 function eventHandler(e){} 

 etc.
  • 必须是e 还是event
  • 它是作为最后一个参数附加还是也可以是第一个?

你能做到吗:

 function eventHandler(e, a, b, c, d){}

e 仍然是指事件还是 d

或者要使上述工作您需要明确使用关键字event

所以一般的问题是:在 JavaScript 中声明事件参数时有哪些经验法则?

【问题讨论】:

  • 可以根据需要命名参数,重要的是顺序...并在函数中使用相同的名称
  • chrome 如果省略则将其命名为事件,所以我猜事件更标准,但我喜欢 e。它只是对大多数(所有?)dom 事件重要的第一个参数/参数。
  • @dandavis:DOM 事件处理程序只接收一个参数:w3.org/TR/dom/#eventtarget
  • 您是在谈论 DOM 事件处理程序,还是一般的事件处理程序?

标签: javascript events arguments


【解决方案1】:

在下文中,我假设您指的是 DOM 事件处理程序。

必须是e 还是event

没关系。我们关心的可能是ajdlahksjd

它是作为最后一个参数附加还是也可以是第一个?

事件对象将始终作为第一个参数传递给处理程序。

你能做到吗:

 function eventHandler(e, a, b, c, d){}

e 仍然指的是事件还是 d

这取决于您如何绑定事件处理程序。如果你只是分配它,它将是e。如果您已经将其他值绑定到参数,例如通过.bind,它将是第一个未绑定的参数。但是,这与事件处理程序没有任何关系。事件处理程序本身也会获取事件对象作为第一个参数。

或者要使上述工作您需要明确使用关键字event

event 不是关键字。您可以随意命名参数。

在 JavaScript 函数中声明事件参数时有哪些经验法则?

没有。您的事件处理程序没有神奇的静态检查。它只是一个接受参数的函数,就是这样。

但是,约定将参数命名为 eevent,仅仅是因为它是表示事件对象的变量的合理名称。

【讨论】:

  • event 不是官方关键字,但它存在。 test 例如...
  • 是的。因为浏览器会将其转换为function(event) { alert(event.type); }
  • 我在 HTML 4 中找不到任何东西,但 HTML5 定义了这种行为:w3.org/html/wg/drafts/html/master/…
  • @FelixKling;我完全理解你的回答。谢谢,但你能解释一下吗:element.onkeydown = test.bind(this, 1, 2, 3, 4); function test(a, b, c, d, e)e 是事件处理程序。
  • @Mouser:这正是我想过写作的情况,但没有(现在我这样做了)。当然,如果您已经为函数提供了.bind 参数,则事件对象具有第一个非绑定参数。但是,这与事件处理程序无关,这就是 .bind 和部分应用程序的工作方式。示例:function foo(a, b) { }; var bound = foo.bind(null, 1); bound(2);。在这里,a=1b=2。扩大了我的答案。
【解决方案2】:

就我个人而言,我认为这没有任何规定,但伟大的 Nicholas Zakas 在他的书 Maintainable JavaScript 中告诉我们,如果你想要一个易于测试和维护的功能,你永远不会必须将事件声明如下:

function myFunction(event) {}

相反,您必须声明函数所需的参数:

function myFunction(clientX, clientY) {}

并且当你调用函数时,你必须从对象事件中传递参数:

// This won't work on IE8 and older versions.
element.addEventListener('click', function(event) {
    myFunction(event.clientX, event.clientY);
}, false);

当您或团队中的其他人必须测试此功能时,他/她不需要模拟任何事件。

【讨论】:

  • event 来自哪里?现在您需要另一个事件处理程序,事件对象作为第一个参数传递,然后可以用来填充myFunctionO.o的参数
  • 可以,但您可以使用anonymous function。使用这种方法,您可以将函数与逻辑从事件中分离出来,并且可以安全地对其进行测试。
  • @LeonardoManrique:但这不是意味着在进行更改时需要多一个编辑位置吗?感觉也有点重复。我可以看到这种愿望,并且 angular 很好地利用了这种约定,但我并不认为每个小动作都有两个功能。值得吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多