不能直接用 实现真正的“加入购物车”,因为其本质是导航,会触发页面跳转,而该操作需异步请求、状态更新与局部UI刷新;纯无法原生支持,必须依赖JavaScript干预,默认行为违背语义;更合理的是用替代,语义正确、无障碍友好、天然支持交互。

为什么不能直接用 实现真正的“加入购物车”
因为 标签本质是导航,点击后会触发页面跳转(href),而“加入购物车”是前端与后端交互的异步操作,需要发请求、更新状态、可能还要刷新局部 UI。纯 做不到这些——它连阻止默认跳转都得靠 JavaScript 干预,已经脱离了语义初衷。
如果非要套用 标签,必须配合 JavaScript
-
href设为#或javascript:void(0)(后者更明确表示无跳转) - 用
onclick或事件监听器调用添加逻辑,比如addToCart(productId) - 记得加
role="button"和aria-label保证可访问性,否则屏幕阅读器会把它读作“链接”而非“按钮”
示例:
<a href="javascript:void(0)" role="button" aria-label="加入购物车:iPhone 15" onclick="addToCart('prod-123')">加入购物车</a>
更合理的选择:用 替代
语义正确、无需 hack、天然支持 disabled、键盘回车/空格可触发、无障碍友好。唯一要注意的是:如果按钮需要“看起来像链接”(比如蓝色下划线样式),用 CSS 覆盖即可:
- 设置
background: none; border: none; text-decoration: underline; color: #0066cc; - 保留
cursor: pointer;和:focus-visible样式以支持键盘聚焦 - 避免用
包裹,这是无效 HTML
示例:
<button type="button" onclick="addToCart('prod-123')" style="background:none;border:none;text-decoration:underline;color:#0066cc;cursor:pointer;">加入购物车</button>
服务端渲染场景下, 的唯一合法用法
仅当“加入购物车”是纯服务端跳转(如 href="/cart/add?pid=123"),且后端处理完重定向回原页或购物车页时,才可用 。但这种方式有明显缺陷:
- 无法提示用户“已加入”,除非靠 URL 参数或服务端闪存(flash message)
- 刷新页面会重复提交(没有防重机制)
- 移动端返回时可能丢失上下文
- 不支持并发添加多个商品(每次都是新请求)
现代电商几乎不用这种模式,除非是极简静态站点或遗留系统。
实际项目里,哪怕只是个 demo,也建议从 + fetch 开始写。很多人卡在“怎么让按钮长得像链接”,而不是“怎么让加入购物车真正可靠”——后者才是容易被忽略的核心。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











