0

私は Web 開発に不慣れで、最近明らかにモジュール パターンを発見しました。しかし、JS に実装する際に問題が発生しています。

 var navigation = (function(){
    //chache DOM
    var $navBar = $('.navBar');
    var $navBtn = $('.navBar .btn');
    var $section = $('.section');
    var mobileNav = $('.navBarMobile');

    //bind events
    $('.navBar .btn').on('click', sectionScroll());
    //$navBtn.on('click', sectionScroll()); wouldn't run


    //select section via scroll pos.
    function selectScroll(){
        var windscroll = $(window).scrollTop();
        if (windscroll >= 10) 
        {
            $('.section').each(function(i)
            {            
                if ($(this).offset().top -200 <= (windscroll)) 
                {
                    $navBtn.removeClass('selected');
                    $navBtn.eq(i+6).addClass('selected');
                    $navBtn.eq(-i+5).addClass('selected');
                }
            });
        } 
     }

    //scroll to section via click
    function sectionScroll(e){
        e.preventDefault();

        var target = $(this).find('a').attr('data-scroll');
        var offset = $('[data-anchor=' + target +']').offset().top - 100;
        TweenMax.to($('html, body').stop(), 1, {scrollTop: offset, delay:     .36});  
    }

    return {
        selectScroll: selectScroll
    };

    })();

    var main = function () 
    {
        $(window).scroll(function() { navigation.selectScroll(); }).scroll();
    }; 
    $(document).ready(main);

私の selectScroll 関数では、「$navBtn」を「$('.navBar .btn')」に置き換えるまで正しく実行されませんでした。変数を宣言したときに何か間違ったことをしましたか?

また、sectionScroll 関数に置き換える $navBtn.on('click', sectionScroll()); と 、このエラーが発生し続けました: 未定義のプロパティ 'preventDefault' を読み取ることができません$('.navBar .btn').on('click', sectionScroll());

編集:このページの @Bergi のおかげで問題が見つかりました。私の質問は、このソリューションを明らかにするモジュールパターンと一緒に使用する最良の方法は何でしょうか? JS に defer 属性を設定することになるでしょうか:
<script type="text/javascript" src="js/app.js" defer></script> または、公開モジュール パターンを使用する場合のより良い解決策はありますか?

4

1 に答える 1