jQuery: 如何判断一个函数是否被调用作为jQuery事件处理程序(回调函数)

4
我有一个 JavaScript 函数,可以直接调用,也可以作为 jQuery 事件的回调函数进行调用。
在后一种情况下,将传递 jQuery Event 对象作为参数。当我直接调用函数时,我还提供了另一种类型的参数(但仍然是对象)。
因此,需要能够检查(在函数内部)函数是如何被调用的,以知道它正在处理哪种类型的参数。
有没有一种简单的方法来实现这个?

你能提供一下你目前为止写的代码吗? - Neel
代码并没有什么特别有趣的地方。我尝试的只是:当直接调用函数时,我在第一个位置使用了一个空值,而在第二个位置使用了有用的参数。 - Nicolas Le Thierry d'Ennequin
2个回答

11

接受参数,然后查看它是否是jQuery.Event的实例:

function yourFunction(e) {
    if (e instanceof jQuery.Event) {
        // ...it was an event handler call
    }
}

实时示例 | 源代码

我建议避免使用这种方法。相反,如果您需要根据调用方式区分行为,则建议事件处理程序调用目标函数(而不是将目标函数作为实际事件处理程序)。

根据您在问题中的评论:

我的简单尝试是:当直接调用该函数时,我在第一个位置使用空值,在第二个位置使用有用的参数。

在这种情况下,更容易实现:

function yourFunction(e) {
    if (e) {
        // ...it was an event handler call -- or at least,
        // a non-falsey argument of some kind was passed in
    }
}

你甚至不需要传递null给函数,只需不带参数调用它。这样做时,e将是undefined,即虚假的值。(jQuery传递给处理程序的事件对象永远不会是虚假的值。)


谢谢,您的答案对我的情况很有用。然而我想知道:在设计函数时,假设它不会直接附加为事件处理程序似乎不是很好的实践。 - Nicolas Le Thierry d'Ennequin
@GlauberRocha:不会,但你可以期望(虽然可能不是假定)它将使用你为其定义的参数进行调用。如果你将其定义为不带参数(function foo() { ... }),那么无论是否有东西使用参数调用它都无所谓(除非你查看arguments对象)。该参数将被完全忽略。 - T.J. Crowder

-1

在if条件语句中尝试typeof()运算符。如果参数类型相同,您可以尝试为两个传递的对象/事件分配一个唯一的属性,然后再针对该属性执行检查...


在这两种情况下,typeof 只会返回 "object" - T.J. Crowder
明白了。您能处理一下这个吗?http://stackoverflow.com/questions/14852688/creating-a-model-structure-in-backbone :) - beNerd
@beNerd 我猜你认为我的问题和你的有关系...但是很抱歉,我并不这样认为。撇开它还没有被回答的事实... - Nicolas Le Thierry d'Ennequin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接