どこかに送信ボタンがあるフォームがあります。
ただし、送信イベントを何らかの形で「キャッチ」して、発生しないようにしたいと考えています。
これを行う方法はありますか?
送信ボタンはカスタムコントロールの一部であるため、変更できません。
どこかに送信ボタンがあるフォームがあります。
ただし、送信イベントを何らかの形で「キャッチ」して、発生しないようにしたいと考えています。
これを行う方法はありますか?
送信ボタンはカスタムコントロールの一部であるため、変更できません。
回答:
他の回答とは異なり、返品false
は回答の一部にすぎません。returnステートメントの前にJSエラーが発生するシナリオを考えてみましょう...
html
<form onsubmit="return mySubmitFunction(event)">
...
</form>
脚本
function mySubmitFunction()
{
someBug()
return false;
}
false
ここに戻ることは実行されず、フォームはいずれかの方法で送信されます。またpreventDefault
、Ajaxフォーム送信のデフォルトのフォームアクションを防ぐために呼び出す必要があります。
function mySubmitFunction(e) {
e.preventDefault();
someBug();
return false;
}
この場合、バグがあってもフォームは送信されません!
または、try...catch
ブロックを使用することもできます。
function mySubmit(e) {
e.preventDefault();
try {
someBug();
} catch (e) {
throw new Error(e.message);
}
return false;
}
false
から直接戻りませんonsumbit
か?
(<form onsubmit="return mySubmitFunction(evt)">)
それ以外の場合は、未定義のエラーが発生します。
onsubmit
このようなインラインイベントを使用できます
<form onsubmit="alert('stop submit'); return false;" >
または
<script>
function toSubmit(){
alert('I will not submit');
return false;
}
</script>
<form onsubmit="return toSubmit();" >
さて、これは大きなプロジェクトを作るときに良い考えではないかもしれません。イベントリスナーを使用する必要がある場合があります。
してくださいについての続きを読むイベント・リスナー(addEventListenerをとIEのattachEvent)VSインラインイベントここに。私はそれをクリス・ベイカーが説明した以上に説明できないからです。
どちらも正しいですが、どちらもそれ自体が「最良」ではなく、開発者が両方のアプローチを選択した理由がある可能性があります。
<form onsubmit="return false;" >
、私のために動作しません。
を使用してフォームにイベントリスナーをアタッチし.addEventListener()
、次に.preventDefault()
onメソッドを呼び出しますevent
。
const element = document.querySelector('form');
element.addEventListener('submit', event => {
event.preventDefault();
// actual logic, e.g. validate the form
console.log('Form submission cancelled.');
});
<form>
<button type="submit">Submit</button>
</form>
これは、Webページのロジックと構造を分離するため、submit
イベントハンドラーをonsubmit
属性にインラインで定義するよりも優れたソリューションだと思います。ロジックがHTMLから分離されているプロジェクトを維持する方がはるかに簡単です。参照:邪魔にならないJavaScript。
DOMオブジェクトの.onsubmit
プロパティを使用すると、form
1つの要素に複数の送信コールバックをアタッチできなくなるため、お勧めできません。addEventListenerとonclickを
参照してください。
$("button").click(function(e) { e.preventDefault() });
これをお試しください...
HTMLコード
<form class="submit">
<input type="text" name="text1"/>
<input type="text" name="text2"/>
<input type="submit" name="Submit" value="submit"/>
</form>
jQueryコード
$(function(){
$('.submit').on('submit', function(event){
event.preventDefault();
alert("Form Submission stopped.");
});
});
または
$(function(){
$('.submit').on('submit', function(event){
event.preventDefault();
event.stopPropagation();
alert("Form Submission prevented / stopped.");
});
});
stopPropagation
私の場合、うまくいったのはそれだけでした。ありがとう!:)
以下は現在のところ機能します(chromeとfirefoxでテスト済み):
<form onsubmit="event.preventDefault(); return validateMyForm();">
ここで、validateMyForm()は、false
検証が失敗した場合に返す関数です。重要なポイントは、名前を使用することですevent
。例えばに使用できませんe.preventDefault()
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
return false;
}
.onsubmit
複数のsubmit
コールバックをアタッチできないため、使用することは悪い考えだと思います。の使用をお勧めし.addEventListener()
ます。
控えめなJavaScriptプログラミング規則に従うため、およびDOMのロード速度に応じて、以下を使用することをお勧めします。
<form onsubmit="return false;"></form>
次に、ライブラリを使用している場合は、onloadまたはDOM readyを使用してイベントを関連付けます。
$(function() {
var $form = $('#my-form');
$form.removeAttr('onsubmit');
$form.submit(function(ev) {
// quick validation example...
$form.children('input[type="text"]').each(function(){
if($(this).val().length == 0) {
alert('You are missing a field');
ev.preventDefault();
}
});
});
});
label {
display: block;
}
#my-form > input[type="text"] {
background: cyan;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="my-form" action="http://google.com" method="GET" onsubmit="return false;">
<label>Your first name</label>
<input type="text" name="first-name"/>
<label>Your last name</label>
<input type="text" name="last-name" /> <br />
<input type="submit" />
</form>
また、NoScriptaction
などのプラグインを実行していると検証が失敗する可能性があるため、常に属性を使用します。action属性を使用している場合、少なくともユーザーは、バックエンドの検証に基づいてサーバーによってリダイレクトされます。window.location
一方、のようなものを使用している場合、状況は悪くなります。
eventListnerをフォームに追加できます。 preventDefault()
フォームデータをJSONに変換できます。
const formToJSON = elements => [].reduce.call(elements, (data, element) => {
data[element.name] = element.value;
return data;
}, {});
const handleFormSubmit = event => {
event.preventDefault();
const data = formToJSON(form.elements);
console.log(data);
// const odata = JSON.stringify(data, null, " ");
const jdata = JSON.stringify(data);
console.log(jdata);
(async () => {
const rawResponse = await fetch('/', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: jdata
});
const content = await rawResponse.json();
console.log(content);
})();
};
const form = document.forms['myForm'];
form.addEventListener('submit', handleFormSubmit);
<form id="myForm" action="/" method="post" accept-charset="utf-8">
<label>Checkbox:
<input type="checkbox" name="checkbox" value="on">
</label><br /><br />
<label>Number:
<input name="number" type="number" value="123" />
</label><br /><br />
<label>Password:
<input name="password" type="password" />
</label>
<br /><br />
<label for="radio">Type:
<label for="a">A
<input type="radio" name="radio" id="a" value="a" />
</label>
<label for="b">B
<input type="radio" name="radio" id="b" value="b" checked />
</label>
<label for="c">C
<input type="radio" name="radio" id="c" value="c" />
</label>
</label>
<br /><br />
<label>Textarea:
<textarea name="text_area" rows="10" cols="50">Write something here.</textarea>
</label>
<br /><br />
<label>Select:
<select name="select">
<option value="a">Value A</option>
<option value="b" selected>Value B</option>
<option value="c">Value C</option>
</select>
</label>
<br /><br />
<label>Submit:
<input type="submit" value="Login">
</label>
<br /><br />
</form>