如何为表单" onsubmit"返回布尔值?属性取决于ajax调用的成功或错误?

时间:2014-11-10 03:37:15

标签: javascript jquery html ajax forms

如果我的表格定义如下:

    <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。

4 个答案:

答案 0 :(得分:0)

成功是在AJAX完成http://api.jquery.com/Ajax_Events/之后触发的AJAX事件。所以,你期待的是正确的。尝试在代码中添加一些警报,以查看每个函数返回的内容。喜欢:

&#13;
&#13;
  function onSuccess(res) {
// do stuff if successful
alert('Ajax success');
result = true;
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

  1. 删除&#39; onsubmit&#39;属性。
  2. &#13;
    &#13;
    <form action="myAction" method="post" id="input" target="_parent">
    &#13;
    &#13;
    &#13;

    1. 而是使用&#39; onclick&#39;属性。让我们说你的表单是通过按钮或html元素提交的。 拨打$(&#39; .YourFormSubmitElement&#39;)。onclick(&#39; doThis&#39;)。请注意,如果您有多个表单提交元素,则使用类选择器else,如果它是一个使用id选择器。

      使用以下功能提交表单。

    2. &#13;
      &#13;
        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;
      &#13;
      &#13;

      我认为这应该可以解决您的问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我建议你尽可能去Jquery Form Plugin。而不是调用jquery ajax调用 您可以调用该插件提供的ajaxFormajaxSubmit函数。您可以像调用ajax一样使用这两个函数,它也支持success或错误callback函数

样本用法

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