jQuery全局变量和AJAX

时间:2012-06-29 19:01:10

标签: jquery ajax

我在下面有jQuery代码..

(function( $ ) {

$.fn.pokerClass = function( test ) {
    var test;

    this.a = function(){
                    $.ajax({
                        type: "POST",
                        url: "http://127.0.0.1/test.php",
                        success: function(data){
                            var json = $.parseJSON(data);
                            test = json.value; 
                            }
                    });
    }
    this.b = function() {
        alert("i am " + test);
    };
    this.class_var = test;
    return this;
};


})( jQuery );

HTML:

var t = $(document.body).testClass();
t.a();
t.b();

我得到回应“我未定义”。任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

您的ajax调用以异步方式运行,因此在执行t.b();时,test尚无值。

您可以同步执行ajax调用(async:false)或在t.b();回调中运行success

答案 1 :(得分:3)

您正在使用ajax中的 async ,这意味着系统不会等待ajax完成以继续其余操作。

只需使用

$.ajax({
                        type: "POST",
                        async:false, /* Note this */
                        url: "http://127.0.0.1/test.php",
                        success: function(data){
                            var json = $.parseJSON(data);
                            test = json.value; 
                            }
                    });

答案 2 :(得分:0)

  • 我认为您打算致电pokerClass,而不是testClass

  • 您收到警告test已定义。它是函数的参数,您使用var test;再次声明它。您可以删除函数参数,因为您没有将任何内容传递给函数。

  • 为了获取 JSON数据,您发出POST请求而不发送任何内容。请考虑使用getJSON function,但您无法使用该简写功能设置异步设置。您还可以将预期回复的dataType设置为json。然后自动解析。

  • 正如Claudio Redi所说(首先):将ajax调用设置为async:false。您可能希望查看稍微高级的.when()函数以等待异步请求的响应。

未经测试:

(function( $ ) {
  $.fn.pokerClass = function( ) {
    var test;

    this.a = function(){
      $.ajax({
        type: "GET",
        async: false,
        dataType: "json",
        url: "http://127.0.0.1/test.php",
        success: function(data){
          test = data.value;
        },
        error: function(){
          console.log("Did not work.");
        }
      });
    };
    this.b = function() {
      console.log("I am " + test);
    };
    this.class_var = test;
    return this;
  };
})( jQuery );

var t = $("document.body").pokerClass();
t.a();
t.b();