0

jQuery.fn.animate() を使用しているときに、パラメーター (アニメーション、コールバック関数、イージング、およびデュレーションの CSS) の一部またはすべてを任意の順序で関数に渡すことができることに気付きました。

関数のソース コードを調べると、次のように始まります。

function (prop, speed, easing, callback) {
    var empty = jQuery.isEmptyObject(prop),
        optall = jQuery.speed(speed, easing, callback),
.
.
.

そして、渡された情報を実際に処理し始めます。したがって、明らかに css プロパティ オブジェクトがチェーンの最初にある必要があります。しかし、jQuery.speed を見てください。

function (speed, easing, fn) {
    var opt = speed && typeof speed === "object" ? jQuery.extend({},
    speed) : {
        complete: fn || !fn && easing || jQuery.isFunction(speed) && speed,
        duration: speed,
        easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
    };
.
.
.

明らかに、これは魔法の場所です。しかし、括弧と中括弧を削減するという jQuery のアプローチにより、これらすべての条件を分解することが難しくなっています。jQuery.speed 関数を簡略化していただけますか? ありがとう。

4

1 に答える 1

1

より包括的な方法で書くと、これは jQuery が行うことです:

function (speed, easing, fn) {
    var opt;
    if (speed && typeof speed === "object") {
        opt = jQuery.extend({}, speed);
    }
    else {
        var complete_p,
            duration_p = speed,
            easing_p;

        // Find out what's the "complete" property
        if (fn) complete_p = fn;
        else {
            if (easing) {
                complete_p = easing;
            }
            else {
                if (jQuery.isFunction(speed)) {
                    complete_p = speed;
                }
            }
        }

        // Find out what's the "easing" property
        if (fn) {
            easing_p = easing;
        }
        else {
            if (easing) {
                if (!jQuery.isFunction(easing)) {
                    easing_p = easing;
                }
            }
        }

        opt = {
            complete: complete_p,
            duration: duration_p,
            easing: easing_p
        };
    }
.
.
.

そう...はい、順序を変更できるようにするためにいくつかのチェックを行っています。しかし、私はそれに頼るつもりはありません。

于 2013-01-31T09:48:16.750 に答える