【问题标题】:Avoid window jump to top when clicking #-links单击#-links 时避免窗口跳转到顶部
【发布时间】:2011-11-23 10:22:57
【问题描述】:

我有一个包含一些问题和答案的页面,默认情况下答案是折叠的。当他们单击问题时,我会展开隐藏的 answer-div。问题是当我点击这些问题时,窗口会跳到屏幕顶部。这不是一个大问题,但我觉得很烦人,因为我必须再次向下滚动到问题。

链接看起来像这样:

<a href="#" id="myID">Myquestion</a>

我使用 jQuery 和 .click 作为事件监听器。

有什么简单的方法可以避免这种情况,还是我必须使用.scroll 并找到问题的坐标?我宁愿避免这种情况。

编辑:我知道我可以使用锚点来做到这一点,但我想完全避免屏幕跳跃。

【问题讨论】:

标签: javascript jquery html


【解决方案1】:

您需要将preventDefault() 添加到您的点击处理程序。这将停止浏览器执行它自己的链接处理程序,并且只会运行您指定的代码。

例子:

$("#myID").click(function(e) {
    e.preventDefault();
    // Do your stuff
});

【讨论】:

  • 啊,当然。我太傻了。但这在 IE7 中不起作用。我想添加对 IE7 和/或 IE8 的支持。有没有办法做到这一点?
  • 我的研究不好,我在另一个问题if(e.preventDefault){ e.preventDefault()} else{e.stop()}; 中发现了这一点,谢谢。案件结案。
  • 如果您使用 jQuery,preventDefault() 应该适用于所有浏览器。您也可以只从事件处理程序中返回 false。
  • 好吧,由于某种原因,它在旧版本的 IE 中不起作用
  • 在跳过链接上与 IE7 有同样的问题,它不适用于 e.preventDefault();
【解决方案2】:

不要将 A 标签用于与导航无关的任务。它不是语义标记,也不会优雅地降级。改用按钮。

【讨论】:

  • 好主意,问题是文本本身应该是链接,因此我没有选择按钮。但我想为此使用 span 或其他东西会更聪明。下次我会记住这一点,不想重写我的整个解析器。
【解决方案3】:

你可以很简单地做到这一点: 只需在您的href 末尾添加!:

<a href="#!" id="myID">Myquestion</a>

jQuery 的替代方法是:

$("#myID").click(function(e) {
    e.preventDefault(); // one way 
    return false; // second way prevent default click action from happening
});

【讨论】:

  • 警告:Google Analytics 不喜欢带有 #! 值的 href,并将此错误抛出到日志中:Syntax error, unrecognized expression: #!
【解决方案4】:
$("#myID").click(function(e) {
    if(e.preventDefault)
        e.preventDefault();
    else
        e.stop();
});

e.preventDefault()alone 在旧版本的 IE 中不起作用。

【讨论】:

  • 实际上使用 e.stop() 就可以了,所以如果没有必要的话
【解决方案5】:

实际上,最简单的方法是从锚标记中删除 href 属性。从 HTML5 开始,锚标记不需要包含 href 属性即可。

所以

<a id="myID">Myquestion</a>

而不是

<a href="#" id="myID">Myquestion</a>

这适用于 IE8+、Chrome 和 Firefox。请注意, :link css 样式不适用于不包含 href 属性的锚标记。

如果你需要 href 属性和/或 IE7 兼容性,那么

$("#myID").click(function(e) {
if(e.preventDefault)
    e.preventDefault();
else
    e.stop();
});

可能是最好的方法。

【讨论】:

    【解决方案6】:
    $('a').click( function() {
      if ($(this).attr("href") == window.location.hash) {
        event.preventDefault()
      }
    });
    

    【讨论】:

      【解决方案7】:

      您正在寻找event.preventDefault(请参阅jQuery API)。

      $(...).click(function(e) {
        e.preventDefault();
        // your code
      });
      

      【讨论】:

        【解决方案8】:

        滚动回答内容的示例:

        $("#question_title").click(function(){
          var $answer=$("#answer");
          $answer.slideDown();
          $.scrollTo( $answer, 800 );
          return false;
        });
        

        我用的是jQuery scrollTo插件。

        【讨论】:

          【解决方案9】:

          在你的函数中:

          And I've used jQuery and .click as event-listener.
          

          看起来像:

          $("#myID").click(function(){});
          

          把这个改成(别忘了function(e)里面的参数:

          $("#myID").click(function(e){
              e.preventDefault();
          });
          

          【讨论】:

            【解决方案10】:

            $('body').on('click', '[href^=#]', function (e) { e.preventDefault() });

            如果选择器 ex.."body" 在初始渲染期间存在,则使用任何选择器 .. id ... 来定位通用对象以让 jQuery(从 1.8.2 开始)迭代。 “On 处理程序调用一个名为“bind”的方法,该方法用于将新添加的内容添加到 DOM 中”,。使用 "[href^=#] 将选择 section 标签中的任何 href,但您可以将 section 替换为任何内容或什么都没有,并将取消应用到 click 事件。这种技术非常适合动态创建的 DOM 内容

            【讨论】:

              【解决方案11】:

              如果您在“#”中添加“\”,它将阻止进入顶部。

              <a href="#\" id="myID">Myquestion</a>
              

              【讨论】:

                【解决方案12】:

                HTML:

                <a id="like-post" href="#\">like</a>
                

                JavaScript:

                $('body').delegate('#like-post','click',function(e) {
                     e.preventDefault();
                     .....
                });
                

                【讨论】:

                • 您为什么要 1) 回答一个在 6 年前就已被接受的问题? 2) 在你的答案中使用 depreciated 方法?
                猜你喜欢
                • 1970-01-01
                • 2016-04-10
                • 1970-01-01
                • 2017-06-10
                • 1970-01-01
                • 1970-01-01
                • 2018-09-13
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多