通过JavaScript重命名URL

时间:2012-10-09 21:41:01

标签: javascript html css html5 css3

我正在开发基于此 tutorial 的网站,并希望将网址从/?chapter=#重命名为各自的导航名称,例如/ work,/ about,/ services等。

index.php:

<aside id="menu">
    <div id="scroll">
        <nav>
            <ul>
                <li><a href="#introduction">Work</a></li>
                <li><a href="#chapter1">About</a></li>
                <li><a href="#chapter2">Services</a></li>
                <li>Blog <!-- Coming Soon... --> </li>
                <li><a href="#chapter4">Contact</a></li>
            </ul>
        </nav>
    </div> <!-- #scroll -->    
</aside> <!-- #menu -->

...

...

<div class="content-scroller">
    <div class="content-wrapper">
        <article class="content" id="introduction">
            <div class="inner">  
...
...
        <article class="content" id="chapter1">
            <div class="inner">  
...
...

jquery.page.js:

(function(window, undefined) {

    var Page    = (function() {

        var $container          = $( '#container' ),
            // the scroll container that wraps the articles
            $scroller           = $container.find( 'div.content-scroller' ),
            $menu               = $container.find( 'aside' ),
            // menu links
            $links              = $menu.find( 'a' ),
            $articles           = $container.find( 'div.content-wrapper > article' ),
            // button to scroll to the top of the chapter
            // only shown when screen size < 960
            $toTop              = $container.find( 'a.totop-link' ),
            // the browser nhistory object
            History             = window.History,
            // animation options
            animation           = { speed : 800, easing : 'easeInOutExpo' },
            // jScrollPane options
            scrollOptions       = { verticalGutter : 0, hideFocus : true },
            // init function
            init                = function() {

                // initialize the jScrollPane on both the menu and articles
                _initCustomScroll();
                // initialize some events
                _initEvents();
                // sets some css properties 
                _layout();
                // jumps to the respective chapter
                // according to the url
                _goto();

            },
            _initCustomScroll   = function() {

                // Only add custom scroll to articles if screen size > 960.
                // If not the articles will be expanded
                if( $(window).width() > 960 ) {

                    $articles.jScrollPane( scrollOptions );

                }
                // add custom scroll to menu
                $menu.children( '#scroll' ).jScrollPane( scrollOptions );

            },
            _goto               = function( chapter ) {

                    // get the url from history state (e.g. chapter=3) and extract the chapter number
                var chapter     = chapter || History.getState().url.queryStringToJSON().chapter,
                    isHome      = ( chapter === undefined ),
                    // we will jump to the introduction chapter if theres no chapter
                    $article    = $( chapter ? '#' + 'chapter' + chapter : '#' + 'introduction' );

                if( $article.length ) {

                        // left / top of the element
                    var left        = $article.position().left,
                        top         = $article.position().top,
                        // check if we are scrolling down or left
                        // is_v will be true when the screen size < 960
                        is_v        = ( $(document).height() - $(window).height() > 0 ),
                        // animation parameters:
                        // if vertically scrolling then the body will animate the scrollTop,
                        // otherwise the scroller (div.content-scroller) will animate the scrollLeft
                        param       = ( is_v ) ? { scrollTop : (isHome) ? top : top + $menu.outerHeight( true ) } : { scrollLeft : left },
                        $elScroller = ( is_v ) ? $( 'html, body' ) : $scroller;

                    $elScroller.stop().animate( param, animation.speed, animation.easing, function() {

                        // active class for selected chapter
                        $articles.removeClass( 'content-active' );
                        $article.addClass( 'content-active' );

                    } );

                }

            },
            _saveState          = function( chapter ) {

                // adds a new state to the history object
                // this will trigger the statechange on the window
                if( History.getState().url.queryStringToJSON().chapter !== chapter ) {

                    History.pushState( null, null, '?chapter=' + chapter );

                }

            },
            _layout             = function() {

                // control the overflow property of the scroller (div.content-scroller)
                var windowWidth = $(window).width();
                switch( true ) {

                    case ( windowWidth <= 960 ) : $scroller.scrollLeft( 0 ).css( 'overflow', 'visible' ); break;
                    case ( windowWidth <= 1024 ): $scroller.css( 'overflow-x', 'scroll' ); break;
                    case ( windowWidth > 1024 ) : $scroller.css( 'overflow', 'hidden' ); break;

                };

            },
            _initEvents         = function() {

                _initWindowEvents();
                _initMenuEvents();
                _initArticleEvents();

            },
            _initWindowEvents   = function() {

                $(window).on({
                    // when resizing the window we need to reinitialize or destroy the jScrollPanes
                    // depending on the screen size
                    'smartresize' : function( event ) {

                        _layout();

                        $('article.content').each( function() {

                            var $article    = $(this),
                                aJSP        = $article.data( 'jsp' );

                            if( $(window).width() > 960 ) {

                                ( aJSP === undefined ) ? $article.jScrollPane( scrollOptions ) : aJSP.reinitialise();

                                _initArticleEvents();

                            }   
                            else {

                                // destroy article's custom scroll if screen size <= 960px
                                if( aJSP !== undefined )
                                    aJSP.destroy();

                                $container.off( 'click', 'article.content' );

                            }

                        });

                        var nJSP = $menu.children( '#scroll' ).data( 'jsp' );
                        nJSP.reinitialise();

                        // jumps to the current chapter
                        _goto();

                    },
                    // triggered when the history state changes - jumps to the respective chapter
                    'statechange' : function( event ) {

                        _goto();

                    }
                });

            },
            _initMenuEvents     = function() {

                // when we click a menu link we check which chapter the link refers to,
                // and we save the state on the history obj.
                // the statechange of the window is then triggered and the page/scroller scrolls to the 
                // respective chapter's position
                $links.on( 'click', function( event ) {

                    var href        = $(this).attr('href'),
                        chapter     = ( href.search(/chapter/) !== -1 ) ? href.substring(8) : 0;

                    _saveState( chapter );

                    return false;

                });

                // scrolls to the top of the page.
                // this button will only be visible for screen size < 960
                $toTop.on( 'click', function( event ) {

                    $( 'html, body' ).stop().animate( { scrollTop : 0 }, animation.speed, animation.easing );

                    return false;

                });

            },
            _initArticleEvents  = function() {

                // when we click on an article we check which chapter the article refers to,
                // and we save the state on the history obj.
                // the statechange of the window is then triggered and the page/scroller scrolls to the 
                // respective chapter's position
                $container.on( 'click', 'article.content', function( event ) {

                    var id          = $(this).attr('id'),
                        chapter     = ( id.search(/chapter/) !== -1 ) ? id.substring(7) : 0;

                    _saveState( chapter );

            //      return false;

                });

            };

        return { init : init }; 

    })();

    Page.init();

})(window);

我怎么能这样做?

由于

1 个答案:

答案 0 :(得分:2)

嗯,这条线就是写下你的历史状态:

 History.pushState(null, null, '?chapter=' + chapter);

因此您需要修改该功能以执行您想要的操作。如果你有一个小网站,那么你可以制定条件将状态交换到任何你想要的东西。如果你有一个庞大的动态网站,除非你喜欢可怕,乏味的维护,否则你不想这样做......

_saveState = function(chapter) {

    // adds a new state to the history object
    // this will trigger the statechange on the window
    if (History.getState().url.queryStringToJSON().chapter !== chapter) {
        var page;
        if(chapter == 1)
            page = "/about";
        else if(chapter == 2)
            page = "/services";
        else
            page = '?chapter=' + chapter;

        History.pushState(null, null, page);

    }
},

我可能已经错过了你的问题。如果是这样,我可以更新这个答案