0

プラグインを作成していて、各メソッド内で関数をラップしようとしていますが、プラグインが壊れています。ブロックコンテンツが「this.each」プラグイン内にラップされていない場合は機能します。複数のセレクターを渡すには、「this.eachを返す」必要があることを理解していますか?また、プラグイン内でセレクターを使用する必要をなくしたいと思います。たとえば、「#the_lead」ではなく、「this」を使用します。

(function($) {
    $.fn.scroll_lead = function (options) {
        var defaults = {
            speedup: 500
        };
        var options = $.extend({}, defaults, options);
        return this.each(function () {
            var $window_height = $(window).height();
            var $document_height = $(document).height();
            var $hide_lead;
            $(window).scroll(function () {
                var $scrollTop = $(window).scrollTop();
                if (!$hide_lead) {
                    if ($scrollTop > ($document_height / 2)) {
                        $("#the_lead").slideDown(options.speedup);
                    } else {
                        $("#the_lead").slideUp(500, function () {
                            $(this).hide();
                        });
                    }
                }
            });
            $('#hide_lead').click(function (e) {
                $(this).parent().parents('div').hide();
                hide_lead = true;
                e.preventDefault();
            });
        });
    };
})(jQuery);
4

2 に答える 2

0

いくつかのこと;

  1. $(this)を$ thisに割り当て、プラグイン内の任意の関数内で使用します。チュートリアル(http://docs.jquery.com/Plugins/Authoring )で説明されています。

    return this.each(function () {
        var window_height = $(window).height();
        var document_height = $(document).height();
        var hide_lead;
        $this = $(this);
        $(window).scroll(function () {
            var scrollTop = $(window).scrollTop();
            if (!hide_lead) {
                if (scrollTop > (document_height / 2)) {
                    $this.slideDown(options.speedup);
                } else {
                    $this.slideUp(500, function () {
                        //$(this).hide();
                    });
                }
            }
        });
        $this.click(function (e) {
            $(this).parent().parents('div').hide();
            hide_lead = true;
            e.preventDefault();
        });
    });
    
  2. $(window)や$(document)など、プラグイン内の親オブジェクトの操作は避けてください。

    ウィンドウとドキュメントのプロパティを読み取っても問題ありませんが、プラグインで操作すると、セレクターの回数によって操作されます。

    コードでは、this.eachを使用しているため、ウィンドウのスクロール機能を数回バインドしています。たとえば、$( "div")。scroll_lead()は、'scroll'メソッドをドキュメントのタグと同じ数のウィンドウにバインドします。同じことが$(document)とプラグインターゲットのすべての親要素にも当てはまります。

  3. 可能であれば、それがあなたの意図である場合は、ウィンドウのスクロールではなく、要素のスクロール方法を使用してください。

    スクロール値を取得するには$(el).scrollTop()

    下にスクロールするには、$(el).scrollTop(NUMBER)

    onScrollメソッドをバインドするには、$(el).scroll(functtion(){...})

それが役に立てば幸い

于 2013-02-08T20:25:21.300 に答える
0

まず、構文が正しくありません。

eachthisこれは関数のコンテキストであり、jquery が認識している要素ではないため、存在しません。

$(this).eachどちらがあなたに近づくか試してください。

Jquery.Eachは、オブジェクトまたは配列ではないものを反復処理できないため、達成しようとしていることが理にかなっていることを確認してください。

ここで何を達成しようとしていますか?

于 2013-02-08T06:03:28.813 に答える