我有一个表单,其中某处有一个提交按钮。
但是,我想以某种方式“捕获”提交事件并防止它发生。
有什么办法可以做到吗?
我无法修改“提交”按钮,因为它是自定义控件的一部分。
我有一个表单,其中某处有一个提交按钮。
但是,我想以某种方式“捕获”提交事件并防止它发生。
有什么办法可以做到吗?
我无法修改“提交”按钮,因为它是自定义控件的一部分。
Answers:
与其他答案不同,返回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)的更多信息。因为我无法像克里斯·贝克那样解释它。
两种方法都是正确的,但是它们本身都不是“最佳”的,并且开发人员选择使用这两种方法可能是有原因的。
<form onsubmit="return false;" >
对我不起作用。
使用将事件侦听器附加到表单.addEventListener()
,然后在.preventDefault()
上调用方法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>
我认为这比定义submit
与onsubmit
属性内联的事件处理程序更好,因为它可以将网页逻辑和结构分开。维护逻辑与HTML分离的项目要容易得多。请参阅:简洁的JavaScript。
使用DOM对象的.onsubmit
属性form
不是一个好主意,因为它阻止您将多个提交回调附加到一个元素。请参见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准备好连接事件。
$(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>
另外,我将始终使用该action
属性,因为某些人可能会运行某些插件(如NoScript),这会破坏验证。如果您使用的是action属性,那么服务器至少会基于后端验证来重定向您的用户。window.location
另一方面,如果您使用,则情况会很糟糕。
为了防止表单提交,您只需要这样做。
<form onsubmit="event.preventDefault()">
.....
</form>
通过使用以上代码,这将阻止您提交表单。
这是我的回答:
<form onsubmit="event.preventDefault();searchOrder(event);">
...
</form>
<script>
const searchOrder = e => {
e.preventDefault();
const name = e.target.name.value;
renderSearching();
return false;
}
</script>
我想补充event.preventDefault();
的onsubmit
和它的作品。
您可以将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>