测试变量是否是jQuery.Callbacks的实例

时间:2013-04-26 13:24:40

标签: jquery callback

任何人都知道测试变量的简单方法,看它是否是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

2 个答案:

答案 0 :(得分: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

更新:检查类型是否足够。

更新:这将是您的代码的改进版本,如果您想要更好的性能,请不要使用for ... in循环并尽可能避免使用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;
};

答案 1 :(得分: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,这样我就不必每次想要比较时都继续创建一个Callbacks对象。我还比较了回调对象的每个成员,以便具有一个或两个具有相同名称的成员的对象不太可能导致误报。

我仍然不喜欢它,因为它需要循环并且总是需要时间,特别是因为它可能用于检查我创建的每个小部件上的每个事件处理程序。哦,好吧,如果有人最终想出更好的东西(或改进版本),那么我只有一个地方可以改变它。