0

ファンシーボックスのバージョンを変更して、実行関数の前に少しコードを実行します。コードを実行関数に入れることができると思いますが、私が懸念している次の元の行をなぜ実行できるのか疑問に思っています。

D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', run);

私は次のことをしたいと思います:

    D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', function(){ /*do something */ run(); });

残念ながら、このように run 関数を実行しようとすると、ロードできないというエラーが発生します。ここでのデフォルト ハンドラーと関数呼び出しの違いは何ですか? 以前の意味でのコールバックとして使用されることは理解していますが、ここでも同じではないでしょうか。または、舞台裏で実行に渡されるデフォルトのパラメーターがいくつかあります。これを渡す、つまり run(this) を試みましたが、fancybox はまだ失敗します。何か案は?

元のソースのより大きな部分:

// jQuery plugin initialization
     $.fn.fancybox = function (options) {
        var opts = options || {},
            selector = this.selector || '';

    function run() {


        var group = [], relType = false, relVal = $(this).data('fancybox-group');

        // Check if element has 'data-fancybox-group' attribute, if not - use 'rel'
        if (typeof relVal !== 'undefined') {
            relType = relVal ? 'data-fancybox-group' : false;

        } else if (this.rel && this.rel !== '' && this.rel !== 'nofollow') {
            relVal = this.rel;
            relType = 'rel';
        }

        if (relType) {
            group = selector.length ? $(selector).filter('[' + relType + '="' + relVal + '"]') : $('[' + relType + '="' + relVal + '"]');
        }


        if (group.length) {
            opts.index = group.index(this);

            F.open(group.get(), opts);

        } else {
            F.open(this, opts);
        }

        return false;


    }

    if (selector) {
        D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', run);

    } else {
        $(this).unbind('click.fb-start').bind('click.fb-start', run);
    }

    return this;

};
4

1 に答える 1

2

これを試して:

    D.undelegate(selector, 'touchstart.fb-start click.fb-start')
      .delegate(selector, 'touchstart.fb-start click.fb-start', 
        function(){
          /*do something */ 
          run.call(this); 
        });

「実行」関数がthis、期待どおりに記述されたとおりに設定されていることを確認する必要があります。つまり、ライブラリは、呼び出された関数がthis関連するもの (fancybox オブジェクトなど) に設定されるようにします。そのような匿名関数を挿入すると、関数もそのように呼び出されますthisその値を、すでに存在していた関数に渡す必要があります。

于 2013-07-22T16:06:58.507 に答える