Skip to content
Extraits de code Groupes Projets
anchorLinkFix.js 2,58 ko
Newer Older
  • Learn to ignore specific revisions
  • /*!
     * Piwik - Web Analytics
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
     */
    
    /**
     * See http://dev.piwik.org/trac/ticket/4795 "linking to #hash tag does not work after merging AngularJS"
     */
    (function () {
    
        function scrollToAnchorNode($node)
        {
            $.scrollTo($node, 20);
        }
    
        function preventDefaultIfEventExists(event)
        {
            if (event) {
                event.preventDefault();
            }
        }
    
        function scrollToAnchorIfPossible(hash, event)
        {
            if (!hash) {
                return;
            }
    
            if (-1 !== hash.indexOf('&')) {
                return;
            }
    
            var $node = $('#' + hash);
    
            if ($node && $node.length) {
                scrollToAnchorNode($node);
                preventDefaultIfEventExists(event);
                return;
            }
    
            var $node = $('a[name='+ hash + ']')
    
            if ($node && $node.length) {
                scrollToAnchorNode($node);
                preventDefaultIfEventExists(event);
            }
        }
    
        function isLinkWithinSamePage(location, newUrl)
        {
            if (location && location.origin && -1 === newUrl.indexOf(location.origin)) {
                // link to different domain
                return false;
            }
    
            if (location && location.pathname && -1 === newUrl.indexOf(location.pathname)) {
                // link to different path
                return false;
            }
    
            if (location && location.search && -1 === newUrl.indexOf(location.search)) {
                // link with different search
                return false;
            }
    
            return true;
        }
    
        function handleScrollToAnchorIfPresentOnPageLoad()
        {
            if (location.hash.substr(0, 2) == '#/') {
                var hash = location.hash.substr(2);
                scrollToAnchorIfPossible(hash, null);
            }
        }
    
        function handleScrollToAnchorAfterPageLoad()
        {
            angular.module('piwikApp').run(['$rootScope', function ($rootScope) {
    
                $rootScope.$on('$locationChangeStart', function (event, newUrl, oldUrl, $location) {
    
                    if (!newUrl) {
                        return;
                    }
    
                    var hashPos = newUrl.indexOf('#/');
                    if (-1 === hashPos) {
                        return;
                    }
    
                    if (!isLinkWithinSamePage(this.location, newUrl)) {
                        return;
                    }
    
                    var hash = newUrl.substr(hashPos + 2);
    
                    scrollToAnchorIfPossible(hash, event);
                });
            }]);
        }
    
        handleScrollToAnchorAfterPageLoad();
        $(handleScrollToAnchorIfPresentOnPageLoad);
    
    })();