Hi! I seem to have a problem in implementing the following functionality:
We have a given HTML5 source code which contains hidden items with an id on our website. These are referenced via anchors (the classic href-attribute of <a href/> tags). E.g.: If the item structure is <section class="details-card" id="info-tech">yada yada yada</section> <section class="details-card" id="info-delivery">yada yada yada</section> the a-element has an href-attribute with content '#item-5' (this may occur on several places in the source code. <ul> <li><a class="details-link" href="#info-tech">Show technical details on yada yada</div></li> <li><a class="details-link" href="#info-delivery">Show delivery details on yada yada</div></li> </ul> I wrote a module for angular: (function() { angular.module('productInfos') .directive('detailsCard', [ '$location', '$anchorScroll', '$timeout', '$window', function( $location, $anchorScroll, $timeout, $window) { return { restrict : 'AC', link : function (scope, element, attrs) { scope.$on('$locationChangeSuccess', function (event, newLoc, oldLoc){ event.preventDefault(); /* does the searched anchor exist at all? */ if (!($("[id='" + $location.hash() +"']").length > 0 || $("a[name='" + $location.hash() +"']").length > 0)) { /* if not just stop searching */ } else { var a = $("a[href='#" + attrs.id +"']").add( "a[ng-href='#" + attrs.id +"']"); var li = $("a[href='#" + attrs.id +"']").add ("a[ng-href='#" + attrs.id +"']").parent(); if (attrs.id === $location.hash()) { /* target is tab */ a.add(li).add(element).addClass("active" ); console.log('$locationChangeStart: top = ', $(element).parent().offset().top, $(element).parent(), a.add(li)); $window.scrollTo(0, $(element).parent(). offset().top); } else if ($("[id='" + $location.hash() +"']", element).length > 0 || $("a[name='" + $location.hash() +"']", element).length > 0) { a.add(li).add(element).addClass("active" ); } /* if it isn't located within this element, hide the tab */ else { a.add(li).add(element).removeClass( "active"); } } }); scope.$on('$locationChangeStart', function (event, newLoc, oldLoc){ console.log('$locationChangeStart: ', attrs.id, $location.hash(), attrs.id === $location.hash()); }); } } } ]) .config(["$locationProvider", function($locationProvider) { $locationProvider.html5Mode(true).hashPrefix('!'); }]); })(); Initially all sections are shown. As soon as the browser is ready it checks if javascript is available an, if it is available, the "inactive" sections are hidden (by a CSS rule and a added class) <html class="js-on">... This is a requirement. So the first problem is: On the initial page load the browser jumps for a URL like http:// foo.bar/product/AZ#item-delivery to the section. As soon as the javascripts i.e. angular has finished the other sections (above) are hidden and we end up right in the middle of nowhere. How can I use $anchorScroll or similar to do the scroll after the inactive sections are hidden? An other main problem I can not sort out properly: I can either call preventDefault() so that the URL isn't changed at all if the user clicks on the link (it remains http:// foo.bar/product/AZ and does not change to http:// foo.bar/product/AZ#item-tech) and the new "view state" isn't persisted for the back button of the browser. Or if I don't use event.preventDefault() the URL is changed as requested but we run again in the problem above. The browser scrolls to the element - I haven't found a way to prevent it. Actually the link or the page heading should still be visible (if possible). How can I prevent the default action and change the URL and set a (different) scroll target programmatically? And the third issue: As soon as the mode is HTML5 ".html5Mode(true)" any link to an other page is ignored (the address bar is changed to the new address but the new URL isn't loaded, e.g. http:// foo.bar/productlines.html is changed to http:// foo.bar/product/AZ but the content of the product page is not loaded). What settings do I have to make to open the page? I can't convert the page to a dynamic or one page application - all product information has to be on the delivered page at once. So using route and changing templates isn't an option for me. Thanks in advance, JT -- You received this message because you are subscribed to the Google Groups "AngularJS" group. To unsubscribe from this group and stop receiving emails from it, send an email to angular+unsubscr...@googlegroups.com. To post to this group, send email to angular@googlegroups.com. Visit this group at http://groups.google.com/group/angular. For more options, visit https://groups.google.com/d/optout.