【问题标题】:Ajax setting variable not working in different scopesAjax 设置变量在不同范围内不起作用
【发布时间】:2015-12-28 05:38:09
【问题描述】:

我正在尝试使用 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. 1234563 “未定义”,但表单将填充该值。

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

提前致谢。如有错误请见谅

编辑 - 工作方式(使用不需要的警报)

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 完成它的请求时被填充。不是真正的专业提示,但可能对其他初学者有所帮助。

【问题讨论】:

  • 问题是当 ajax 没有完成请求时我试图设置一个 var。在我的 ajax 请求中使用选项“async:false”解决了这个问题。

标签: javascript php jquery ajax scope


【解决方案1】:

$.post 函数中返回 val 喜欢这个。

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;
  });
}

}

【讨论】:

  • 有道理,谢谢,但没有解决我的问题...我仍然得到未定义的值...我编辑了这个问题,所以也许它提供了更多关于正在发生的事情的线索。跨度>
【解决方案2】:

答案是您在退货时使用val,即undefined。 您应该在回调函数中执行所有使用val 的逻辑,否则您将无法知道请求何时完成。我建议你像这样使用它:

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
});

【讨论】:

  • 谢谢,朋友,我认为这是要走的路。我无法理解的是,如果我使用“警报”功能,为什么它会起作用......你能向我解释一下吗?此外,如果我在 ajaxFetch 函数中放置一个 alert(val),并在另一个调用它的地方(在“click”事件中),第一个警报将为空,第二个将填充值..
  • 抱歉在测试前回答...您提供的解决方案返回一个对象,而不是一个值。
【解决方案3】:

您正在执行异步 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.

    });

【讨论】:

  • 感谢您的意见。我在这个问题上没有提到的是这个例程将用于返回大约 6 个字段,这就是为什么我试图创建一个应该提供正确查询的函数,以返回我需要的字段无论如何我认为一种解决方案是将元素的 ID 与查询一起传递给函数,这样我就可以为所有字段调用相同的函数。像这样function ajaxFetch(query,id){ $.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) { $(id).val(data); }); }
  • 唯一的问题是必须处理某些值:某些日期值必须本地化,就像某些货币值一样。因此,也许我必须将另一个参数传递给函数并执行切换,以针对接收到的值的类型进行正确的转换...
【解决方案4】:

请试试这个代码

var val,id,q1,userName;
function returnData(param)
{
   $("#form_userName").val(param);
}
function ajaxFetch(query, callback)
{
  var x = $.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
    callback(data);
  })
}
$(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,returnData);
    }
);

由于是异步的,所以使用回调函数

【讨论】:

  • 我认为对我来说 2 个函数效果最好,因为在 1 次单击“.btnCall”时,我实际上需要它来填充 aprox。 6个字段。 (姓名,出生日期,地址......)它用于更新人员记录。但我理解你所做的方式对于我给出的例子来说效果很好。谢谢
  • 我认为一种解决方法是创建一个接收 3 个参数的函数:查询、模式参数,它将告诉值可能需要的任何处理(货币值和日期的本地化)和id 到将接收处理值的元素。无论如何,我尝试了这样的方法,结果是相同的:即使我知道它已定义(使用“警报”进行测试),val 仍返回“未定义”。正如我之前提到的,如果我在函数本身上使用一个警报,在事件上使用另一个警报,则将定义 val,但在第二个警报上。对我来说仍然是个谜。
  • 感谢 Basil 努力提供帮助。我弄清楚发生了什么:这是一个同步问题。我试图在 Ajax 尚未完成请求时为 var 设置一个值。我通过在我的 Ajax 请求中包含“async:false”选项解决了这个问题。我真的是ajax的新手,所以我无法及早弄清楚。因此,当我使用 2 或 3 个警报来显示 var 的值时,请求有时间完成。无论如何,再次感谢。
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 2021-06-23
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
相关资源
最近更新 更多