0

任何人都知道测试变量以查看它是否是 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
4

2 回答 2

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 就足够了。

更新:这将是您的代码的改进版本,如果您想要更好的性能,请不要使用 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;
};
于 2013-04-26T13:58:59.150 回答
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 对象。我还比较了回调对象的每个成员,以便具有相同名称的一两个成员的对象不太可能导致误报。

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

于 2013-04-30T10:50:36.870 回答