【问题标题】:href="#" appends # on end of page urlhref="#" 在页面 url 的末尾附加 #
【发布时间】:2011-08-02 15:59:25
【问题描述】:

假设我有以下链接:

<a href="#" onclick="alert('You clicked a link.');">Click Me!</a>

单击此链接时,将显示一条消息并在页面 URL 的末尾附加一个井号。
这看起来不太漂亮,除了在 url 本身中使用 javascript 之外,还有什么方法可以避免它:

<a href="javascript:alert('You clicked a link.');">Click Me!</a>

【问题讨论】:

    标签: javascript html url hyperlink


    【解决方案1】:

    您必须防止发生默认响应。

    老式的做法是从它return false

    <a href="#" onclick="alert('You clicked a link.'); return false;">Click Me!</a>
    

    或者,更好:

    <a href="#" id="myLink">Click Me!</a>
    
    <script type="text/javascript">
    window.onload = function() {
       document.getElementById('myLink').onclick = function(event) {
          alert('You clicked a link.');
          return false;
       };
    };
    </script>
    

    现在最好的方法是调用event属性的正确方法:

    <a href="#" id="myLink">Click Me!</a>
    
    <script type="text/javascript">
    window.onload = function() {
       document.getElementById('myLink').onclick = function(event) {
          alert('You clicked a link.');
          event.preventDefault(); // <---
       };
    };
    </script>
    

    对于不使用 JavaScript 的人,最好将 # 替换为某个适当页面的 URI。在某些司法管辖区,可访问性实际上是法律要求

    编辑已修复 IE:

    function f() {
       document.getElementById('myLink').onclick = function(e) {
          alert('You clicked a link.');
    
        if (!e) {
           var e = window.event;
        }
    
        // e.cancelBubble is supported by IE - this will kill the bubbling process.
        e.cancelBubble = true;
        e.returnValue  = false;
    
        // e.stopPropagation works only in Firefox.
        if (e.stopPropagation) {
            e.stopPropagation();
            e.preventDefault();
        }
    };
    
    window.onload = f;
    

    【讨论】:

    • 您能否详细解释一下为什么这比我的方法更好?
    • @bradley.ayers:(a) 将流与格式分开。内联 JS 是邪恶的。 (b) stackoverflow.com/questions/1357118/… 是首选 event.preventDefault() 的原因。 (c) 正如我所指出的,使用真实的 URI 是一项法律要求,对用户来说是一种明显的帮助。
    • “最佳方法”在 IE 中不起作用,因为他们使用 window.event
    • @qwertymk:谢谢;已包含修复程序。
    【解决方案2】:

    诀窍是事件处理程序上的return false

    <a href="" onclick="alert('You clicked a link.'); return false">Click Me!</a>
    

    【讨论】:

    • 你必须给链接一个非空的href,因为IE6,7不会这样识别它,所以#可以作为href,只要你保持return false;在点击中。
    • @bisko 哇……真的吗?即使空字符串是有效的 URI?
    • 更好的是,给 href 一个真正的价值 - 即如果 JavaScript 被禁用或不工作,实际返回页面的东西。
    • @bradley 是的。 IE6,7 完全符合标准是一个秘密:) 是的,IE6,7 有这个问题。我不确定8及以上。当您不指定 href 时,A 的行为只是一个正常的跨度:)
    • @Tom See labs.apache.org/webarch/uri/rfc/rfc3986.html#same-documentlabs.apache.org/webarch/uri/rfc/rfc3986.html#path(如果第一个不明确,最后一个链接给出 ABNF)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2012-06-20
    • 2023-03-30
    相关资源
    最近更新 更多