假设我有一个像这样的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));});
所以基本上我只是想问有没有办法以更“流畅”的方式实现这个功能。
答案 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中实现相同效果并不简单。
因此虽然有可能实现这种编码风格,但它可能弊大于利。我们刚刚看到的简单,几乎是自然语言的行在其他地方需要大量不太直观的代码,不仅在库/框架中,而且在使用它的应用程序中。