如果我的表格定义如下:
<form action="myAction" method="post" id="input" target="_parent" onsubmit="doThis();">
和doThis()是以下脚本的一部分:
var result = false;
function doThis() {
var myUrl = 'http://somewebsite.com/SomeWebservice/Webservice?args1=AAA&callback=?';
var status = false;
$.ajax({
url : myUrl,
type : 'get',
dataType : 'jsonp',
success : function(res) {
onSuccess(res);
},
error : function(e, msg, error) {
onError(e, msg, error);
}
});
return result;
}
function onError(e, msg, error) {
// do stuff if error
result = false;
}
function onSuccess(res) {
// do stuff if successful
result = true;
}
我期待的是,如果ajax调用成功,onSuccess会将结果设置为true,那么doThis将返回true并且表单将提交。但是,这不会发生。事实上,没有任何事情发生。
我怀疑是因为ajax调用是异步的,所以doThis在ajax事务完成之前已经返回一个值(false),因此返回始终为false。如果是这种情况,我如何修改我的代码,使其返回true或false,具体取决于ajax调用是否成功?
我认为我可以将异步设置为false,但我继续阅读回调是一种更好的编码方式,而不是做&#34; async:false&#34; ---所以我想知道最好的解决办法是什么。
修改
我已在onError和onSuccess函数中添加以下警报:
function onError(e, msg, error) {
alert(e+" - "+msg+" - "+error);
result = false;
}
function onSuccess(res) {
alert("success");
result = true;
}
运行我的代码确认逻辑通过onSuccess。
答案 0 :(得分:0)
成功是在AJAX完成http://api.jquery.com/Ajax_Events/之后触发的AJAX事件。所以,你期待的是正确的。尝试在代码中添加一些警报,以查看每个函数返回的内容。喜欢:
function onSuccess(res) {
// do stuff if successful
alert('Ajax success');
result = true;
}
&#13;
答案 1 :(得分:0)
<form action="myAction" method="post" id="input" target="_parent">
&#13;
而是使用&#39; onclick&#39;属性。让我们说你的表单是通过按钮或html元素提交的。 拨打$(&#39; .YourFormSubmitElement&#39;)。onclick(&#39; doThis&#39;)。请注意,如果您有多个表单提交元素,则使用类选择器else,如果它是一个使用id选择器。
使用以下功能提交表单。
function doThis() {
var myUrl = 'http://somewebsite.com/SomeWebservice/Webservice?args1=AAA&callback=?';
$.ajax({
url : myUrl,
type : 'get',
dataType : 'jsonp',
success : function(res) {
$('#input').submit();
}
});
}
&#13;
我认为这应该可以解决您的问题。
答案 2 :(得分:0)
你确定ajax请求返回成功并转到onSuccess(res)函数吗? 你应该添加警报以了解代码的去向。可能是它出错:函数(e,msg,错误)。警告msg说什么错误?
答案 3 :(得分:0)
我建议你尽可能去Jquery Form Plugin。而不是调用jquery ajax调用
您可以调用该插件提供的ajaxForm
或ajaxSubmit
函数。您可以像调用ajax一样使用这两个函数,它也支持success
或错误callback
函数
样本用法
$('#input').ajaxForm({
url: myUrl ,
success : function(response) {
// handle success
},
error : function() {
// handle error
}
});