Ajax设置变量不在不同的范围内工作

时间:2015-09-30 12:23:48

标签: javascript php jquery ajax scope

我正在尝试使用ajax调用设置js var。然后将var值输入到表单元素中。 它工作正常,直到我尝试使用var如下所示的方式。

我用来获取val的函数

function ajaxFetch(query) {
  var val;
  $.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
    val=data;
  });
  return val;
}

我将跳过crud.php代码,因为它适用于另一个脚本,它只查询MySQL,并回显值。

然后我调用点击

触发的ajaxFetch函数
$(document).on("click",".btnCall",function(){
  id=$(this).data("id")//gets an id from a data tag
  q1 = "SELECT NAME FROM user WHERE ID="+id;
  userName = ajaxFetch(q1);
  $("#form_userName").val(userName);
});

我无法理解,但我想这是一个范围问题,是以下

  1. 如果我按照方式显示,表格仍为空

  2. 如果我在点击触发器内进行直接ajax调用(不调用 功能),表单填写用户名。

  3. 如果我按照上面显示的方式做事,但是我在ajaxFetch函数中添加了一个“alert(val)”(我用这个来测试函数),警告会是 “未定义”但表单将填充值。

  4. 我以这种方式遇到了问题:我首先在“点击”事件中进行了ajax调用。然后我创建了ajaxFetch函数,因为会有几个调用。我为功能和“点击”事件添加了“警报”,因此我可以看到fetch是否正常工作。 我注意到的第一件事是第一个警报(在ajaxFetch中)是空的,但是click事件中的警告显示了值。

    提前致谢。对不起任何错误

    编辑 - 工作方式(使用不需要的提醒)

    function ajaxFetch(query) {
      var val;
      $.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
        val=data;
    
        alert(data);
    
      });
      return val;
    }
    
    $(document).on("click",".btnCall",function(){
      id=$(this).data("id")//gets an id from a data tag
      q1 = "SELECT NAME FROM user WHERE ID="+id;
      userName = ajaxFetch(q1);
    
      alert(userName)
    
      $("#form_userName").val(userName);
    });
    

    这样,表单值归档。第一个警报将显示空字符串,第二个警报将显示正确的值。

    最终编辑 - 处理Ajax请求

    function ajaxFetch(query) {
      var r;
      $.ajax({
        type:'POST',
        url:'/ajax/crud.php',
        async:false,
        data:{mode:"fetch",query:query},
         success: function(response){
           r=response;
         }
      });
      return r;
    }
    

    这种方式(添加选项“async:false”)var将仅在ajax完成请求时填充。不是真正的专业提示,但可以帮助其他初学者。

4 个答案:

答案 0 :(得分:0)

val退回到$.post这个喜欢此功能的功能中。

function ajaxFetch(query) {
  var val;
  $.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
    val=data;
    //return statement should be here and not out side the ajax function
    return val;
  });
}

}

答案 1 :(得分:0)

答案是您在返回时使用val undefinedval 您应该执行在回调函数中使用function ajaxFetch(query) { return $.post( "/ajax/crud.php",{mode:"fetch",query:query}); } //and where you call ajaxFetch() ajaxFetch().then(function(data) { val=data; //do something with val here }); 的所有逻辑,在其他情况下,您无法知道请求何时完成。我建议你使用它:

returnText = []
returnText = driver.execute_script("return  document.evaluate(\"//span[@class='tableNode']/text()[preceding-sibling::br and following-sibling::br]\", document, null, XPathResult.STRING_TYPE, null).stringValue;")

for item in returnText:
    print item

答案 2 :(得分:0)

您正在执行异步Ajax调用。因此,您必须按如下方式修改代码:

function ajaxFetch(query) {
    var val;
    $.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
            val=data;

            $("#form_userName").val(val); //set the value right in success handler of Ajax
     });

  }

    $(document).on("click",".btnCall",function(){
      id=$(this).data("id")//gets an id from a data tag
      q1 = "SELECT NAME FROM user WHERE ID="+id;
      ajaxFetch(q1); //just call the function; you don't know how much time Ajax will take to get back the result.

    });

答案 3 :(得分:0)

请尝试此代码

<PropertyGroup>
    <Win32Resource>assemblyWin32.res</Win32Resource>
</PropertyGroup>

因为它是异步的,所以使用回调函数