診断CSSスタイルシートの使用を開始しました。 http://snipplr.com/view/6770/css-diagnostics--highlight-deprecated-html-with-css--more/
提案されたルールの1つは、より意味的な解決策として<button>
を使用することを推奨する、submitタイプの入力タグを強調しています。遭遇したタイプ送信(ブラウザ互換性など)での<button>
の長所と短所は何ですか?
明確にするために、私は<button>
の仕様を理解しています。開始と終了が定義され、さまざまな要素を含むことができますが、入力は一重項であり、内容を含めることはできません。私が本質的に知りたいのは、壊れているかどうかです。現在のボタンの使用可能性を知りたい。以下の最初の答えは、残念ながら、フォーム以外を使用する場合は壊れていることを暗示しているようです。
2015年の編集
風景が変わりました!私はもう6年以上ボタンを扱った経験があり、ブラウザはIE6とIE7からやや移行しました。そこで、私が見つけたものと提案したものを詳述する回答を追加します。
ASP.NETの観点からの回答。
この質問 と、ModernButtonコントロールのコード(最終的に<button>
コントロール)を見つけたとき、私は興奮しました。
そこで私はこれらのボタンのすべての種類を追加し始め、それらを際立たせるために<img />
タグで装飾されました。そして、それはすべて、FirefoxとChromeでうまく機能しました。
その後、IE6を試して「潜在的に危険なRequest.Form値が検出されました」というメッセージを受け取りました。IE6がボタンの内側にhtmlを送信するためです。私の場合はhtmlタグが含まれています。この追加されたデータ検証が好きなので、validateRequestフラグを無効にしたくありません。
そこで、送信が発生する前にそのボタンを無効にするJavaScriptを作成しました。ボタンが1つあるテストページではうまく機能しましたが、他の<button>
タグがある実際のページで試してみたところ、再び爆発しました。 IE6はボタンのすべてのhtmlを送信するためです。そのため、送信前にボタンを無効にするためのあらゆる種類のコードが用意されました。
IE7と同じ問題。ありがたいことに、IE8ではこれが修正されています。
うわぁ。 ASP.NETを使用している場合は、この道を歩かないことをお勧めします。
更新:
これを修正するのに有望なライブラリを見つけました。
このライブラリのie8.jsスクリプトを使用する場合: http://code.google.com/p/ie7-js/
うまくいくかもしれません。 IE8.jsは、IE5-7をボタンタグ付きIE8で高速化します。送信された値を実際の値にし、1つのボタンのみが送信されます。
ブラウザはデフォルトで異なるタイプを使用するため、<button>
を使用する場合は常にタイプを指定します。
これはすべてのブラウザーで一貫して機能します。
<button type="submit">...</button>
<button type="button">...</button>
これにより、<button>
のすべての利点を得ることができ、欠点はありません。
知っておく必要があるすべて: W3Schools <button>
タグ
このタグは、すべての主要なブラウザーでサポートされています。
重要:HTMLフォームでボタン要素を使用する場合、異なるブラウザーは異なる値を送信します。 Internet Explorerは、
<button>
および</button>
タグ、他のブラウザはvalue属性のコンテンツを送信します。input
要素を使用して、HTMLフォームにボタンを作成します。
長所:
<em>
や<img>
などのマークアップを含めることができます短所:
type="button"
ではなくtype="submit"
にデフォルト設定されるため、明示的に指定する必要があります<button>
sが成功したものとして処理されるため、複数送信ボタンフォームでクリックされたものを判別できません。から https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button :
IE7にはバグがあり、Click meでフォームを送信すると、送信されたPOSTデータはmyButton = fooではなくmyButton = Click meになります。IE6にはフォームを送信するさらに悪いバグがあります。 IE7と同じバグで、ボタンはフォームのすべてのボタンを送信しますが、このバグはIE8で修正されました。
重要な注意事項:<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
属性を除外しないでください。
6年後の<button>
の癖を少し経験したことがあるので、ここに私の提案を示します。
still supportIE6またはIE7、ボタンに非常に注意してください、これらのブラウザでは動作が非常にバグがあります。場合によっては、value = 'whatever'の代わりにinnerHtmlを送信し、1つだけの代わりにすべてのボタン値を送信します。したがって、これらのブラウザのために徹底的にテストするか、避けてください。
そうでない場合:IE8を引き続きサポートしている場合、<a href='http://example.com'><button></button></a>
はうまく機能せず、おそらくボタンをクリック可能な要素。気をつけてね.
それ以外の場合:主にjavascriptをクリックする要素として<button>
を使用していて、それがフォームの外にある場合は、<button type='button'>
にすれば大丈夫です。
それ以外の場合:フォームで<button>
を使用している場合、(ほとんどの場合)<button>
のデフォルトタイプが実際に<button type='submit'>
であることに注意してください。したがって、タイプとvalue
、たとえば:<button type='submit' value='1'>Search</button>
。
注:Bootstrapの.btn
などのボタン模倣クラスを使用すると、<div>
や<a>
、さらには<button>
のようなものを思い通りに作成できます。 、および<a>
の場合、より便利なフォールバック動作があります。悪いオプションではありません。
違いを説明するサイトは次のとおりです。 http://www.javascriptkit.com/howto/button.shtml
基本的に、inputタグはテキストのみを許可しますが(背景画像を使用できます)、ボタンは画像、表、divなどを追加できます。また、フォームタグ内にネストする必要もありません。
また、これらの問題に遭遇する可能性があります。
<button>
s: http://www.peterbe.com/plog/button-tag-in-IE別のことは、 sliding-door technique を使用してスタイリングすることに関連しています:別のタグを挿入する必要があります<span>
動作させる。
私が懸念している限り、送信タグとボタンタグの違いは次のとおりです。要素の値とは異なるテキストを表示するオプションを提供します
製品のリストがあり、ボタンで顧客のカートに追加する各製品の隣にあるとします。
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 = "product2"ではなくvalue = "add to cart"でフォームを送信することです
この問題を回避する最も簡単な方法は、onclick = "this.value = 'product2'"を追加することです
したがって、この:
<button name="buy" type="submit" value="product2" onclick="this.value='product2'"> add to cart </button>
すべての主要なブラウザでトリックを行います-私は実際に複数のボタンを持つフォームでこれを使用し、Chrome FirefoxおよびIEで動作します