【问题标题】:Alternatives for using "#" in href attribute [duplicate]在 href 属性中使用“#”的替代方法 [重复]
【发布时间】:2010-12-24 17:16:05
【问题描述】:

<a> 标签用于创建超链接,但在这个 jQuery 和 Ajax 时代,我们使用它来将 HTML 加载到与 <a> 标签相同的页面中的<div>s。

也就是说,我们将href 属性设置为href="#",使用或滥用# 字符作为占位符以及一些不良副作用,例如URL 附加# 字符。

如果您将href 属性留空href = "",则链接似乎不起作用。

当用户将鼠标悬停在链接上时,是否可以以更简洁的方式执行此操作,例如在浏览器的状态栏中显示一些文本或虚拟功能,但让链接按照程序员的意图执行?

这是我的代码。

<ul id="sidebarmenu1">
   // List that is converted into a menu... 
   <li> <a href="#" id="loadHotel" > HOTEL </a> </li>
   <li> <a href="#" id="loadCountry"> COUNTRY </a> </li>
   <li> <a href="#" id="loadCity"> CITY </a> </li>
</ul>

// The jQuery to load content into another div with Ajax
var loadUrl = "createHotel.php";
$("#loadHotel").click(function() {
    $("#mainContent").html(ajax_load).load(loadUrl);
}); 

// ajax function to load hotel ---> rooms page 

var url_loadRooms = "viewRooms.php";
$("#createRooms").click(function() {
    $("#mainContent").html(ajax_load).load(url_loadRooms);
});

除了"#",我还能用什么来使我的代码整洁..?

【问题讨论】:

  • 另一件可以做的事情是不显示链接悬停时将调用的实际JS函数,而是在状态栏中显示一些文本......
  • @SpikETidE:根据您对给定答案的 cmets,我认为您有更具体的要求。您可能想要添加到您的帖子中并准确说明“void(0)”方法为何/如何对您不起作用。
  • @ o.k.w : 添加代码供参考...

标签: javascript html href


【解决方案1】:

最好的解决方案是根本不使用一些虚拟占位符。使用有意义的 URL,如果该链接实际被跟踪,它将向您显示您从 AJAX 请求中获得的信息。

我经常使用我的网络应用程序执行此操作,使用 Javascript 来增强工作网站。例如,HTML:

<a href="/users/index" rel="popup">View users</a>

Javascript (jQuery):

$('a[rel*="popup"]').click(function() {
    loadPopup({    // whatever your favourite lightbox is, etc..
        url: this.href
    });
    return false;
});

这样做的好处很多。屏幕阅读器、网络爬虫和关闭 javascript 的用户可以访问您的网站,甚至那些打开 javascript 的人也会在他们的状态栏中获得一个有意义的 URL,这样他们就会知道他们要去哪里。

【讨论】:

  • 它可以工作,但是如果您尝试在validator.w3.org 验证文档,您会收到此错误:“元素 a 上属性 rel 的错误值弹出窗口:字符串弹出窗口不是注册关键字。 "
【解决方案2】:

我通常用这个:

href="javascript:void(0);"

将锚点的href 属性设置为javascript:void(0); 向浏览器表明该锚点不是指向另一个文档或锚点的超链接,

【讨论】:

  • 大多数地方都可以,但something必须去那里。
  • 嗨 Andrew... 在我的情况下,当用户单击 a 标签时,我调用了更高级别的 ajax 加载函数。使用 href = "javascript:void(0)" 使 ajax 调用无效,浏览器显示“Permission Denied to view this page”..
  • @SpikETidE:你用的是什么浏览器?这个 AJAX 函数是什么样的?
  • 我的代码应该在所有主要浏览器中都可以正常工作...我的 Ajax 函数将包含 html 元素的 php 页面加载到 div 中。当用户单击其中一个菜单项时会发生这种情况已经在页面中。这些菜单项被创建为无序列表,其元素在单击时将调用 ajax 函数。希望我很清楚
  • 说真的,不要这样做。有各种各样的问题,在这里总结得很好:jibbering.com/faq/#javascriptURI
【解决方案3】:

如果您的onclick 处理程序返回false,则浏览器不会跟踪该链接。试试这个:

<a href="#" onclick="alert('No # in the address bar!'); return false;">Click Me</a>

编辑:

