简体   繁体   中英

Javascript smooth scroll conflict

I am using the pretty standard smooth scrolling javascript to link to anchor points on the same pages in my wordpress site and it works fine. However, I get no response from a link/button when trying to open an anchor point on another page. It's like the link/button is completely dead. It works fine if I right click on it and select open in a new tab. It also works if I remove the offending javascript from the site header. Can anybody suggest where the conflict may lie? For those who may not be familiar, this is the offending code:

$(document).ready(function(){
  // Add smooth scrolling to all links
  $("a").on('click', function(event) {

    // Make sure this.hash has a value before overriding default behavior
    if (this.hash !== "") {
      // Prevent default anchor click behavior
      event.preventDefault();

      // Store hash
      var hash = this.hash;

      // Using jQuery's animate() method to add smooth page scroll
      // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area
      $('html, body').animate({
        scrollTop: $(hash).offset().top
      }, 800, function(){

        // Add hash (#) to URL when done scrolling (default click behavior)
        window.location.hash = hash;
      });
    } // End if
  });
});

This code seems to assume that every link to an anchor will be to the anchor on the current page . You need to add code to detect if the link is going to a different page, and if so, navigate directly there (rather than attempt the smooth-scroll effect to the anchor on the current page).

Add this code to the beginning of your click handler:

if ( document.URL.replace(/#.*$/, "") != $(this).attr('href').replace(/#.*$/, "") ) {
    // Link goes to a different URL than the current page (not counting the hash)
    document.location.href = $(this).attr('href');
    return;
}

You need to animate to the event.target the clicked Dom element, not to string variable hash

 var hash = event.target.href;
 $('html, body').animate({
    scrollTop: $(event.target).offset().top
  }, 800, function(){

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM