Javascript 如何为表单';返回布尔值;s";onsubmit“;属性,这取决于ajax调用的成功与否?

Javascript 如何为表单';返回布尔值;s";onsubmit“;属性,这取决于ajax调用的成功与否?,javascript,jquery,html,ajax,forms,Javascript,Jquery,Html,Ajax,Forms,如果我的表格定义如下: <form action="myAction" method="post" id="input" target="_parent" onsubmit="doThis();"> 我期望的是,如果ajax调用成功,onSuccess将把result设置为true,然后doThis将返回true,表单将提交。然而,这并没有发生。事实上,什么都没有发生 我的怀疑是,由于ajax调用是异步的,doThis在ajax事务完成之前已经返回了一个值(false),因

如果我的表格定义如下:

    <form action="myAction" method="post" id="input" target="_parent" onsubmit="doThis();">
我期望的是,如果ajax调用成功,onSuccess将把result设置为true,然后doThis将返回true,表单将提交。然而,这并没有发生。事实上,什么都没有发生

我的怀疑是,由于ajax调用是异步的,doThis在ajax事务完成之前已经返回了一个值(false),因此返回值总是false。如果是这种情况,我如何修改代码,使其根据ajax调用是否成功返回true或false

我想我可以将async设置为false,但我一直在读回调是一种比“async:false”更好的编码方式,所以我想知道解决这个问题的最佳方案是什么

编辑:

我已在onError和onSuccess函数中添加了以下警报:

function onError(e, msg, error) {
    alert(e+" - "+msg+" - "+error);
    result = false;
}

function onSuccess(res) {
    alert("success");
    result = true;
}

运行我的代码确认逻辑在成功时通过。

成功是一个AJAX事件,在AJAX完成后触发。所以,你所期望的是正确的。尝试向代码中添加一些警报,以查看每个函数返回的内容。比如:

函数成功(res){
//如果成功,就做些事情
警报(“Ajax成功”);
结果=真;
}
  • 删除“onsubmit”属性

  • r您确定ajax请求返回成功并转到函数onSuccess(res)?
    您应该添加警报以了解代码的去向。可能是它的错误:函数(e,msg,error)。提醒msg说了什么错误?

    如果可能的话,我建议你可以去。而不是调用jquery ajax调用 您可以调用该插件提供的
    ajaxForm
    ajaxSubmit
    函数。您可以像使用ajax调用一样使用这两个函数,并且它还支持
    success
    或error
    callback
    函数

    样本使用

    $('#input').ajaxForm({
        url:        myUrl , 
        success : function(response) {
           // handle success
        },
        error : function() {
           // handle error
        }
    }); 
    

    我更新了OP以获取有关警报的信息。警报确认代码确实通过了onSuccess()。请尝试重新分配结果值:result=onSuccess(res);这不就是调用onSuccess吗?不管ajax是否成功,它都会自动将结果设置为true?如果ajax成功,则result设置为true。调用onSuccess()后通知结果,以确切了解结果是什么,可能您应该在调用onSuccess()后返回结果java脚本正在逐步运行,因此在onSuccess()中赋值后您应该返回结果我更新了OP以获取有关通知的信息。警报确认代码确实通过onSuccess()。但是表单仍然没有做任何事情,也没有提交。你的意思是它不会提交给myAction吗?谢谢你的建议,但是我不能像那样使用插件。如果有一种方法可以让网页在没有插件的情况下按照我想要的方式运行,那将是非常感谢的。不幸的是,当我这样做时,提交循环,因为我已经在表单的onsubmit属性中调用了doThis()。。。所以这个()最终会被递归调用。@heisenbergman嗯,欲速则不达。我明白你的意思。在这种情况下,设置“async:false”只能解决您在问题中描述的问题,因为调用必须是顺序的。即,只有在最终用户启动表单提交时才能进行ajax调用,并且只有在ajax调用成功时才能进行表单提交。。。我今天刚刚了解到jsonp事务本质上是异步的。您无法将jsonp设置为同步事务处理:(@heisenbergman,更新为带有新建议的答案。由于大多数html元素都支持onclick属性,我想这应该可以解决您的问题
    $('#input').ajaxForm({
        url:        myUrl , 
        success : function(response) {
           // handle success
        },
        error : function() {
           // handle error
        }
    });