【问题标题】:jQuery's AJAX call to a javascript class methodjQuery 对 javascript 类方法的 AJAX 调用
【发布时间】:2011-04-12 02:36:09
【问题描述】:

我是 jQuery 工作流程的新手,我想设置一个使用内部方法发出 AJAX 请求的 javascript 类。当请求成功返回时,jQuery AJAX 回调应该调用类本身拥有的方法。代码如下:

function IXClock()
{
    this.m_intervalID = 0;

    this.startClock = function ()
    {
        this.m_intervalID = setInterval(this.tictac, 500);
    }

    this.stopClock = function ()
    {
        clearInterval(this.m_intervalID);
    }

    this.setClockTime = function(p_strTime)
    {
        $('#clock').html(p_strTime);
    }

    this.tictac = function ()
    {
        $.ajax
        ({
                type: 'POST',
                url: '/rap/rapClock.php',
                complete: function (data)
                {
                    this.setClockTime(data);
                }
        });
    }

}

该类表示一个时钟,其内部方法 (tictac) 在服务器端请求“现在几点”。 服务器说出时间后,jQuery 的 AJAX 方法应该调用 IXClock 类的 setClockTime 方法。调用方法会更新 html 页面中的#clock div 项。

问题是 this.setClockTime() 方法结果未知,并且 javascript 返回“this.setClockTime 不是函数”错误。

问题是:有没有办法从 jQuery 的 AJAX 回调中调用类方法?

【问题讨论】:

  • 如果你称它为类,为什么不使用prototype 对象将方法分配给,而不是将它们单独附加到每个实例化的对象?
  • 获取一次时间,格式化为日期对象,从那里递增,间隔使用ajax请求有点浪费。

标签: javascript jquery ajax class methods


【解决方案1】:

一个简单的解决方案是,将您的回调函数保留为self = this。这也将支持继承。

class Record{
  get_data(){
    self = this;
    $.ajax({
        type : "GET",
        url : "/get_url",
        dataType : "json",
        contentType: "application/json; charset=utf-8",
        data : {},
        success : function(data){
          console.log(data);
          self.load_table(data);
        },
      });
  }

  static load_table(data){
    console.log(data);
  }

【讨论】:

    【解决方案2】:

    结果处理程序中的 this 不是您所期望的。 (不是 IXClock 实例)

    function IXClock()
    {
        this.m_intervalID = 0;
    }
    
    IXClock.prototype = {
    
        startClock: function ()
        {
            this.m_intervalID = setInterval(this.tictac, 500);
        },
    
        stopClock: function ()
        {
            clearInterval(this.m_intervalID);
        },
    
        setClockTime: function(p_strTime)
        {
            $('#clock').html(p_strTime);
        },
    
        tictac: function ()
        {
            var that = this;
            $.ajax({
                type: 'POST',
                url: '/rap/rapClock.php',
                success: function (data) { // You want success here, not complete, IMO
                    that.setClockTime(data);
                }
            });
        }
    
    }
    

    如果你问我,那个 ajax 调用是在做坏事。它似乎没有发送任何数据,也没有修改任何 服务器上的状态,但期待/获取/使用来自 php 的数据,但正在使用 POST 方法。 应该是

    $.get('/rap/rapClock.php', function (data) {
        that.setClockTime(data);
    });
    

    【讨论】:

      【解决方案3】:

      我认为问题在于您的回调函数中的this 与引用IXClockthis 不同。试试:

      var thisClass = this ;
      this.tictac = function ()
      {
          $.ajax
          ({
                  type: 'POST',
                  url: '/rap/rapClock.php',
                  complete: function (data)
                  {
                      thisClass.setClockTime(data);
                  }
          });
      }
      

      测试用例(添加到已经加载了 jQuery 的站点):

      function uClass () {
          this.testFunction = function(input) {
              alert(input) ;
          }
          this.ajaxFunction = function() {
              var myClass = this ;
              $.ajax({
                  type: 'POST',
                  url: '/',
                  complete: function(data) {
                      alert(myClass.testFunction) ;
                      myClass.testFunction(data) ;
                      this.testFunction(data) ;
                  }
              }) ;
          }
      }
      
      var k = new uClass() ;
      k.ajaxFunction() ;
      

      【讨论】:

      • 似乎是完美的解决方案,但我得到了同样的错误:thisClass.setClockTime is not a function
      • 嗨,我已经在我的答案中添加了一个测试用例,它应该展示您遇到的解决方案和错误。这对你有用吗?如果没有,您能否提供更多关于您如何使用 IXClock 以及您正在运行的 jQuery 版本的详细信息?
      • 和你的一模一样。看起来很奇怪,这是我的:iakko.net/jquery-ajax
      • 啊 - 因为window.setInterval 正在调用tictac() 函数,所以您设置为myClassthiswindow 对象。您需要将var myClass = this ; 行移动到IXClock() 定义中,就在this.tictac = function() 行上方。对不起。
      • 嗯,又是一回事!如果我将 myClass 放在 tictac 之外,我应该如何从 AJAX 回调内部引用 myClass?查看相同的网址:iakko.net/jquery-ajax。再次出现同样的错误!我错过了什么吗?
      【解决方案4】:

      this 在您的 ajax 回调中没有引用 IXClockthis 总是指向当前范围(查看this document)。你需要做这样的事情:

      this.prototype.tictac = function ()
      {
          var self = this;
          $.ajax
          ({
              type: 'POST',
              url: '/rap/rapClock.php',
              complete: function (data)
              {
                  self.setClockTime(data);
              }
          });
      }
      

      您也可以为此目的使用 jQuery 的 .proxy()-function

      this.prototype.tictac = function ()
      {
          $.ajax
          ({
              type: 'POST',
              url: '/rap/rapClock.php',
              complete: $.proxy(function (data) {
                  this.setClockTime(data);
              }, this)
          });
      }
      

      【讨论】:

      • 为什么这又被否决了?如果您不喜欢我的回答,请告诉我原因!我在这里没有看到任何错误。
      【解决方案5】:

      这是因为你的回调函数离开全局上下文。

      您可以选择两种方式

      1. 使用.bind函数将上下文绑定到回调函数http://www.robertsosinski.com/2009/04/28/binding-scope-in-javascript/

      2. jQuery 的 AJAX 支持将一些数据传输到回调函数。你可以这样写:

      this.tictac = function () { $.ajax ({ type: 'POST', context:this, url: '/rap/rapClock.php', complete: function (data) { this.setClockTime(data); } }); }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 2014-07-31
        • 2013-12-01
        • 2023-03-17
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多