2010-02-07 76 views
4

我使用hoverIntent,作爲其設置的一部分,它將調用一個函數。我想,這就是所謂的「引用」的函數(正確嗎?):如何檢測函數作爲jQuery回調調用時與直接調用?

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... 

} 

但是...我有問題。如果我退出這兩個$(本)和$ 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

我會這樣做完全不同。首先,有一個函數把一個jQuery對象作爲參數很奇怪。去jQuery的方式,並把你的功能變成一個jQuery插件。爲了在你的hoverIntent配置中使用,你可以將你的函數包裝在另一個小函數中,或者使用新的(1.4)jQuery.proxy()函數來實現。

+1

插件將是我的終極目標。但我可能沒有時間來發布這個版本。單獨的功能是有意義的(並且事後很簡單!) – 2010-02-07 17:09:47

1

不是傳遞對象,爲什麼不通過一個簡單的布爾值,表明它已從調用,例如:

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

還是我完全錯過了點?

+0

有效的解決方案!謝謝。 – 2010-02-07 17:17:35

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... 
} 
+0

我必須獎勵@Pointy打敗你的答案,我喜歡增加簡單性,將功能放在配置本身中。 – 2010-02-07 17:18:28