是否有更流畅的jQuery事件处理程序?

时间:2015-01-30 17:36:01

标签: javascript jquery

假设我有一个像这样的jQuery选择器链:

var toObject = function () { return this; };
var doAction = function () { /*do action*/ };

$('.selector').map(toObject).each(doAction);

是否可以编写相同的逻辑,但使用这样的事件过滤器:

/*onChange() doesn't exist. I made it up as an example.*/
$('.selector').onChange().map(toObject).each(doAction);

这是Promises和Fluent Selectors的混合体。 onChange基本上是一个永无止境的过滤器,当触发更改事件时,它总能返回更多项目。

从功能上来说,我知道我可以通过以下方式实现这一目标:

var toObject = function (obj) { return obj; };
var doAction = function (obj) { /*do action*/ };

$('.selector').change(function () { doAction(toObject(this));});

所以基本上我只是想问有没有办法以更“流畅”的方式实现这个功能。

1 个答案:

答案 0 :(得分:1)

jQuery事件处理程序以下列方式使用:

// Let's call this "coding style A"

$("selector").onSomeEvent(doSomething);

// With promises:
someAsyncProcess().done(doSomething);

doSomething是一个函数。您基本上可以创建事件处理程序并将它们作为参数传递。我认为其背后的基本原理部分是事件方法可以返回一个jQuery对象,因此您可以链接处理程序分配:

$("selector").onSomeEvent(doSomething).onSomeOtherEvent(doAnotherThing);

如果我可以发表意见,这对我来说已经足够可读了。将处理程序作为参数传递也很自然。

你问是否有可能以另一种方式编写处理程序,即使它只是为了与程序其余部分的编码风格保持一致:

// We're going to call this "coding style B"
$("selector").onSomeEvent().doSomething();

现在看起来不错,但它有自己的问题。首先,我们在B中使用的doSomething()函数不能与我们在A中使用的doSomething()相同。在A中,doSomething()是一个事件处理程序。在B中,doSomething()在我们附加事件时同步执行,因此它不能是实际的事件处理程序(只要事件处理程序表示在事件发生时执行的函数) )。

此外,请注意,在A上onSomeEvent()可能是某些通用API的一部分(就像jQuery的click()change()on()等等。 handler doSomething()可能包含特定于应用程序的逻辑。鉴于泛型onSomeEvent()应返回已具有名为doSomething的属性的对象,在B中实现相同效果并不简单。

因此虽然有可能实现这种编码风格,但它可能弊大于利。我们刚刚看到的简单,几乎是自然语言的行在其他地方需要大量不太直观的代码,不仅在库/框架中,而且在使用它的应用程序中。