无法访问jQuery $ .post中的变量

时间:2013-12-11 16:17:40

标签: javascript jquery scoping

我经历了很多关于此的帖子,但没有找到适合我的任何解决方案 - 清理代码:

  $('#form-new').submit(function(e){
    e.preventDefault();

    $curForm = $(this);
    $textbox = $( '.new-box' ,this);

    window.tmp_input_ok = false;

    var wasError = false;
    if( $.trim($textbox.val()) == "" ){  
      wasError = true; 
    }    

    if( wasError ){
      //possible message
    } else{

      var jqxhr = $.post(
        $(this).attr('action'),
        $(this).serialize(),
        function(data, textStatus, jqXHR){

          if( data=="200" ){
            console.log('post OK'); //this shows in console!
            window.tmp_input_ok = true;  
          } else{
            console.log('not OK');       
          } 

        }
      ).fail(function() {
        console.log('POST fail)');
      });    

    }

    //however, window.tmp_input_ok is false here so the textbox does not empty:
    if(window.tmp_input_ok == true) $textbox.val(''); 
      else console.log('input not ok :('); //and this is outputted to console

  }); 

原来,只有var tmp_input_ok = false初始化,然后使用tmp_input_ok变量,但它没有工作,所以我尝试了全局窗口...也不起作用...我开始绝望。

2 个答案:

答案 0 :(得分:2)

您的if语句在通话结束前执行。

$.post是异步调用,其余代码在帖子处理时继续

您已使用.fail(),如果您想在完成时始终执行.always()语句,可以添加if,或者如果您只想要.success(),则可以添加if (wasError) { //possible message } else { var jqxhr = $.post($(this).attr('action'), $(this).serialize(), function (data, textStatus, jqXHR) { if (data == "200") { console.log('post OK'); //this shows in console! window.tmp_input_ok = true; } else { console.log('not OK'); } // either add it here if you only want to process it on success if (window.tmp_input_ok == true) $textbox.val(''); else console.log('input not ok :('); }).fail(function () { console.log('POST fail)'); }).always(function(){ // or add it here if you always wan to execute on completion regardless of fail or success if (window.tmp_input_ok == true) $textbox.val(''); else console.log('input not ok :('); }); } 在通话成功时检查它,类似于:

{{1}}

答案 1 :(得分:1)

您的XHR请求具有onSuccess回调的原因是因为该调用是异步的。

以这个简单的代码为例:

$.get(
    '/foo',
    function(){
        alert("data received");
    }
)

alert ("End of script reached");

成功回调设置为在成功接收请求时将调用的内容,而不是在浏览器读取该行代码时。

通常,您会在“收到数据”警报之前看到“已达到脚本结束”警报,因为完整的XHR请求将花费超过100毫秒,而读取这几行将只占其中的一小部分。

必须通过回调调用依赖于对状态的响应的代码。有很多方法可以让我详细说明。