2013-02-13 42 views
4

我有一個JavaScript函數可以直接調用,也可以作爲jQuery事件的回調函數調用。jQuery:確定函數是否作爲jQuery事件處理函數調用(回調函數)

在後一種情況下,jQuery Event對象將作爲參數傳遞。當我直接調用函數時,我還提供了一個參數(不同類型的參數,但仍然是一個對象)。

因此,我需要能夠檢查(在函數體內)函數是如何被調用的,以便知道它處理的是什麼類型的參數。

有沒有簡單的方法來做到這一點?

+0

你可以提供你的代碼,無論你現在試過了嗎? – Neel 2013-02-13 12:02:03

+0

代碼沒有什麼非常有趣的地方。我簡單地嘗試的是:當直接調用函數時,我在第一個位置使用空值,在第二個位置使用有用參數。 – 2013-02-13 12:04:04

回答

11

接受參數,然後查看它是否爲instanceofjQuery.Event

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

Live Example | Source

雖然我會推薦避免這種事情。相反,如果您需要根據調用的方式區分行爲,我建議讓事件處理程序調用目標函數(而不是使用目標函數作爲實際的事件處理程序)。

從對這個問題您的評論:

我試圖簡單地說就是:當函數直接調用,我在第一位置和第二位置有用的參數中使用空值。

在這種情況下,那就更簡單了:

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通過處理程序將永遠不會是假的。)

+0

謝謝,你的答案將在我的特殊情況下有用。但是我想知道:在設計函數時,似乎並不是很好的做法,假設它不會直接作爲事件處理程序附加。 – 2013-02-13 13:27:12

+0

@GlauberRocha:不,但您可以期待(儘管可能不會*假設*)它會被您爲它定義的參數調用。如果你將它定義爲不帶參數('function foo(){...}'),那麼用某個參數調用它是沒有關係的(除非你查看'arguments'對象)。這個論點將被完全忽略。 – 2013-02-13 13:32:50

-1

嘗試在if條件中使用typeof()運算符。如果參數類型相同,則可以嘗試在任一情況下分配傳遞對象/事件的唯一屬性,然後再次執行該屬性的檢查...

+0

'typeof'只會給你''對象''在這兩種情況下 – 2013-02-13 12:03:39

+0

嗯明白了。你能用這個做點什麼嗎? http://stackoverflow.com/questions/14852688/creating-a-model-structure-in-backbone :) – beNerd 2013-02-13 12:19:27

+0

@beNerd我假設你看到我的問題和你的問題之間的關係......但我很抱歉,我不'噸。撇開它沒有得到回答的事實... – 2013-02-23 08:48:35