<button>标签有哪些缺点?</button>

时间:2009-12-14 20:59:07

标签: css button tags internet-explorer-7 diagnostics

我开始使用诊断css样式表,例如 http://snipplr.com/view/6770/css-diagnostics--highlight-deprecated-html-with-css--more/

建议的规则之一突出显示类型为submit的输入标记,建议使用<button>作为更具语义的解决方案。您遇到的<button>类型提交(例如浏览器兼容性)有哪些优缺点?

为了清楚起见,我理解<button>的规范,它有一个定义的开始和结束,它可以包含各种元素,而输入是一个单一的,不能包含东西。我最想知道的是它是否破碎。我想知道当前可用的按钮是多少。不幸的是,下面的第一个答案似乎暗示它已被打破,除了表格以外的用途。

2015年编辑

景观发生了变化!我现在有6年以上的处理按钮的经验,浏览器有点从IE6和IE7转移。所以我会添加一个答案,详细说明我发现的内容以及我建议的内容。

11 个答案:

答案 0 :(得分:49)

使用<button>时始终指定类型,因为浏览器默认使用不同的类型。

这将在所有浏览器中保持一致:

  • <button type="submit">...</button>
  • <button type="button">...</button>

这样你就可以获得所有<button>的优点,没有任何缺点。

答案 1 :(得分:17)

从ASP.NET角度回答。

当我找到this question和一些ModernButton控件的代码时,我很兴奋,最终,它是一个<button>控件。

所以我开始添加各种这些按钮,在其中加上<img />标签,以使它们脱颖而出。这一切都很有用......在Firefox和Chrome中。

然后我尝试了IE6并得到了“检测到一个潜在危险的Request.Form值”,因为IE6提交了按钮内部的html,在我的情况下,其中包含html标签。我不想禁用validateRequest标志,因为我喜欢这个额外的数据验证。

然后我在提交发生之前写了一些javascript来禁用该按钮。在一个测试页面上工作得很好,只有一个按钮,但当我在一个真实的页面上试用它时,它有其他<button>标签,它再次爆炸了。因为IE6提交了所有按钮的html。所以现在我有各种代码在提交之前禁用按钮。

与IE7相同的问题。 IE8谢天谢地解决了这个问题。

让人惊讶。如果您使用的是ASP.NET,我建议不要走这条路。

<强>更新

我找到了一个看起来很有希望解决这个问题的图书馆。

如果您使用此库中的ie8.js脚本:http://code.google.com/p/ie7-js/

它可能会很好。 IE8.js使用按钮标签的IE8加速IE5-7的速度。它使提交的值成为实际值,并且只提交一个按钮。

答案 2 :(得分:13)

您需要知道的一切:W3Schools <button> Tag

  

所有主流浏览器都支持该标记。

     

重要提示:如果您在HTML表单中使用button元素,则不同的浏览器将提交不同的值。 Internet Explorer将在<button></button>标记之间提交文本,而其他浏览器将提交value属性的内容。使用input元素在HTML表单中创建按钮。

答案 3 :(得分:10)

优点:

  • 显示标签不必与提交的值相同。非常适合i18n和“删除此行”
  • 您可以添加<em><img>
  • 等标记

缺点:

  • 某些版本的MSIE默认为type="button"而非type="submit",因此您必须明确
  • MSIE的某些版本会将所有<button>视为成功,因此您无法确定在多提交按钮表单中点击了哪一个
  • 某些版本的MSIE将提交显示文本而非实际值

来自https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button

  

IE7有一个错误,当用Click Click提交表单时,发送的POST数据将导致myButton = Click me而不是myButton = foo。   IE6有一个更糟糕的错误,通过按钮提交表单将提交表单的所有按钮,与IE7相同的错误。   这个错误已在IE8中修复。

答案 4 :(得分:9)

需要注意的一个重要问题:在包含<button/>元素的表单中,IE6和IE7在单击<button/>元素时不会提交表单。另一方面,其他浏览器将提交表单。

相比之下,点击<input type="button"/><button type="button"/>元素时,任何浏览器都不会提交表单。当然,所有浏览器都会在点击<input type="submit"/><button type="submit"/>元素时提交表单。

