什么是jQuery钩子和回调?

时间:2011-07-18 15:21:19

标签: jquery jquery-callback

我很难概念化jQuery中究竟回调或挂钩的内容。他们似乎被混为一谈,但我不知道他们之间的区别。

根据我从其他关于回调的帖子(如this)的理解,回调只是一个函数A,你传递给另一个函数B,一旦B完成就调用A. (这可能完全错了,如果是的话,请纠正我。)

除了声明“你应该使用钩子/回调”之外,我真的对钩子没有任何想法。有些东西让我怀疑它们是那么相似......

2 个答案:

答案 0 :(得分:13)

您的定义很接近但不充分。回调是一个函数A,它传递给另一个函数B(或对象B),B将在适当的位置调用

对于某些功能,“适当的点”是在该功能完成之后,如您所描述的那样。

当可以触发回调时,许多函数或对象定义一组“某些点”或事件。例如,如果您有一个通过AJAX定期更新自身的控件,它可能会定义在即将更新时发生的事件,在更新返回后发生的事件以及在显示结果后发生的事件。对于这些事件中的任何一个,您可以将其传递给应该在该事件发生时调用的自定义函数。

可以调用自定义函数的定义点集是人们所说的“钩子”。它们是您可以将功能挂钩到预构建库中的地方。

编辑添加:

OP要求提供一个简单的钩子示例。

假设我写了一个函数,它接受一个用户名列表,旨在浏览列表,查找每个人的详细信息,并返回一个填充的人物对象列表。

也许我想让程序员利用我的函数来指定在我的数据库中找不到用户名时会发生什么。一个程序员可能希望该函数出错,另一个可能希望它只是忽略丢失的示例,另一个可能希望它查看另一个数据库,另一个可能希望它构造一个空人对象。

所以我的函数签名可能类似于

function getPeople( arrayOfUsernames, missingUsernameCallback )

在这个函数中,每当我找到一个我在数据中找不到的用户名时,我只需要调用

missingUsernameCallback( notFoundUsername );

现在程序员可以像

一样调用函数
getPeople( ["adam","betty","charlie"], function(name){ alert("Missing username " + name)} );

每当我点击丢失的用户名时,我都会调用传递给我的函数。

对于更复杂的情况,我可能需要接受一个包含多个回调函数的对象,因此可以像

一样调用它
   getPeople( ["adam","betty","charlie"], 
        {startOfListCallback:      function(){ alert("I'm starting the list")},
         missingUsernameCallback:  function(){ alert("Missing username"!)},
         endOfListCallback:        function(){ alert("I'm at the end of the list") });

等。可能的回调列表将由函数定义,并且应该在API文档中(以及可以传递给回调的参数等)。回调列表是钩子。

答案 1 :(得分:1)

我猜你在上下文中看到用过的单词意味着回调,这正是你认为的那样(在jQuery的情况下,钩子和回调是一回事)。

例如,jQuery的animate()函数的回调将在动画完成后立即执行。

一些内置函数和其他jQuery插件可能会为各个执行阶段定义多个回调。例如,为用户显示弹出框的插件可能会在用户单击链接以显示该框时,但在实际显示该框之前有回调(此回调可用于存储某些数据,实际弹出窗口将需要,例如)。当盒子再次关闭时,相同的弹出功能也可能执行回调函数 - 此回调可用于更改页面,或保存一些数据。