次の3つの送信ボタンがあるフォームがあります。
<input type="submit" name="COMMAND" value="‹ Prev">
<input type="submit" name="COMMAND" value="Save">
<input type="reset" name="NOTHING" value="Reset">
<input type="submit" name="COMMAND" value="Next ›">
<input type="button" name="NOTHING" value="Skip ›" onclick="location = 'yada-yada.asp';">
ボタンの列は、送信、リセット、およびJavaScriptボタンの組み合わせです。ボタンの順序は変更される場合がありますが、いずれにしても、保存ボタンは前のボタンと次のボタンの間に残ります。
ここでの問題は、ユーザーがヒットすると Enter フォームを送信するには、ポスト変数「COMMAND」に「Prev」が含まれます。通常、これはフォーム上の最初の送信ボタンです。ただし、ユーザーがフォームを介してフォームを送信すると、「次へ」ボタンがトリガーされます。 Enter ボタン。前に他のボタンがありますが、デフォルトの送信ボタンとして設定するようなものです。
私の提案は、この行動と戦わないことです。フロートを使用して順序を効果的に変更できます。例えば:
<p id="buttons">
<input type="submit" name="next" value="Next">
<input type="submit" name="prev" value="Previous">
</p>
で:
#buttons { overflow: hidden; }
#buttons input { float: right; }
効果的に順序を逆にするので、「次へ」ボタンはエンターを押すことでトリガーされる値になります。
この種の手法は、よりハッキングなJavaScriptメソッドに頼ることなく、多くの状況をカバーします。
最初のボタンは常にデフォルトです。変更することはできません。 can JavaScriptで修正しようとすると、フォームはブラウザでスクリプティングなしで予期せずに動作し、いくつかの使いやすさ/アクセシビリティのケースが考えられます。たとえば、Zoranによってリンクされたコードは、Enterキーを押したときに<input type="button">
でフォームを誤って送信します。これは通常は発生せず、他の非フォームのフィールドコンテンツ。したがって、そのスクリプトを含むフォームの<p>
のテキストをクリックしてEnterを押すと、間違ったボタンが送信されます。その例で示されているように、実際のデフォルトボタンが 'Delete '!
私のアドバイスは、スクリプトハックを使用してデフォルトを再割り当てすることを忘れることです。ブラウザの流れに沿って進み、デフォルトのボタンを最初に置いてください。レイアウトをハックして必要な画面上の順序を与えることができない場合は、ソースに最初にダミーの非表示ボタンを設定し、デフォルトにするボタンと同じ名前/値を使用します。
<input type="submit" class="defaultsink" name="COMMAND" value="Save" />
.defaultsink {
position: absolute; left: -100%;
}
(注:display: none
およびvisibility: hidden
には、ボタンをデフォルトとして使用するかどうか、および送信するかどうかにブラウザ変数の副作用があるため、ボタンを画面外にプッシュするために配置が使用されます。
Quick'n'dirtyでは、Enterキーを押したときに使用される送信ボタンの非表示の複製を作成できます。
input.hidden {
width: 0px;
height: 0px;
margin: 0px;
padding: 0px;
outline: none;
border: 0px;
}
<input type="submit" name="next" value="Next" class="hidden" />
<input type="submit" name="prev" value="Previous" />
<input type="submit" name="next" value="Next" />
フォームで誰かがエンターキーを押すと、(非表示の)次のボタンが送信者として使用されます。
IE9、Firefox、ChromeおよびOperaでテスト済み
type=submit
をデフォルトにするボタンに設定し、type=button
を他のボタンに設定します。これで、次のフォームで任意の入力フィールドでEnterキーを押すことができ、Render
ボタンが機能します(フォームの2番目のボタンであるにもかかわらず)。
例:
<button id='close_button' class='btn btn-success'
type=button>
<span class='glyphicon glyphicon-edit'> </span> Edit program
</button>
<button id='render_button' class='btn btn-primary'
type=submit> <!-- Here we use SUBMIT, not BUTTON -->
<span class='glyphicon glyphicon-send'> </span> Render
</button>
FF24およびChrome 35でテスト済み。
JQueryを使用している場合、 here のコメントからのこのソリューションは非常に滑らかです。
$(function(){
$('form').each(function () {
var thisform = $(this);
thisform.prepend(thisform.find('button.default').clone().css({
position: 'absolute',
left: '-999px',
top: '-999px',
height: 0,
width: 0
}));
});
});
デフォルトにしたいボタンにclass="default"
を追加するだけです。フォームの先頭にそのボタンの非表示のコピーを配置します。
JavaScript以外の方法でこれを行う方法を研究していたため、これを復活させています。私はキーハンドラーには興味がありませんでした。CSSの再配置はタブの順序を変更しないため、CSSの配置によってタブの順序が壊れていました。
私の解決策は、 https://stackoverflow.com/a/9491141 の応答に基づいています。
ソリューションのソースは次のとおりです。 tabindexは、非表示ボタンのタブの動作を修正するために使用されます。また、スクリーンリーダーによってボタンが読み取られたり、支援デバイスによって識別されたりするのを避けるために、aria-hiddenを使用します。
<form method="post" action="">
<button type="submit" name="useraction" value="2nd" class="default-button-handler" aria-hidden="true" tabindex="-1"></button>
<div class="form-group">
<label for="test-input">Focus into this input: </label>
<input type="text" id="test-input" class="form-control" name="test-input" placeholder="Focus in here and press enter / go" />
</div>
DOMの1番目のボタンDOMの2番目のボタンDOMの3番目のボタン
このソリューションに不可欠なCSS:
.default-button-handler {
width: 0;
height: 0;
padding: 0;
border: 0;
margin: 0;
}
JQueryを使用した別のソリューション:
$(document).ready(function() {
$("input").keypress(function(e) {
if (e.which == 13) {
$('#submit').click();
return false;
}
return true;
});
});
これは次のフォームで動作し、「更新」がデフォルトのアクションになります。
<form name="f" method="post" action="/action">
<input type="text" name="text1" />
<input type="submit" name="button2" value="Delete" />
<input type="submit" name="button1" id="submit" value="Update" />
</form>
と同様:
<form name="f" method="post" action="/action">
<input type="text" name="text1" />
<button type="submit" name="button2">Delete</button>
<button type="submit" name="button1" id="submit">Update</button>
</form>
これは、フォーム上の入力フィールドにフォーカスがある場合にのみEnterキーをトラップします。
同じ名前のボタンを使用しないでください。悪いセマンティクスです。代わりに、設定されているさまざまな名前の値を探すようにバックエンドを変更する必要があります。
<input type="submit" name="COMMAND_PREV" value="‹ Prev">
<input type="submit" name="COMMAND_SAVE" value="Save">
<input type="reset" name="NOTHING" value="Reset">
<input type="submit" name="COMMAND_NEXT" value="Next ›">
<input type="button" name="NOTHING" value="Skip ›" onclick="window.location = 'yada-yada.asp';">
バックエンドで使用している言語がわからないため、疑似コードを提供します。
if (input name COMMAND_PREV is set) {
} else if (input name COMMAND_SAVE is set) {
} else if (input name COMMENT_NEXT is set) {
}