さまざまなアクションを実行する複数の送信ボタンがあるHTMLページにフォームがあります。ただし、ユーザーがテキスト入力に値を入力してEnterキーを押すと、ブラウザーは通常、次の送信ボタンが順番にアクティブ化されたかのように動作します。特定のアクションを発生させたいので、私が見つけた1つの解決策は、次のように、問題のテキスト入力の直後に非表示の送信ボタンをHTMLに配置することでした。
<input type="text" name="something" value="blah"/>
<input type=submit name="desired" value="Save Earth" style="display: none"/>
...
<input type=submit name="something_else" value="Destroy Earth" />
...
<input id="foobar" type=submit name="desired" value="Save Earth" />
これは、SafariやChromeなどのWebkitブラウザーでは機能しないことを除けば、ほとんどのブラウザーで魅力のように機能します。何らかの理由で、非表示の送信ボタンをスキップします。エンターキーの押下をインターセプトし、Javascriptを使用して適切な送信をアクティブ化する方法を見つけようとしていましたが、それを機能させることができませんでした。キーダウンを傍受し、適切な送信にフォーカスを設定しても機能しません。
ユーザーがHTMLフォームのテキスト入力でEnterキーを押したときに使用する送信ボタンを選択するために、Javascriptまたはその他の方法を使用する方法はありますか?
編集:明確にするために、フォームは基本的にJavascriptが「機能する」ことを要求できません。 WebkitブラウザーでJavascriptがないと、Enterキーの送信が望ましくないかどうかは気になりませんが、送信ボタンの順序を削除または変更することはできません。
これは私が試したものであり、Webkitブラウザーでの送信動作は変更されません。
機能したのは、次のコードのfocus()をclick()。
document.onkeypress = processKey;
function processKey(e)
{
if (null == e)
e = window.event ;
if (e.keyCode == 13) {
document.getElementById("foobar").click(); // previously: focus()
}
}
編集:最終解決策:
すべてのブラウザで動作し、必要な場合にのみEnterキーをインターセプトします。
HTML:
<input type="text" name="something" value="blah"
onkeydown="return processKey(event)" />
<input type=submit name="desired" value="Save Earth" style="display: none"/>
...
<input type=submit name="something_else" value="Destroy Earth" />
...
<input id="foobar" type=submit name="desired" value="Save Earth" />
Javascript:
function processKey(e)
{
if (null == e)
e = window.event ;
if (e.keyCode == 13) {
document.getElementById("foobar").click();
return false;
}
}
1つの方法は、すべての送信ボタンを削除し、入力ボタンを使用してプログラムでフォームを送信することです。これにより、テキストボックスのEnterキーを押してフォームを送信する機能が削除されます。 1つの送信ボタンをデフォルトの送信機能として残し、他のボタン入力に通常のボタン入力を使用して、プログラムでフォームを送信することもできます。
これの明らかな欠点は、ユーザーがJavaScriptを有効にする必要があることです。これが問題ではない場合、これは考慮事項です。
編集:
ここでは、jQueryを使用して例を作成しようとしました(jQueryがなくても同じ機能を簡単に作成できます)...これが役立つかどうか教えてください...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Untitled</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript"><!--
$(document).ready(function(){
$("#f input").filter(":text").keydown( function(event) {
if (event.keyCode==13) {
$(this).nextAll().eq(0).click();
}
});
});
//--></script>
</head>
<body>
<form name="f" id="f">
<input type="text" id="t1" name="t1" /><input type="button" id="b1" name="b1" value="button-one" onclick="alert('clicked enter on textbox 1');" /><br />
<input type="text" id="t2" name="t2" /><input type="button" id="b2" name="b2" value="button-two" onclick="alert('clicked enter on textbox 2');" /><br />
<input type="text" id="t3" name="t3" /><input type="button" id="b3" name="b3" value="button-three" onclick="alert('clicked enter on textbox 3');" /><br />
</form>
</body>
</html>
目に見えないデフォルトの送信アクションは合理的なアプローチであり、JavaScriptを方程式にドラッグしません。ただし、「display:none」のフォーム要素は一般的に信頼できません。私は、ページの左側に配置された、ページ上の他のボタンよりも前に絶対配置された送信ボタンを使用する傾向があります。それはまだかなり醜いですが、仕事を成し遂げます。
CSSを使ってみませんか?画面の表示領域の外側にある最初のボタン(デフォルトのボタン)を「位置:絶対;左:-200px;上:-200px;」で設定できます。私が覚えている限り、それは見えないわけではないので、どのブラウザでも無視されることはありません。これは問題なく機能します。
<form method="get">
<input type="text" name="something" value="blah"/>
<input type=submit name="desired" value="Save Earth"
style="position: absolute; left: -200px; top: -200px;"/>
...
<input type=submit name="something_else" value="Destroy Earth" />
...
<input id="foobar" type=submit name="desired" value="Save Earth" />
</form>
そして地球は救われる...
キーを押すイベントを制御するだけです。 onKeyPressをbodyタグに入れます
onkeypress=CheckKeyPress()
次に、Enterキーを処理します
function CheckKeyPress(){
var code;
if(!e) var e = window.event;
if(e.keyCode){
code = e.keyCode;
}else if(e.which){
code = e.which;
}
if(code == 13){
//Do Something
}
}
keydown
イベントをインターセプトせず、submit
イベントをインターセプトします。
そう:
form.onsubmit = function(e){
// Do stuff. Change the form's action or method maybe.
return true;
}
別々のフォームを使用するのはどうですか?多分私はこれを不可能にする何かが欠けています:P