我有一个表单,提交时需要进行一些额外的处理才能提交表单。我可以阻止默认的表单提交行为,然后进行额外的处理(基本上是调用Google Maps API并向表单添加一些隐藏字段),然后我需要提交表单。
有没有一种方法可以“阻止默认”,然后在某个时间点“继续默认”?
我有一个表单,提交时需要进行一些额外的处理才能提交表单。我可以阻止默认的表单提交行为,然后进行额外的处理(基本上是调用Google Maps API并向表单添加一些隐藏字段),然后我需要提交表单。
有没有一种方法可以“阻止默认”,然后在某个时间点“继续默认”?
使用jQuery.one()
为元素附加一个事件处理程序。每个元素每个事件类型最多执行一次该处理程序。
$('form').one('submit', function(e) {
e.preventDefault();
// do your things ...
// and when you done:
$(this).submit();
});
使用one
还可以防止无限循环,因为这个自定义的submit
事件在第一次提交后就被解除了。
$(this).unbind(); $(this).submit();
- Robby Alvian Jaya Mulia当你将 .submit()
事件绑定到表单并在返回(true)之前完成所需操作时,实际提交之前会发生这些操作。
例如:
$('form').submit(function(){
alert('I do something before the actual submission');
return true;
});
jquery.com上的另一个例子:http://api.jquery.com/submit/#entry-examples
我只会这样做:
$('#submiteButtonID').click(function(e){
e.preventDefault();
//do your stuff.
$('#formId').submit();
});
如果你只需要提交表单,那么首先使用 preventDefault
函数,然后再使用 submit()
函数。
e.preventDefault()
,因为您只是阻止按钮上的其他处理程序的执行,而不是表单的执行。 - gyo $('#myform').on('submit',function(event){
// block form submit event
event.preventDefault();
// Do some stuff here
...
// Continue the form submit
event.currentTarget.submit();
});
event.target.submit()
。 - Niels Lucastarget
或currentTarget
)。 - ThePhi使用这种方式会在JS中造成无限循环。 为了更好的实现,您可以使用以下方法:
var on_submit_function = function(evt){
evt.preventDefault(); //The form wouln't be submitted Yet.
(...yourcode...)
$(this).off('submit', on_submit_function); //It will remove this handle and will submit the form again if it's all ok.
$(this).submit();
}
$('form').on('submit', on_submit_function); //Registering on submit.
希望这能有所帮助!谢谢!
在我看来,这是最通用和健壮的解决方案(如果您的操作是由用户触发的,例如“用户单击按钮”):
例如,请注意这个优雅的解决方案,它可以通过修饰按钮属性来为任何按钮添加“您确定吗?”弹出窗口。如果用户没有选择退出,我们将有条件地继续默认行为。
1. 让我们为每个需要警告文本的“是否确定”的弹出窗口按钮添加:
<button class="btn btn-success-outline float-right" type="submit" ays_text="You will lose any unsaved changes... Do you want to continue?" >Do something dangerous</button>
2. 给所有这样的按钮附加处理程序:
$('button[ays_text]').click(function (e, from) {
if (from == null) { // user clicked it!
var btn = $(this);
e.preventDefault();
if (confirm() == true) {
btn.trigger('click', ['your-app-name-here-or-anything-that-is-not-null']);
}
}
// otherwise - do nothing, ie continue default
});
就是这样。
jQuery
和对@Joepreludian的答案稍作修改:.one(...)
而不是 .on(...) 或 .submit(...)
命名函数
而不是 匿名函数
,因为我们将在 回调函数
中引用它。$('form#my-form').one('submit', function myFormSubmitCallback(evt) {
evt.stopPropagation();
evt.preventDefault();
var $this = $(this);
if (allIsWell) {
$this.submit(); // submit the form and it will not re-enter the callback because we have worked with .one(...)
} else {
$this.one('submit', myFormSubmitCallback); // lets get into the callback 'one' more time...
}
});
allIsWell
变量的值为true
或false
,以测试功能:
$('form#my-form').one('submit', function myFormSubmitCallback(evt){
evt.stopPropagation();
evt.preventDefault();
var $this = $(this);
var allIsWell = $('#allIsWell').get(0).checked;
if(allIsWell) {
$this.submit();
} else {
$this.one('submit', myFormSubmitCallback);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/" id="my-form">
<input name="./fname" value="John" />
<input name="./lname" value="Smith" />
<input type="submit" value="Lets Do This!" />
<br>
<label>
<input type="checkbox" value="true" id="allIsWell" />
All Is Well
</label>
</form>
祝你好运...
stopPropagation
吗?另外,你可以创建一个无名称函数(删除 myFormSubmitCallback
)。 - Melroy van den Berg"无需提交循环的验证注入":
我只想在HTML5验证之前检查reCaptcha和其他一些内容,所以我做了如下操作(验证函数返回true或false):
$(document).ready(function(){
var application_form = $('form#application-form');
application_form.on('submit',function(e){
if(application_form_extra_validation()===true){
return true;
}
e.preventDefault();
});
});
通过纯Javascript的方式,在防止默认行为后,可以提交表单。
这是因为HTMLFormElement.submit()
从不调用onSubmit()
。因此,在此处,我们依靠该规范奇怪性质来提交表单,就好像它没有自定义的onsubmit处理程序一样。
var submitHandler = (event) => {
event.preventDefault()
console.log('You should only see this once')
document.getElementById('formId').submit()
}
查看这个示例以了解同步请求。
等待异步请求完成同样很容易:
var submitHandler = (event) => {
event.preventDefault()
console.log('before')
setTimeout(function() {
console.log('done')
document.getElementById('formId').submit()
}, 1400);
console.log('after')
}
您可以查看我的示例fiddle,了解有关异步请求的内容。
如果您喜欢使用promises:
var submitHandler = (event) => {
event.preventDefault()
console.log('Before')
new Promise((res, rej) => {
setTimeout(function() {
console.log('done')
res()
}, 1400);
}).then(() => {
document.getElementById('bob').submit()
})
console.log('After')
}
这里有一个关于IT技术的请求。
e.preventDefault()
来停止当前操作。$("#form").submit();
。 $('#form').submit(function (e)
{
return !!e.submit;
});
if(blabla...)
{...
}
else
{
$('#form').submit(
{
submit: true
});
}