<commit_before>/**
 * 路由控制器
 */
J.Router = (function($){
        var _history = [];
    /**
     * 初始化events、state
     */
    var init = function(){
        $(window).on('popstate', _popstateHandler);
        //阻止含data-target或者href以'#'开头的的a元素的默认行为
        $(document).on('click','a',function(e){
            var target = $(this).data('target'),
                href = $(this).attr('href');
            if(!href ||  href.match(/^#/) || target){
                e.preventDefault();
                return false;
            }
        });
        $(document).on('tap','a',_targetHandler);
        _initIndex();
    }

    var _initIndex = function(){
        var targetHash = location.hash;
        var $section = $('#section_container section').first();
        var indexHash = '#'+$section.attr('id');
        _add2History(indexHash,true);
        if(targetHash != '' && targetHash != indexHash){
            _showSection(targetHash);//跳转到指定的页面
        }else{
            $section.trigger('pageinit').trigger('pageshow').data('init',true).find('article.active').trigger('articleshow');
        }
    }

    /**
     * 处理浏览器的后退事件
     * 前进事件不做处理
     * @private
     */
    var _popstateHandler = function(e){
        if(e.state && e.state.hash){
            var hash = e.state.hash;
            if(_history[1] && hash === _history[1].hash){//存在历史记录，证明是后退事件
                J.Menu.hide();//关闭当前页面的菜单
                J.Popup.close();//关闭当前页面的弹出窗口
                back();
            }else{//其他认为是非法后退或者前进
                return;
            }
        }else{
            return;
        }

    }
    var _targetHandler = function(){
        var _this = $(this),
            target = _this.attr('data-target'),
            href = _this.attr('href');

        switch(target){
            case 'section' :
                if(J.settings.appType == 'single'){
                    _showSection(href);
                }
                break;
            case 'article' :
                _showArticle(href,_this);
                break;
            case 'menu' :
                _toggleMenu(href);
                break;
            case 'back' :
                back();
                break;
        }
    }

    /**
     * 跳转到新页面
     * @param hash 新page的'#id'
     */
    var _showSection  = function(hash){
        if(J.hasMenuOpen){//关闭菜单后再转场
            J.Menu.hide(200,function(){
                _showSection(hash);
            });
            return;
        }
        //读取hash信息
        var hashObj = J.Util.parseHash(hash);
        var current = _history[0]?_history[0].tag:null;
        //同一个页面
        if(current === hashObj.tag)return;
        //加载模板
        J.Page.load(hashObj,function(){
            _changePage(current,hashObj.tag);
            _add2History(hash);
        });
    }
    /**
     * 后退
     */
    var back = function(){
        if(J.settings.appType == 'single'){
            _changePage(_history.shift().tag,_history[0].tag,true)
        }
        window.history.go(-1);
    }
    var _changePage = function(current,target,isBack){
        J.Transition.run(current,target,isBack);
    }
    /**
     * 缓存访问记录
     */
    var _add2History = function(hash,noState){
       var hashObj = J.Util.parseHash(hash);
        _history.unshift(hashObj);
        if(noState){
            window.history.replaceState(hashObj,'',hash);
        }else{
            window.history.pushState(hashObj,'',hash);
        }
    }

    /**
     * 激活href对应的article
     * @param href #id
     * @param el 当前锚点
     */
    var _showArticle = function(href,el){
        var article = $(href);
        if(article.hasClass('active'))return;<commit_msg>重新梳理 后退键的执行过程<commit_after>/**
 * 路由控制器
 */
J.Router = (function($){
        var _history = [];
    /**
     * 初始化events、state
     */
    var init = function(){
        $(window).on('popstate', _popstateHandler);
        //阻止含data-target或者href以'#'开头的的a元素的默认行为
        $(document).on('click','a',function(e){
            var target = $(this).data('target'),
                href = $(this).attr('href');
            if(!href ||  href.match(/^#/) || target){
                e.preventDefault();
                return false;
            }
        });
        $(document).on('tap','a',_targetHandler);
        _initIndex();
    }

    var _initIndex = function(){
        var targetHash = location.hash;
        var $section = $('#section_container section').first();
        var indexHash = '#'+$section.attr('id');
        _add2History(indexHash,true);
        if(targetHash != '' && targetHash != indexHash){
            _showSection(targetHash);//跳转到指定的页面
        }else{
            $section.trigger('pageinit').trigger('pageshow').data('init',true).find('article.active').trigger('articleshow');
        }
    }

    /**
     * 处理浏览器的后退事件
     * 前进事件不做处理
     * @private
     */
    var _popstateHandler = function(e){
        if(e.state && e.state.hash){
            var hash = e.state.hash;
            if(_history[1] && hash === _history[1].hash){//存在历史记录，证明是后退事件
                J.Menu.hide();//关闭当前页面的菜单
                J.Popup.close();//关闭当前页面的弹出窗口
                back();
            }else{//其他认为是非法后退或者前进
                return;
            }
        }else{
            return;
        }

    }
    var _targetHandler = function(){
        var _this = $(this),
            target = _this.attr('data-target'),
            href = _this.attr('href');

        switch(target){
            case 'section' :
                if(J.settings.appType == 'single'){
                    _showSection(href);
                }
                break;
            case 'article' :
                _showArticle(href,_this);
                break;
            case 'menu' :
                _toggleMenu(href);
                break;
            case 'back' :
                window.history.go(-1);
                break;
        }
    }

    /**
     * 跳转到新页面
     * @param hash 新page的'#id'
     */
    var _showSection  = function(hash){
        if(J.hasMenuOpen){//关闭菜单后再转场
            J.Menu.hide(200,function(){
                _showSection(hash);
            });
            return;
        }
        //读取hash信息
        var hashObj = J.Util.parseHash(hash);
        var current = _history[0]?_history[0].tag:null;
        //同一个页面
        if(current === hashObj.tag)return;
        //加载模板
        J.Page.load(hashObj,function(){
            _changePage(current,hashObj.tag);
            _add2History(hash);
        });
    }
    /**
     * 后退
     */
    var back = function(){
        if(J.settings.appType == 'single'){
            _changePage(_history.shift().tag,_history[0].tag,true)
        }
    }
    var _changePage = function(current,target,isBack){
        J.Transition.run(current,target,isBack);
    }
    /**
     * 缓存访问记录
     */
    var _add2History = function(hash,noState){
       var hashObj = J.Util.parseHash(hash);
        _history.unshift(hashObj);
        if(noState){
            window.history.replaceState(hashObj,'',hash);
        }else{
            window.history.pushState(hashObj,'',hash);
        }
    }

    /**
     * 激活href对应的article
     * @param href #id
     * @param el 当前锚点
     */
    var _showArticle = function(href,el){
        var article = $(href);
        if(article.hasClass('active'))return;
{'fraction_non_alphanumeric': 0.15138622014822947, 'fraction_numerical': 0.0032939884710403516, 'mean_word_length': 1.543455497382199, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6863390', 'n_tokens_mistral': 2373, 'n_tokens_neox': 2418, 'n_words': 319}