2

私が求めている機能と関連している可能性があるため、すべてのコードを貼り付けます。私の機能の1つを実行するのを手伝ってくれました。関数を見てくださいparseJSON()。2 つの関数 (parseJSON()およびネストされたmakeNav(navigation)) を使用する必要があるのに、1 つだけではなくparseJSON(navigation)(および内部要素を makeNav から parseJSON に変更するための ofc) を使用する必要があるのはなぜですか。誰かがなぜそれが私にとってそのようにしか機能しないのか説明できますか. 運動をして続けるだけでなく、それを理解したいからです。

    var new_json;
    $.get('navigation.json', function (json){
        new_json = json;
        parseJSON();

        var reload_page;
        var this_hash = window.location.hash;

        if( this_hash.length == 0 ){
            reload_page = "home";
        }else{
            reload_page = this_hash.replace('#', '');
        };

        loading(reload_page + '.html');
    });

    var cache = {};

    function loading(url){


        if( typeof(cache[url]) == 'undefined' ) {
            console.log( 'cache A does not exists' );

            container.load(url + ' .container>*', function(){

                cache[url] = container.html();          
            });
        }else {
            console.log( 'cache A exists' );

            container.html(cache[url]);
        };
    };

    $('#navigation li a, #logo a').live('click',function(){

        var url = $(this).attr('href');

        window.location.hash = url.replace('.html', '');

        loading(url);

        return false;
    });




    function parseJSON() {

        function makeNav(navigation) {
            var nav_html = '';
            console.log( navigation.length );
            for (var i = 0; i < navigation.length; i++) {
                var name = navigation[i]['name'];
                var href = navigation[i]['href'];
                var submenu = navigation[i]['navigation'];

                nav_html += '<li><a href="' + href + '">' + name + '<span class="ddArrow"></span></a>';     

                if( typeof(submenu) != 'undefined' ){
                    nav_html += '<ul>';
                    nav_html += makeNav(submenu);
                    nav_html += '</ul>';
                }
                nav_html += '</li>';
            }
            return nav_html;
        }
        $('#navigation ul').html(makeNav( new_json['navigation'] ));
    }
4

1 に答える 1

2

考えられる理由は、parseJSON余分なことをすることです。$('#navigation ul').html(makeNav( new_json['navigation']));再帰呼び出しを行うとき、makeNavこの html コンテンツを設定する必要はありません。makeNavinsideのネストされた定義の理由は、単にこのスコープ外では使用せず、「環境」を汚染したくないため、 のスコープ外に表示されparseJSONたくないことが考えられます。makeNavparseJSON

とにかく、それが実装する最良の方法だとは本当に思いません...しかし、それはhttps://codereview.stackexchange.com/で議論されるべきです。

ネストされていない単一の関数を使用するには、次のmakeNavようなことができます。

var new_json;
$.get('navigation.json', function (json){
    new_json = json;
    parseJSON();

    var reload_page;
    var this_hash = window.location.hash;

    if( this_hash.length == 0 ){
        reload_page = "home";
    }else{
        reload_page = this_hash.replace('#', '');
    };
    loading(reload_page + '.html');
});

var cache = {};

function loading(url){
    if( typeof(cache[url]) == 'undefined' ) {
        console.log( 'cache A does not exists' );
        container.load(url + ' .container>*', function(){
                cache[url] = container.html();          
        });
    }else {
        console.log( 'cache A exists' );
        container.html(cache[url]);
    };
};

$('#navigation li a, #logo a').live('click',function(){
    var url = $(this).attr('href');
    window.location.hash = url.replace('.html', '');
    loading(url);
    return false;
});




function makeNav(navigation) {
    var nav_html = '';
    console.log( navigation.length );
    for (var i = 0; i < navigation.length; i++) {
        var name = navigation[i]['name'];
        var href = navigation[i]['href'];
        var submenu = navigation[i]['navigation'];

        nav_html += '<li><a href="' + href + '">' + name + '<span class="ddArrow"></span></a>';     

        if( typeof(submenu) != 'undefined' ){
            nav_html += '<ul>';
            nav_html += makeNav(submenu);
            nav_html += '</ul>';
        }
        nav_html += '</li>';
    }
    return nav_html;
}
于 2013-01-18T08:06:06.830 に答える