锚点或按钮 [重复]

Posted

技术标签:

【中文标题】锚点或按钮 [重复]【英文标题】:Anchor or button [duplicate] 【发布时间】:2013-08-21 06:18:25 【问题描述】:

我应该为 javascript 操作使用什么元素?

执行播放/暂停/停止/新建/打开/保存/打印/关闭等操作的操作。

<a id="play" href="#">Play</a>
<a href="#play">Play</a>
<button id="play" tabindex="0">Play</button>
<div id="play" role="button" tabindex="0">Play</div>

我看到很多人使用锚点&lt;a&gt;href="#",但这感觉不是很语义化,感觉锚点用于指向资源的超链接,而不是用于执行某些操作的操作。然后你必须用event.preventDefault(即return false)破解它。

我很少看到人们使用&lt;button&gt; 元素,但这不是应该使用的吗?

【问题讨论】:

您对链接的怀疑是 100% 正确的。 如果button 元素的默认样式在使用图标表示动作时被认为是不受欢迎的,则可以使用 CSS 类覆盖它。 .btn-icon background: none; border: none 谁在乎别人做什么?如果按钮对您有用,而且效果很好,请使用它们! 在编程中,几乎所有事情都至少有两种方式。 【参考方案1】:

确定哪个元素对基于 JS 的用户交互具有最佳语义的最佳方法是询问如果 JS 失败时您希望发生什么 (which it will.

想想progressive enhancement。想想unobtrusive JavaScript。

用户是否应该转到另一个页面?使用链接。 href 将是 JS 失败时的回退。

用户在发送一些数据或发出 POST 请求时是否应该转到另一个页面?使用一个按钮,把它放在一个表单中。

是否不可能有任何类型的服务器后备?使用 &lt;button type="button"&gt; 并考虑从 JS/DOM 而不是 html 生成它。

【讨论】:

以下是对每个优点和缺点的巧妙探索:bitsofco.de/anchors-vs-buttons>。它建议使用锚点作为回退,然后用 JavaScript 中的按钮替换它们。两全其美:逐步增强和语义正确。【参考方案2】:

TLDR;您可以在新选项卡/窗口中打开锚链接,但不能在按钮中打开。

这是一个经验法则:

对于导航,只需使用 anchor 就可以将其设置为 按钮,让它很好地使用它的href属性。

对于快速操作(播放、暂停、停止、+1 赞)只需使用 按钮 没有href 是有原因的!

考虑一下这段代码。

const [anchor] = document.getElementsByTagName('a')
const [button] = document.getElementsByTagName('button')

anchor.addEventListener('click', e => 
  console.log('anchor clicked')
  e.preventDefault()

, false)

button.addEventListener('click', e => 
  console.log('button clicked')
)
a 
  text-decoration: none;
  padding: 2px;



button 
  background: none;
  border: none;
  font-size: 16px;


.btn 
  background-color: blue;
  color: white;
  display: inline-block;
  text-align: center;
<a class="btn" href="#">
  Anchor
</a>

<hr/>

<button class="btn" type="button">
  Button
</button>

样式

它们看起来几乎相似(几乎没有理由)唯一的问题是您必须撤消 button 附带的一些样式,例如 borderbackground 但使用锚点时您不会得到点击使用按钮弹出的动画。

功能

但是由于锚点 &lt;a&gt; 需要 &lt;a href="some/path"&gt; 才能工作即使它只是 #,除非您在单击锚点后需要导航,否则您将不得不使用 e.preventDefault()你的 javascript 来防止它。

【讨论】:

【参考方案3】:

然后你必须用 event.preventDefault 破解它

您可以将 href 设置为 javascript:void(0) 而不是 #,这将阻止执行而不必使用 event.preventDefault()

但是按钮可能更适合这种事情

【讨论】:

我听说在href 属性中使用javascript: 伪协议是不可取的。 href 属性用于超链接。【参考方案4】:

这更像是一种偏好。

就个人而言,我更喜欢使用

如果使用

【讨论】:

我注意到 Gmail 使用 div 元素,而 YouTube 使用 button 元素。 Google.com 使用 adiv 元素。

以上是关于锚点或按钮 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

css 通过css禁用锚点或按钮

什么应该放在 HTML 中,锚点或标题? [复制]

HTML 语义 - 充当锚点的按钮

将按钮放在锚点内有啥缺点吗?

按钮跳转到下一个锚点

如何使用 UITableViewCell 的附件按钮作为 Popover 的锚点