我有一些表单,它在iframe中上传文件。我想保留它的提交,直到我检查它是否与ajax有效。我怎样才能做到这一点 ?我的代码暂停提交并返回验证结果(当前只是一个返回'result':'true'的虚函数)但是然后不执行'submit'操作。在获得响应200状态后显示响应数据需要~2秒是否正常?
这是我的html:
<div id="message" style="background:black; width:400px; height:80px; display:none; color:white;">
</div>
<h1>Submit</h1>
<form action="{{upload_url}}" target="upload_target" method="POST" id="file_upload_form" enctype="multipart/form-data">
{% render_upload_data upload_data %}
<table>{{ form }}</table>
<p>
<input type="hidden" maxlength="64" name="myfileid" value="{{ myfileid }}" >
</p>
<p>
<input type="submit" id="file_upload_submit" value="Submit" />
</p>
<iframe id="upload_target" name="upload_target" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>
JS:
$(function() {
$('#file_upload_submit').click(function(e){
e.preventDefault();
var fileUploadForm = document.getElementById('file_upload_form');
$.ajax({
type: "POST",
url: '/artifact/upload/check-form/',
data: 'foo=bar',
dataType: "json",
success: function(data){
if(data['result'] == "true"){
$("#message").show();
$("#message").fadeIn(400).html('<span>'+data["message"]+'</span>');
setTimeout(function(){
$("#message").fadeOut("slow", function () {
$("#message").hide();
});
}, 1500);
$('#file_upload_form').attr('target','upload_target').submit(function(){
alert('Handler for .submit() called.');
return false;
});
}
else{
$("#message").show();
$("#message").fadeIn(400).html('<span">'+data["message"]+'</span>');
setTimeout(function(){
$("#message").fadeOut("slow", function () {
$("#message").hide();
});
}, 1500);
return false;
}
}
});
return false;
});
});
</script>
和链接: http://ntt.vipserv.org/artifact/
修改
使用下面的代码我能够执行验证,然后当它的结果是肯定的形式提交。现在,如果我对表单进行硬编码,我的警报就不会显示,而且我很确定上传没有被执行(不幸的是,上传列表每8小时刷新一次,如果它在一段时间内有效,我会知道)。如果未指定target,则使用重定向上载文件,以便省略整个“submit”事件侦听器。
<script>
$('#fake_upload_submit').click(function(e){
e.preventDefault();
var fileUploadForm = document.getElementById('file_upload_form');
fileUploadForm.addEventListener("submit", function() {
alert("sent in iframe");
fileUploadForm.target = 'upload_target';
}, false);
$.ajax({
type: "POST",
url: '/artifact/upload/check-form/',
data: 'foo=bar',
dataType: "json",
success: function(data){
if(data['result'] == "true"){
$("#message").show();
$("#message").fadeIn(400).html('<span>'+data["message"]+'</span>');
setTimeout(function(){
$("#message").fadeOut("slow", function () {
$("#message").hide();
});
}, 1500);
fileUploadForm.submit();
}
else{
$("#message").show();
$("#message").fadeIn(400).html('<span">Response false</span>');
setTimeout(function(){
$("#message").fadeOut("slow", function () {
$("#message").hide();
});
}, 1500);
return false;
}
}
});
return false;
});
</script>
HTML:
<div id="message" style="background:black; width:400px; height:80px; display:none; color:white;">
</div>
<h1>Submit</h1>
<form action="{{upload_url}}" method="POST" target="" id="file_upload_form" enctype="multipart/form-data">
{% render_upload_data upload_data %}
<table>{{ form }}</table>
<p>
<input type="hidden" maxlength="64" name="myfileid" value="{{ myfileid }}" >
</p>
<p>
<input type="submit" style="display:none" id="true_upload_submit" value="Submit" />
</p>
<iframe id="upload_target" name="upload_target" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>
<p>
<input type="submit" id="fake_upload_submit" value="Submit" />
</p>
答案 0 :(得分:1)
验证后,您注册了一个新的提交事件处理程序,但没有提交表单的内容,因此您必须再次单击该按钮才能将其提交。
您只需提交表单,而不是添加提交处理程序:
$('#file_upload_form').attr('target','upload_target').submit();
答案 1 :(得分:0)
我在想你可能会过度思考表单的提交,但我也可能会读错了。我也可能没有所有的事实。通过ajax调用提交表单并返回提交结果(验证失败或成功)不是更好吗?
伪代码:
jQuery的:
var formData = data;
ajax(formData);
表格处理:
if(valid) {
submit(formData);
return true;
} else {
return false;
}
如果需要,我可以提供真实的代码。
答案 2 :(得分:0)
如果你使用同步XHR而不是异步,那对你来说可能是最简单的(如果你的用户可能更烦人)。
或者,使用JavaScript拦截表单提交,如果服务器端验证成功,则使用XHR提交表单。
答案 3 :(得分:0)
如何完全避免这个问题,有一个隐藏的提交按钮来提交表单,并有一个可见的按钮开始验证,如果没关系,那么它会点击正确的隐藏提交按钮?
答案 4 :(得分:0)
Guffa is correct。我相信以下更改将使第一个脚本工作。改变
$('#file_upload_form').attr('target','upload_target').submit(function(){
alert('Handler for .submit() called.');
return false;
});
到
$('#file_upload_form').attr('target','upload_target').submit();
这是你的调试破坏了提交。如果要保持调试,请将代码更改为:
$('#file_upload_form').attr('target','upload_target').submit(function(){
alert('Handler for .submit() called.');
return true;
}).submit();
您必须自行调用submit()
才能触发提交事件。如果提交函数返回false
,则它将无法继续,因此您必须让它返回true
。
这是您发布的此问题的第三个版本。我同意其他人的观点,即您可能会以过于复杂的方式解决您的问题。在这种情况下,您可能希望完全避免使用JavaScript并进行简单的HTML发布。有没有令人信服的理由说明这不是一个选择?