我正在使用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。
我的问题:
关于如何从hoverIntent直接调用我的函数,我的逻辑是否简单?
如果没有,有没有办法一致地测试,看看我是否已将一个对象显式传递给函数中的变量?
答案 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...
}