【问题标题】:Variable scope question in my jQuery我的 jQuery 中的可变范围问题
【发布时间】:2011-08-23 23:38:52
【问题描述】:

在从后端 PHP 脚本将变量作为二维 JSON 数组检索后,我的变量范围出现问题。这是我的代码:

var qns, qis, ncs, nzs, tps;

function get_questions() {
    var url = "php/pytania.php";
    $.ajax({
        cache: false,
        type: "GET",
        dataType: "text",
        url: url,
        success: function(response) {
            data = jQuery.parseJSON(response);
            qns = data.qns;
            qis = data.qis;
            ncs = data.ncs;
            nzs = data.nzs;
            tps = data.tps;
        }
    });
}

$(document).ready(function() {
    var index = 0;
    get_questions();
    $("#question_no").text(qns[index]);
});

当我最后尝试引用我的 qns 数组时,它显示一个变量未定义错误。但是它在 ajax 语句中有效 - 没有问题...

谢谢,保重! :)

彼得。

【问题讨论】:

    标签: jquery ajax arrays variables scope


    【解决方案1】:

    问题是成功方法被异步调用 - 这意味着在您调用 $().ajax 并尝试引用该变量后,它尚未被分配,因为尚未执行成功回调方法。

    这可以通过将 async 选项设置为 false 来解决,如下所示:

    $.ajax(
       {
          /* this option */
          async: false,
          cache: false,
          type: "GET",
          dataType: "text",
          url: url,
    ...
    

    这意味着在您得到响应之前,不会执行 ajax 调用之后的任何其他操作。替代方法是将代码放置在您需要在成功回调方法本身中使用数组的位置。

    【讨论】:

    • 呃!是的 - 我完全忘记了这一点! :D
    • 请注意,如果您使用的是同步请求,则浏览器在等待服务器结果时会无响应。
    • 现在已弃用。
    【解决方案2】:

    您的问题是您试图在数据到达之前使用它。

    您可以添加一个在数据来自服务器后调用的回调函数:

    var qns, qis, ncs, nzs, tps;
    
    function get_questions(callback) {
    
       var url = "php/pytania.php"; 
    
       $.ajax({
    
          cache: false,
          type: "GET",
          dataType: "text",
          url: url,
          success: function(response) {
    
             data = jQuery.parseJSON(response);
    
             qns = data.qns;
             qis = data.qis;
             ncs = data.ncs;
             nzs = data.nzs;
             tps = data.tps;
    
             callback();
    
          }
    
       } );
    
    }
    
    $(document).ready(function() {
    
       var index = 0;
    
       get_questions(function(){
    
         $("#question_no").text(qns[index]);
    
       });
    
    });
    

    注意:你可以使用dataType: "json",然后响应会被自动解析,你不必使用parseJSON

    【讨论】:

    • 我这样做了,这对我有用,使用 jquery 3.2.1 async 现在已弃用
    【解决方案3】:

    您应该为您的 ajax 请求添加一个回调函数,然后尝试 "$( "#question_no" ).text( qns[ index ] );"在回调函数中。您尝试在 ajax 请求实际加载变量之前访问该变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多