我该如何创建一个像链接一样的HTML按钮?点击按钮时会将用户重定向到另一个页面。
我希望它易于访问,并且在URL中包含尽可能少的额外字符或参数。
在HTML中,最简单的方法是将表单放在<form>
标签中,并在action
属性中指定所需的目标URL。
<form action="https://google.com">
<input type="submit" value="Go to Google" />
</form>
如果必要的话,可以在表单上设置CSS display: inline;
以使其与周围的文本保持同步。 在上面的示例中,可以使用<button type="submit">
代替<input type="submit">
。 唯一的区别是<button>
元素允许子元素。你可能会直觉地期望能够使用类似于<a>
元素的<button href="https://google.com">
,但不幸的是,根据HTML规范,不存在此属性。如果允许使用CSS,则只需使用样式化成按钮的<a>
元素,其中包括appearance
属性(Internet Explorer不支持它)。<a href="https://google.com" class="button">Go to Google</a>
a.button {
-webkit-appearance: button;
-moz-appearance: button;
appearance: button;
text-decoration: none;
color: initial;
}
或者选择那些众多的CSS库,如Bootstrap。
<a href="https://google.com" class="btn btn-primary">Go to Google</a>
如果允许使用 JavaScript,可以设置window.location.href
。
<input type="button" onclick="location.href='https://google.com';" value="Go to Google" />
在上面的例子中,你可以使用<button>
代替<input type="button">
。唯一的区别是<button>
元素允许包含子元素。
display: inline
属性,以保持按钮在流布局中。 - Pekka<button onclick="location.href='http://www.example.com'" type="button">
www.example.com</button>
type="button"
属性很重要,因为它的缺失值默认是提交按钮状态。如果你想在基本的HTML锚点标签中寻找按钮的视觉外观,那么你可以使用Twitter Bootstrap框架来将以下常见的HTML类型链接/按钮格式化为按钮样式。请注意,框架的2、3或4版本之间的视觉差异:
<a class="btn" href="">Link</a>
<button class="btn" type="submit">Button</button>
<input class="btn" type="button" value="Input">
<input class="btn" type="submit" value="Submit">
Bootstrap (v4) 的样例外观:
Bootstrap (v3) 的样例外观:
Bootstrap (v2) 的样例外观:
使用:
<a href="http://www.stackoverflow.com/">
<button>Click me</button>
</a>
不幸的是,这种标记在HTML5中已经不再有效了,它将无法验证,也不一定总是按预期工作。 请使用其他方法。
从HTML5开始,按钮支持formaction
属性。最重要的是,不需要使用JavaScript或诡计。
<form>
<button formaction="http://stackoverflow.com">Go to Stack Overflow!</button>
</form>
注意事项
<form>
标签包围。<button>
类型必须为"submit"或未指定 - 我无法将其与类型"button"一起工作。这提出了下面的问题。参考:formaction
浏览器支持:<button>:按钮元素
formaction
在“IE 世界”中兼容版本 10 及以上版本。 - Luca Detomi<button formaction>
是否等同于 <form action>
? - pseudosavant<form>
的预期行为感到好奇。在一个button
上使用formaction
是否应该将?
添加到空的GET提交中?在这个JSBin中,看起来HTML的行为对于两者都完全相同。 - pseudosavant其实很简单,而且不需要使用任何表单元素。你可以只使用带有按钮的<a>标签 :).
就像这样:
<a href="http://www.google.com" target="_parent"><button>Click me !</button></a>
它将在同一页面中加载 href。想要一个新页面?只需使用 target="_blank"
。
编辑
几年后,虽然我的解决方案仍然有效,但请记住,您可以使用大量的 CSS 来使其看起来任何您想要的样子,这只是一种快速的方式。
<button type="button">...
,这样它就不会默认作为提交按钮。 - Stephen R如果您使用的是内部表单,请在按钮元素中添加属性type="reset"。它将防止表单操作。
<button type="reset" onclick="location.href='http://www.example.com'">
www.example.com
</button>
type="button"
。 - Stephen R<form>
<input type="button" value="Home Page" onclick="window.location.href='http://www.wherever.com'">
</form>
你可以简单地在元素周围放置一个标签:
<a href="http://google.com" target="_blank">
<button>My Button</button>
</a>
这个问题似乎有三种解决方案(每一种都有优缺点)。
<form method="get" action="/page2">
<button type="submit">Continue</button>
</form>
但是这种方法存在问题,因为在一些流行的浏览器版本(如 Chrome、Safari 和 Internet Explorer)中,它会在 URL 末尾添加一个问号字符。换句话说,对于上面的代码,你的 URL 最终看起来会像这样:
http://someserver/pages2?
有一种解决方法,但需要在服务器端进行配置。使用 Apache Mod_rewrite 的一个示例是将所有带有尾随?
的请求重定向到相应的URL,而没有?
。这里是一个使用.htaccess的示例,但这里有一个完整的讨论线程:
RewriteCond %{THE_REQUEST} \?\ HTTP [NC]
RewriteRule ^/?(index\.cfm)? /? [R=301,L]
类似的配置可能会因使用的 Web 服务器和堆栈而有所不同。因此,这种方法的摘要如下:
优点:
缺点:
?
看起来很丑陋。这可以通过使用 POST 而不是 GET 的黑客方式(在某些情况下)进行修复,但干净的方式是进行服务器端重定向。服务器端重定向的缺点是,由于 304 重定向,这些链接会导致额外的 HTTP 调用。<form>
元素。您可以使用 JavaScript 触发 onclick 和其他事件,以使用按钮模仿链接的行为。下面的示例可以改进并从 HTML 中删除,但它只是为了说明这个想法:
<button onclick="window.location.href='/page2'">Continue</button>
优点:
缺点:
将链接样式化成按钮相对容易,并且可以在不同的浏览器上提供类似的体验。Bootstrap 做到了这一点,但是您也可以使用简单的样式自行实现。
优点:
<form>
来工作。缺点:
keypress
事件方面并不一致。方案#1(表单中的按钮)似乎对用户最透明,同时需要最少的工作量。如果此选择不影响布局,并且服务器端调整可行,则对于可访问性是首要任务的情况(例如错误页面上的链接或错误消息),这是一个很好的选择。
如果 JavaScript 不会影响到您的可访问性要求,那么方案 #2(JavaScript)比 #1 和 #3 更受推崇。
如果出于某种原因,可访问性至关重要(JavaScript 不是选择),但您所处的设计和/或服务器配置阻止您使用方案 #1,则方案 #3(以按钮形式样式化的锚点)是一个良好的替代方案,可以在最小程度上影响可用性来解决此问题。
?
符号。这是由于表单的类型是type="GET"
,将其改为type="POST"
即可使URL末尾的?
消失。这是因为GET会将所有变量发送到URL中,因此会出现?
。 - redfox05