如果您绝对不使用八字形(即# 符号),您不必这样做。试试这个:

<a href="" onclick="alert('No change in the address bar!'); return false;">Click Me</a>

【讨论】:

  • 我正在寻找一种完全不使用“#”字符的方法......
  • @SpikETidE:在我的示例中,将您想要的任何内容放入 href 属性中。这实际上并不重要,因为浏览器不会跟随它。
  • 但是在点击事件中返回false不会调用jquery的.click()函数...
  • 关闭了 JavaScript 浏览器的用户怎么办?周围有很多。您应该在href 中为此类用户添加一个有意义的 后备选项。
  • @Tim Down:实际上在禁用 JavaScript 的情况下使用互联网的 的数量通常被夸大了。这个数字实际上是如此之小,以至于 Google Analytics 甚至都没有计算这些人(怎么可能,它是基于 JavaScript 的)。如今,即使是主要的机器人也支持 JavaScript。无论如何,OP (#) 的替代方案并不完全代表有意义的回退。
【解决方案4】:

为什么需要在 href 中定义任何内容?

这就是 SO 的工作原理=>

<a id="close-question-1871874" title="closes/opens question for answering....">
  close<span title="3 more vote(s) needed to close this question"> (2)</span>
</a>

但是 - 如果链接应该实际导航到某个地方 - 保持正常的 href
以及 jQuery 的 e.preventDefault() 常规行为。

【讨论】:

    【解决方案5】:

    也许我没有得到什么,但如果没有链接,你就不应该首先使用 元素。使用一些 或将事件侦听器附加到列表元素。您可以使用 CSS 将这些元素设置为具有 cursor: pointer; 的样式。

    请记住,浏览器有一些与链接相关的特殊操作,例如“在新选项卡中打开”、“保存目标元素”等。当您使用虚拟 href='' 属性时,这些操作会以损坏的方式工作,所以最好不要完全使用链接。

    另一方面,如果您能够将这些 ajaxified 部分的内容呈现为普通页面(这很有意义),请关注 nickf's advice

    【讨论】:

      【解决方案6】:

      nickf 击败我;但是,有几件事需要提及。 You should never use the "javascript" protocol for a link(除非您打算将其用作书签)。它与渐进增强相反。只要有可能,href 属性应该是一个实际的 URI 资源,以便它可以优雅地降级。在所有其他情况下,鼓励使用“#”,并且应该使用正确的 JavaScript 来防止页面滚动到顶部。有两种方法可以做到这一点。在点击处理程序中,要么阻止默认操作,要么返回 false。

      $('a[rel*="popup"]').click(function(e) {
          e.preventDefault();
          loadPopup({url: this.href});
      });
      

      $('a[rel*="popup"]').click(function() {
          loadPopup({url: this.href});
          return false;
      });
      

      【讨论】:

        【解决方案7】:

        使用“#”字符作为占位符基本上使链接“处于活动状态”。浏览器将其解释为指向其他事物的标记。如果 href 为空,浏览器会认为 a 标签只是另一个标签。

        一种解决方法是将一些 CSS 分配给不同的标签,以模拟 a 标签的相同功能。悬停时,更改鼠标、下划线、更改颜色等。您可以轻松更改窗口状态,让用户看起来像是在点击链接,而实际上他们并没有点击链接,而是点击事件.

        事实上,这是更好的选择,因为通过事件绑定只运行一个没有 JavaScript 就无法使用的 JS 函数,一开始不应该被视为链接。

        【讨论】:

        • 嗨,杰夫...正如这篇文章stackoverflow.com/questions/134845/… 中指出的那样,“a”标签可以通过键盘选项卡访问,而另一种方式使其仅是鼠标元素...我想要我的也可以通过键盘访问...
        • 在这种情况下,我会考虑为击键编写事件绑定。另外,我认为您可以在 HTML(或类似的东西)中使用 taborder 属性来允许用户对特定元素进行制表符。不确定它是否适用于一切。我从来没有尝试过。在这种情况下,使用键盘访问有什么好处?
        • 此外,您可以将锚点指向任何类型的 URL,但要确保 onclick 事件处理程序返回 false。这将阻止气泡通过,并且永远不会访问链接。但是,如果用户禁用了 JavaScript,这将使您能够找到解决方法。
        • 键盘访问只是为了可用性...该链接在菜单中使用,如果用户可以仅使用 Tab 键导航到它,那将是可取的...
        • 使用标签索引。我认为浏览器默认使用锚点和表单元素,但您可以在那里添加自己的选项。 w3.org/TR/html401/interact/forms.html#h-17.11 - 这应该让您快速了解 tabindex,并可能对您的情况有所帮助。一定要确保使用 return false;停止冒泡,所以链接实际上并没有触发,只是点击事件。
        【解决方案8】:

        我总是用这个:

        &lt;a href="javascript:;"&gt;Click to your heart's delight&lt;/a&gt;

        【讨论】:

        • 这是我在 FF 3 中使用它时收到的警报... Firefox 不知道如何打开此地址,因为协议 (javacript) 未与任何程序关联。
        • 但是如果禁用了javascript,它会起作用吗?
        • 如果网站打算在禁用 javascript 的情况下工作,那么使用 jquery 毫无意义.....
        • SpikEtidE - 是 javascript:; 而不是 javacript:; 另外,我赞成 nickf 的回答,因为它是最优雅的解决方案。
        • 同样,唯一的解决方案是将有意义的页面 URL 作为后备。 jibbering.com/faq/#javascriptURI
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        相关资源
        最近更新 更多