正如@ orip的回答所说,为了在浏览器之间获得一致的提交行为,请始终在<button type="button" />元素中使用<button type="submit" /><form/>。永远不要忽略type属性。

答案 5 :(得分:5)

我现在已经对<button>的怪癖有了一些经验,6年后,所以这是我的建议:

  • 如果您仍然支持 IE6 IE7 ,请务必小心按钮,行为非常错误使用这些浏览器,在某些情况下提交innerHtml而不是value =&#39;无论什么&#39;和所有按钮值,而不是像这样的一个不稳定的行为。因此,请彻底测试或避免使用这些浏览器。

  • 否则:如果您仍然支持 IE8 <a href='http://example.com'><button></button></a>无效,可能还有其他任何可以将按钮嵌入可点击内容的地方元件。所以要小心。

  • 否则:如果您主要使用<button>作为点击您的javascript的元素,并且它在表单之外,请将其设为<button type='button'>并且你可能会很好!

  • 否则:如果您在表单中使用<button>,请注意(大多数情况下)默认类型<button>实际上是<button type='submit'>,所以明确您的类型和value,例如:<button type='submit' value='1'>Search</button>

请注意:使用按钮模拟类(如Bootstrap的.btn)可以让您只显示<div><a>甚至<button>之类的内容完全按照你想要的方式,在<a>的情况下有一个更有用的回退行为。不错的选择。

TLDR;如果您不关心古老的浏览器,那么可以使用,但Bootstrap提供了更加强大的css视觉上类似的替代方案值得研究。

答案 6 :(得分:4)

是否破损:

像往常一样,答案是“它在所有主流浏览器中都能正常工作,但在IE中有以下怪癖。”我认为这不会对你造成任何问题。

所有主流浏览器都支持<button>标记。唯一的支持问题在于按下按钮后Internet Explorer将提交的内容。

主要浏览器将提交value属性的内容。互联网exploter将在<button></button>标记之间提交文字,同时还提交表单中每个其他标记的值,而不是您点击的标记。

出于您的目的,只需清理旧的HTML,这应该不是问题。

来源:

  1. http://www.peterbe.com/plog/button-tag-in-IE
  2. http://www.w3schools.com/tags/default.asp

答案 7 :(得分:1)

这是一个解释差异的网站: http://www.javascriptkit.com/howto/button.shtml

基本上,输入标签只允许文本(虽然你可以使用背景图像),而按钮允许你添加图像,表格,div和其他任何东西。此外,它不要求它嵌套在表单标记中。

答案 8 :(得分:1)

您可能还会遇到这些问题:

另一件事与使用sliding-door technique设置样式有关:您需要插入另一个标记,例如<span>让它发挥作用。

答案 9 :(得分:0)

就我而言,提交和按钮标签之间的区别是:  您可以选择显示与元素值

不同的文本

假设您有一个产品列表,然后在每个产品旁边,您想要一个按钮将其添加到客户的购物车中:

product1 : <add to cart>
product2 : <add to cart>
product3 : <add to cart>

然后你可以这样做:

<button name="buy" type="submit" value="product2"> add to cart </button>

现在的问题是IE会发送带有value =“add to cart”的表单而不是value =“product2”

解决此问题的最简单方法是添加onclick =“this.value ='product2'”

所以这个:

<button name="buy" type="submit" value="product2" onclick="this.value='product2'"> add to cart </button>

将在所有主要浏览器上实现这一功能 - 我实际上在具有多个按钮的表单上使用此功能,并与Chrome Firefox和IE一起使用

答案 10 :(得分:-2)

看起来使用<button>的主要原因是允许该按钮的CSS标记以​​及使用图像设置按钮样式的能力:(参见此处:http://www.javascriptkit.com/howto/button.shtml

然而,我认为我在(X)HTML + CSS中看到的更多采用的方法是使用div并使用图像完全设置样式并且:hover伪类(模拟按钮downpress ...无法添加每个答案不止一个链接,所以只需谷歌“div按钮”,你会看到很多这样的例子),并使用javascript进行表单提交或AJAX调用...如果你不使用这也更有意义HTML表单,并使用AJAX进行所有提交。