Web サイトで調査を行っていますが、ユーザーが Enter キーを押して (理由はわかりません)、送信ボタンをクリックせずに誤って調査 (フォーム) を送信してしまうという問題があるようです。これを防ぐ方法はありますか?
調査では HTML、PHP 5.2.9、および jQuery を使用しています。
Web サイトで調査を行っていますが、ユーザーが Enter キーを押して (理由はわかりません)、送信ボタンをクリックせずに誤って調査 (フォーム) を送信してしまうという問題があるようです。これを防ぐ方法はありますか?
調査では HTML、PHP 5.2.9、および jQuery を使用しています。
次のような方法を使用できます。
$(document).ready(function() {
$(window).keydown(function(event){
if(event.keyCode == 13) {
event.preventDefault();
return false;
}
});
});
元の投稿のコメントを読んで、それをより使いやすくし、Enterすべてのフィールドを完了した場合に人々が押すことができるようにするために:
function validationFunction() {
$('input').each(function() {
...
}
if(good) {
return true;
}
return false;
}
$(document).ready(function() {
$(window).keydown(function(event){
if( (event.keyCode == 13) && (validationFunction() == false) ) {
event.preventDefault();
return false;
}
});
});
フォームが送信されないようにするために、キーを押すことに関連する 3 つのイベントすべてをキャッチする必要がありました。
var preventSubmit = function(event) {
if(event.keyCode == 13) {
console.log("caught ya!");
event.preventDefault();
//event.stopPropagation();
return false;
}
}
$("#search").keypress(preventSubmit);
$("#search").keydown(preventSubmit);
$("#search").keyup(preventSubmit);
上記のすべてを組み合わせて、コンパクトなバージョンにすることができます。
$('#search').bind('keypress keydown keyup', function(e){
if(e.keyCode == 13) { e.preventDefault(); }
});
使用する:
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
if(e.keyCode == 13) {
e.preventDefault();
return false;
}
});
このソリューションは、Web サイトのすべてのフォーム (Ajax で挿入されたフォームも含む) でEnter機能し、入力テキストの s のみを防止します。ドキュメント準備機能に配置して、この問題を一生忘れてください。
不自然に思えるかもしれませんが、ユーザーが を押さないようにする代わりにEnter、フォームをそのままにして、クライアント側の検証を追加することができます:フォームを完了するために完了する必要があるもの。jQuery を使用している場合は、検証プラグインを試してください。
http://docs.jquery.com/Plugins/Validation
これには、ボタンをキャッチするよりも多くの作業が必要になりEnterますが、ユーザー エクスペリエンスがより豊かになることは間違いありません。
素敵なシンプルな小さなjQueryソリューション:
$("form").bind("keypress", function (e) {
if (e.keyCode == 13) {
return false;
}
});
フォームに「javascript:void(0);」のアクションを与える トリックを行うようです
<form action="javascript:void(0);">
<input type="text" />
</form>
<script>
$(document).ready(function() {
$(window).keydown(function(event){
if(event.keyCode == 13) {
alert('Hello');
}
});
});
</script>
すべての回答で十分にカバーされていると思いますが、JavaScript 検証コードを含むボタンを使用している場合は、フォームの onkeypress を Enter に設定して、送信を期待どおりに呼び出すことができます。
<form method="POST" action="..." onkeypress="if(event.keyCode == 13) mySubmitFunction(this); return false;">
onkeypress JS は、あなたがする必要があるものなら何でもかまいません。大規模なグローバルな変更は必要ありません。これは、アプリをゼロからコーディングしたのではなく、他の人の Web サイトを分解して再テストせずに修正することになった場合に特に当てはまります。
「ajax テキストフィールド」(Yii CGridView) と送信ボタンが 1 つだけのグリッドがある、同様の問題がありました。テキストフィールドで検索を行い、送信されたフォームを入力するたびに。ビュー間の唯一の共通ボタン (MVC パターン) だったので、ボタンで何かをしなければなりませんでした。私がしなければならなかったのは、取り外しtype="submit"
て置くことだけでしたonclick="document.forms[0].submit()
ページ上の要素をタブで移動Enterし、送信ボタンに到達したときに押すと、フォームの onsubmit ハンドラーがトリガーされますが、イベントは MouseEvent として記録されます。ほとんどのベースをカバーする私の短い解決策は次のとおりです。
これはjQuery関連の回答ではありません
<form onsubmit="return false;" method=post>
<input type="text" /><br />
<input type="button" onclick="this.form.submit()" value="submit via mouse or keyboard" />
<input type="button" onclick="submitMouseOnly(event)" value="submit via mouse only" />
</form>
window.submitMouseOnly=function(evt){
let allow=(evt instanceof MouseEvent) && evt.x>0 && evt.y>0 && evt.screenX > 0 && evt.screenY > 0;
if(allow)(evt.tagName=='FORM'?evt.target:evt.target.form).submit();
}
実際の例を見つけるには: https://jsfiddle.net/nemesarial/6rhogva2/
私の特定のケースでは、ENTER によるフォームの送信を停止し、送信ボタンのクリックをシミュレートする必要がありました。これは、モーダル ウィンドウ (古いコードを継承) 内にいたため、送信ボタンにクリック ハンドラーがあったためです。いずれにせよ、この場合の私のコンボソリューションは次のとおりです。
$('input,select').keypress(function(event) {
// detect ENTER key
if (event.keyCode == 13) {
// simulate submit button click
$("#btn-submit").click();
// stop form from submitting via ENTER key press
event.preventDefault ? event.preventDefault() : event.returnValue = false;
}
});
この使用例は、IE8 を使用しているユーザーに特に役立ちます。
これは私のために働く
jQuery.each($("#your_form_id").find('input'), function(){
$(this).bind('keypress keydown keyup', function(e){
if(e.keyCode == 13) { e.preventDefault(); }
});
});
Alpine を使用している場合は、以下を使用して、 を押してフォームの送信を防ぐことができますEnter。
<div x-data>
<form x-on:keydown.prevent.enter="">...</form>
</div>
または、修飾子を使用して、要素ではなく、ページ.window
のルート オブジェクトにイベント リスナーを登録することもできます。window
<form>
<div x-data>
<input x-on:keydown.window.prevent.enter="" type="text">
</div>
</form>
使用する:
// Validate your form using the jQuery onsubmit function... It'll really work...
$(document).ready(function(){
$(#form).submit(e){
e.preventDefault();
if(validation())
document.form1.submit();
});
});
function validation()
{
// Your form checking goes here.
}
<form id='form1' method='POST' action=''>
// Your form data
</form>