I started using a diagnostic css stylesheet, e.g. http://snipplr.com/view/6770/css-diagnostics--highlight-deprecated-html-with-css--more/
One of the suggested rules highlights input tags with the type submit, with the recommendation to use <button>
as a more semantic solution. What are the advantages or disadvantages of <button>
with type submit (such as with browser compatibility) that you have run across?
Just to be clear, I understand the spec of <button>
, it has a defined start and end, it can contain various elements, whereas input is a singlet and can't contain stuff. What I want to know essentially is whether it's broken or not. I'd like to know how usable button is at the current time. The first answer below does seem to imply that it is broken for uses except outside of forms, unfortunately.
Edit for 2015
The landscape has changed! I have 6 more years experience of dealing with button now, and browsers have somewhat moved on from IE6 and IE7. So I'll add an answer that details what I found out and what I suggest.
Looks like the main reason to use
<button>
is to allow for CSS markup of that button and the ability to style the button with images: (see here: http://www.javascriptkit.com/howto/button.shtml)However, I think the more adopted approach I've seen in (X)HTML + CSS is to use a div and style it completely with images and :hover pseudo-classes (simulating button downpress... can't add more than one link per answer, so just google "div button" you'll see lots of examples of this), and using javascript to do form submission or AJAX call... this also makes even more sense if you don't use HTML forms, and do all submissions with AJAX.
An important quirk to be aware of: In a form that contains a
<button/>
element, IE6 and IE7 will not submit the form when the<button/>
element is clicked. Other browsers, on the other hand, will submit the form.In contrast, no browsers will submit the form when
<input type="button"/>
or<button type="button"/>
elements are clicked. And naturally, all browsers will submit the form when<input type="submit"/>
or<button type="submit"/>
elements are clicked.As @orip's answer says, to get consistent submit behavior across browsers, always use
<button type="button" />
or<button type="submit" />
inside a<form/>
element. Never leave out thetype
attribute.Here's a site that explains the differences: http://www.javascriptkit.com/howto/button.shtml
Basically, the input tag allows just text (although you can use a background image) while the button allows you to add images, tables, divs and whatever else. Also, it doesn't require it to be nested within a form tag.
as far as I am concerned the difference between submit and button tags is this: gives you the option to have different text displayed than the element's value
Let's say you have a list of products then next to each product you want a button to add it to the customer's cart:
then you could do this:
Now the problem is that IE will send the form with value="add to cart" instead of value="product2"
The easiest way to workaroound this issue is by adding onclick="this.value='product2'"
So this:
will do the trick on all major browsers - I have actually used this on a form with multiple buttons and works with Chrome Firefox and IE
I've had some experience with the quirks of
<button>
now, 6 years later, so here are my suggestions:If you're still supporting IE6 or IE7, be very careful with button, the behavior is very buggy with those browsers, in some cases submitting the innerHtml instead of value='whatever' and all button values instead of just one and wonky behavior like that. So test thoroughly or avoid for those browser's sake.
Otherwise: If you're still supporting IE8,
<a href='http://example.com'><button></button></a>
doesn't work well, and probably anything else where you nest a button inside a clickable element. So watch out for that.Otherwise: If you're using a
<button>
mainly as an element to click for your javascript, and it's outside of a form, make it<button type='button'>
and you'll probably be just fine!Otherwise: If you're using
<button>
in a form, be wary that the default type of<button>
is actually<button type='submit'>
in (most) cases, so be explicit with your type and yourvalue
, like:<button type='submit' value='1'>Search</button>
.Note that: Using a button-mimic class, like Bootstrap's
.btn
allows you to just make things like<div>
or<a>
or even<button>
look exactly the way you want it to, and in the case of<a>
have a more useful fallback behavior. Not a bad option.TLDR; Ok to use if you don't care about ancient browsers, but Bootstrap provides even more robust css visually similar alternatives worth looking into.