2016-09-19 90 views
0

我在我的HTML中有以下锚点标记,用于从该HTML位置将内容加载到当前页面上的contents div。这种定位的标签是引导树形插件的一部分,我用生成的内容表:保持锚点标记href跳转到它的页面

<a href="/Introduction/index.html#1-1-overview1" style="color:inherit;">1.1 Overview</a> 

在我的JavaScript,我有下面的代码,我用它来听两个事件。一为锚标记,这样我禁用默认的行为和其他处理的定位标记并加载内容和滚动到锚如下:

$("a[href*='#']").click(function(e) { 
     e.preventDefault(); 
    }); 

    // Add smooth scrolling to all links inside a navbar 
    $treeview.on('nodeSelected', function (e, data) { 
     e.preventDefault(); 

     if (data && data.href !== "") { 
      // Split location and hash 
      var hash = data.href.match(/[#].*/g)[0]; 
      var location = data.href.match(/[^#]*/g)[0]; 

      if (prevLocation === location) { 
       // Don't reload page if already at same location as last clicked 
       $('html, body').animate({ 
        scrollTop: $(hash).offset().top - 55 
       }, 200); 
      } else { 
       prevLocation = location; 
       $('#contents').load(location, function() { 
        $('html, body').animate({ 
         scrollTop: $(hash).offset().top - 55 
        }, 200); 
       }); 
      } 

     } 
     $body.scrollspy('refresh'); 
     $sideBar.affix('checkPosition'); 
    }); 

我所看到的是,第一次点击我的TOC中的一个节点,它按预期将HTML加载到内容div中,但是第二次单击它时,它会加载在锚标记中引用的HTML页面,尽管我努力跟踪是否以前加载过它,上面的条件逻辑。我还注意到,在随后的点击中,锚选择器未被调用。

任何想法如何让TOC最初将HTML从另一个页面加载到当前页面,然后在随后的调用中滚动到锚点位置(即章节)?

+1

你尝试'返回false;'以及'preventDefault'? – DavidG

+0

您可以使用chrome的开发人员工具调试它,看看prevLocation每次的价值是什么? – klikas

+1

'return false'导致'nodeSelected'事件没有被调用,但是如果我将这两个函数结合在锚点选择器下,消除'nodeSelected'事件并返回false,那么它看起来很有效! – occasl

回答

0

结合使用这两种功能,并返回false似乎工作如下:

 $("a[href*='#']").click(function(e) { 
     e.preventDefault(); 

     if (this && this.href !== "") { 
      // Split location and hash 
      var hash = this.href.match(/[#].*/g)[0]; 
      var location = this.href.match(/[^#]*/g)[0]; 

      if (prevLocation === location) { 
       // Don't reload page if already at same location as last clicked 
       $('html, body').animate({ 
        scrollTop: $(hash).offset().top - 55 
       }, 200); 
      } else { 
       prevLocation = location; 
       $('#contents').load(location, function() { 
        $('html, body').animate({ 
         scrollTop: $(hash).offset().top - 55 
        }, 200); 
       }); 
      } 

     } 
     $body.scrollspy('refresh'); 
     $sideBar.affix('checkPosition'); 
     return false; 
    }); 
+1

通常情况下,使用别人的评论回答问题的方式非常差,您应该给他们一个机会来首先添加自己的答案。 – DavidG

+0

LOL ...请尽管回答。我会删除这一个,并给你信用。对不起,我抢先了你。 – occasl

+0

没有必要,你已经做到了,你可以在这里接受你自己的答案。我老实说不关心信用卡或代表,只是让你知道有些人可能反应不好。 – DavidG