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 オブジェクトを作成し続ける必要がないようにするためです。また、callbacks オブジェクトのすべてのメンバーを比較して、1 つまたは 2 つの同じ名前のメンバーを持つオブジェクトが誤検知を引き起こす可能性がはるかに低いようにしました。

ただし、ループが必要で、常に時間がかかるため、特に私が作成する各ウィジェットの各イベントハンドラーをチェックするために使用される可能性が高いため、まだ好きではありません。まあ、誰かが最終的により良いもの (またはこれの改良版) を思いついた場合、それを変更する場所は 1 か所しかありません。

于 2013-04-30T10:50:36.870 に答える