2013-04-26 51 views
0

任何人都知道一個簡單的方法來測試一個變量看它是否是類型jQuery.Callbacks的對象的實例。測試,如果變量是jQuery.Callbacks

背景:我有我已經創造了一些jQuery的小部件,而他們每個人都有使用jQuery.Callbacks事件管理。我的一些小部件使用其他小部件,並將給自己的配置傳遞給子小部件,這包括事件。所以如果我的父窗口小部件初始化一個事件,我不希望子窗口小部件再次初始化它,否則我將失去任何現有的訂閱。

例如:

var notCallbackHandler1=''; 
var notCallbackHandler2={ add: function(something) { } }; 
var callbackHandler=$.Callbacks(); 

function isVariableACallbackHandler(variable) { 
    // <-- What goes here? 
} 

isVariableACallbackHandler(notCallbackHandler1); // Should return false 
isVariableACallbackHandler(notCallbackHandler2); // Should return false 
isVariableACallbackHandler(callbackHandler); // Should return true 
+0

不'jQuery.Callbacks()已經(回調)'做的伎倆?剛剛在控制檯中測試過:'var fun = function(){}; 。$ .Callbacks()加(有趣)。先後(樂趣); // true' – Simon 2013-04-26 13:32:53

+0

這就是檢查回調處理程序是否有回調,這不是我正在尋找的。我將更新原始帖子以添加我想要的示例。 – Anupheaus 2013-04-26 13:41:23

回答

2

那麼你可以檢查,如果傳遞的參數有其特異於jQuery.Callbacks()的方法。像這樣例如:

var $callbacks = $.Callbacks(), 
    $noCallbacks = $('div'), 
    checkIfCallbacks = function(callback) { 
     var checkFun = 'fireWith'; 
     return typeof callback[checkFun] == 'function'; 
    }; 

checkIfCallbacks($callbacks); // true 
checkIfCallbacks($noCallbacks); // false 

更新:檢查typeof足夠。

更新:這裏將是一個改進版本的代碼,只是不要用於...循環,如果可能的話,如果你想要更好的性能,可以避免使用jQuery函數。

var $callbacksProto = $.Callbacks(); 

$.isCallbacks = function (object) { 
    // first check if we even have an object 
    // this can already save a lot of comparison time 
    if (typeof object == 'object') { 
     var prop, i; 

     for (i = 0; i < $callbacksProto.length; i++) { 
      prop = $callbacksProto[i]; 

      // check if the property name of the original $callbacksProto is a function in our object 
      // because every $callbacksProto property is a function 
      if (typeof object[prop] != 'function') { 
       return false; 
      } 
     } 

    } else { 
     return false; 
    } 

    // if no error occurred return true 
    return true; 
}; 
+0

沒錯,我確實想過這樣做,暫時我已經在使用這個想法了,但我想知道是否有一些簡單的東西我錯過了,我剛纔不知道的東西。我也不喜歡它可能會返回誤報的事實;但是不太可能,我可能只在名爲fireWith的對象上有一個函數,在這種情況下,它將無法使用。 – Anupheaus 2013-04-26 14:47:06

+0

那麼,如果你用一個名爲'fireWith'的函數創建一個對象,那麼當然會給你一個誤判。但是既然你知道,你可能不想爲自定義對象'fireWith'命名函數屬性;)。 – Simon 2013-04-26 14:52:37

+0

你假設我將成爲唯一一個使用這種方法的人,並且人們閱讀文檔,而且通常不會。 – Anupheaus 2013-04-26 16:26:14

0

這裏是我最終使用:

var tempCallbacksObject=$.Callbacks(); 
$.isCallbacks = function (variable) { 
    for (var propertyName in tempCallbacksObject) { 
     if (variable[propertyName] == undefined) { return false; } 
     if ($.type(tempCallbacksObject[propertyName]) != $.type(variable[propertyName])) { return false; } 
    } 
    return true; 
}; 

我創建了一個tempCallbacksObject,這樣我就不必保留每個我想比較的時間來創建一個回調對象。我還比較了回調對象的每個成員,以便具有相同名稱的成員或兩個成員的對象導致誤報的可能性要小得多。

我還是因爲它需要一個循環,並總是需要時間的不喜歡它,雖然,特別是因爲它很可能被用來檢查創建每個插件每個事件處理程序。噢,如果有人終於想出了更好的東西(或者這個改進版本),那麼我只有一個地方可以改變它。