如何检测函数何时被调用为jQuery回调与直接调用?

时间:2010-02-07 16:53:01

标签: javascript jquery function

我正在使用hoverIntent,作为其设置的一部分,它将调用一个函数。我认为这称为“引用函数”(正确吗?):

var HIconfig = {
     interval: 250,
     sensitivity: 8,
     over: myFunction,
     timeout: 100,
     out: myOtherFunction
};

但是,我想有时重用所述函数并显式传入jQuery对象。所以,我把它添加到函数中。

myFunction($myObject){
}

现在的挑战是弄清楚函数何时被hoverIntent引用或被显式调用。我的想法是,我会检查$(this)是否包含特定的DOM元素:

myFunction($myObject){
     if($(this).is('li')){
       $myObject = $(this)
     };

     $myObject.doSomething...

}

但是......我遇到了问题。如果我同时注销$(this)和$ myObject,则结果如下:

通过hoverIntent调用:

$(this) = [li#Trigger-0.nav-main-tab]
$myObject = Object { originalEvent=, more...}

通过明确传递对象来调用

$(this) = [Window PT02-home-page.php#]
$myObject = [li#Trigger-0.nav-main-tab]

我可以在第一个场景中测试$(this).is('li'),因为它是真的。

我不能在第二个,但是,当我尝试执行测试时,Firefox不喜欢它:

g.nodeName is undefined

一个建议是切换到1.4.1并尝试通过.isPlayObject测试相反的对象:

if (jQuery.isPlainObject($myObject))...

这在Firefox中运行得很好。但是,IE8总是返回true。

我的问题:

  1. 关于如何从hoverIntent直接调用我的函数,我的逻辑是否简单?

  2. 如果没有,有没有办法一致地测试,看看我是否已将一个对象显式传递给函数中的变量?

3 个答案:

答案 0 :(得分:3)

我会完全不同地做到这一点。首先,让一个函数将jQuery对象作为参数是很奇怪的。转到jQuery方式,将您的函数转换为jQuery插件。要在hoverIntent配置中使用,您可以将函数包装在另一个小函数中,或者使用新的(1.4)jQuery.proxy()函数执行此操作。

答案 1 :(得分:1)

为什么不传递一个简单的布尔值来指示从哪里调用它,而不是传递一个对象,例如:

myFunction(asOption){
    if(asOption) {
        alert("called from hoverIntent");
    } else {
        alert("called from somewhere else");
    }
}

还是我完全忽略了这一点?

答案 2 :(得分:1)

你使这个变得不必要地变得复杂。只需使用一个包装器来传递函数所需的参数的回调:

var HIconfig = {
     interval: 250,
     sensitivity: 8,
     // myFunction expects a jQuery object, so create one from the context
     over: function() { myFunction($(this)) },
     timeout: 100,
     out: myOtherFunction
};

...然后你可以完全跳过你的功能中的检查:

myFunction($myObject)
{
     $myObject.doSomething...
}