javascript - 可访问性 - Javascript 仅链接带有 href="#" 的反模式?
问题描述
我有一个反应 SPA,其中有一些需要 javascript 来更改页面 url 的链接。从语义上讲,这些应该是链接,但链接目标是在运行时单击时计算的,或者它需要 javascript 移动到该位置(历史 api)
我在一些地方看到过,href="#" 是一种反模式或应该避免的东西。例如,来自 webaim https://webaim.org/techniques/hypertext/的这篇文章提到:
最严重的障碍之一是创建无处可去的链接。开发人员有时会使用 JavaScript 创建动态菜单,当用户将鼠标悬停在某些链接上时会下拉菜单。在某些情况下,链接本身根本无处可去,其唯一目的是在下拉菜单中公开链接,这些链接确实具有真实的目的地。像这样的链接通常有一个井号作为链接目的地,这意味着链接目的地是同一个页面;点击链接什么也没做。尝试激活链接时,键盘用户和鼠标用户都不会有任何体验。
它给出了一个 href="#" 的例子
现在我明白了,对于不执行任何操作或不将用户带到任何地方的链接使用 href="#" 可能在语义上是不正确的。不过,在我的使用中,链接确实有一个目的地,只是目的地不能在 href 中指定,除非单击链接,否则可能无法确定。所以我的用法是拥有href="#"
和e.preventDefault()
onClick,这样它就不会转到页面顶部并创建另一个历史记录条目。
我已经看到了其他可行的解决方案/解决方法:
using hash vs javascript:void(0) 我应该为 JavaScript 链接使用哪个“href”值,“#”还是“javascript:void(0)”?
其他解决方法 https://weblog.west-wind.com/posts/2019/Jan/21/NonNavigating-Links-for-JavaScript-Handling
但我想了解,如果使用href="#"
具有目的地的链接(在单击链接后发现,或使用 javascript 应用)是一种反模式。
这是与 javascript only links 可访问性相关的问题的后续行动 :Using javascript only links with href="#"
解决方案
如果它导航到新 URL,href
则应将属性设置为该新 URL。然后,您可以使用它event.preventDefault()
来防止页面在新位置重新加载。
// mock out history for demo purposes
const history = {
pushState: (_data, _title, newUrl) => {
alert(`navigated to ${newUrl}!`)
}
}
document.querySelector('#spa-link').addEventListener('click', e => {
e.preventDefault()
history.pushState({}, '', '/new/path')
})
<a id="spa-link" href="/new/path">Go to new path</a>
推荐阅读
- reactjs - 在 useEffect 内的调度中使用组件作为道具会产生无限调度吗?
- json - 未捕获的类型错误:将循环结构转换为 JSON --> 从具有构造函数“FiberNode”的对象开始
- c# - 即使属性是绑定也不会更新
- apache-kafka - 在 kafka-connect 中使用 jdbc 源连接器时面临数据丢失问题
- javascript - 当监视从另一个类(Node.js)调用的对象时,Jest mockImplementation(Promise.resolve)返回未定义
- c# - 唯一的 IdentityColumn 值取决于另一列
- laravel - 使用 PHPUnit 拆分或不拆分测试用例
- git - 仅将一个功能分支更改合并到 master
- aem - 如何将 disqus 与 Adobe Experience Manager 集成
- deep-learning - 如何最好地在张量流模型中使用关于类分布的先验知识?