首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript中的变量范围

Javascript中的变量范围
EN

Stack Overflow用户
提问于 2010-10-05 21:33:11
回答 3查看 363关注 0票数 2

在这个场景中,我很难理解“this”的范围。我可以从时间跟踪器开关对象中调用这些函数中的每一个,比如: this.startTracking();。但是,当我尝试执行以下代码时: Drupal.timeTracker.prototype.stopTracking();它丢失了所有变量的作用域,并且我的GET请求变得未定义。如何在卸载前启动stopTracking()?

代码语言:javascript
运行
复制
    Drupal.behaviors.dynamicTimeTracker = function (context) {
  $('form.node-time-tracker', context).each(function () {
    new Drupal.timeTracker(this);
  });
};

/**
 * A time tracker switch object
 */
Drupal.timeTracker = function (form) {
  var tracker = this;
  this.form = form;
  this.nid = $('#'+ form.id +' input[name="nid"]').attr('value');
  this.uid = $('#'+ form.id +' input[name="uid"]').attr('value');
  this.button = $('#'+ form.id +' input[type="submit"]');
  this.url = Drupal.settings.time_tracker.url + '/' + this.nid + '/' + this.uid;
  this.counter = $('#'+ form.id +' .counter');

  this.initialize(); // TODO: make sure this function is called regularly to make sure trackers are in synch
  this.startTracking();
  $(window).bind('beforeunload', function() {
    Drupal.timeTracker.prototype.stopTracking(); // need help here
  });
};

/**
 * Initialize the time tracker
 */
Drupal.timeTracker.prototype.initialize = function () {
  var tracker = this;

  $.ajax({
    type: "GET",
    url: tracker.url,
    dataType: 'json',
    success: function (status) {
      $(tracker.counter).countdown({compact:true, since:-status['time']}).countdown('resume');

      if (status['status'] == 'ongoing') {
        $(tracker.button).toggle(
          function() {
            tracker.stopTracking();
            return false;
          },
          function() {
            tracker.startTracking();
            return false;
          }
        );
        $(tracker.counter).countdown('resume');
        $(tracker.button).val(Drupal.t('Stop'));
        $(tracker.form).removeClass('node-time-tracker-start').addClass('node-time-tracker-stop');
      }
      else {
        $(tracker.button).toggle(
          function() {
            tracker.startTracking();
            return false;
          },
          function() {
            tracker.stopTracking();
            return false;
          }
        );
        $(tracker.counter).countdown('pause');
        $(tracker.button).val(Drupal.t('Start'));
        $(tracker.form).removeClass('node-time-tracker-stop').addClass('node-time-tracker-start');
      } 
    },
    error: function (xmlhttp) {
      alert(Drupal.ahahError(xmlhttp, tracker.startURL));
    }
  });
};

/**
 * Starts time tracking
 */
Drupal.timeTracker.prototype.startTracking = function () {
  var tracker = this;

  // Ajax GET request for starting time tracker
  $.ajax({
    type: "GET",
    url: tracker.url + '/start',
    dataType: 'json',
    success: function (status) {
      $(tracker.counter).countdown('change', {since: -status['time']}).countdown('resume');
      $(tracker.button).val(Drupal.t('Stop'));
      $(tracker.form).removeClass('node-time-tracker-start').addClass('node-time-tracker-stop');
    },
    error: function (xmlhttp) {
      alert(Drupal.ahahError(xmlhttp, tracker.startURL));
    }
  });
};

/**
 * Stops time tracking
 */
Drupal.timeTracker.prototype.stopTracking = function () {
  var tracker = this;

  // Ajax GET request for stopping time tracker
  $.ajax({
    type: "GET",
    url: tracker.url + '/stop',
    dataType: 'json',
    success: function (status) {
      $(tracker.counter).countdown('change', {since: -status['time']}).countdown('pause');
      $(tracker.button).val(Drupal.t('Start'));
      $(tracker.form).removeClass('node-time-tracker-stop').addClass('node-time-tracker-start');
    },
    error: function (xmlhttp) {
      alert(Drupal.ahahError(xmlhttp, tracker.startURL));
    }
  });
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-05 21:39:36

我只拿出一小段:

代码语言:javascript
运行
复制
this.startTracking();
$(window).bind('beforeunload', function() {
  // this is defined by the above function definition
  tracker.stopTracking();
});

您的问题是,当您创建绑定函数时,其中的this将引用$(window),因此您需要创建一个副本,以便能够在这个新函数中引用它。

票数 1
EN

Stack Overflow用户

发布于 2010-10-05 21:57:17

googletorp的答案应该是有效的,但只需快速注意:

我相信你遇到的问题是因为你想打电话给:

代码语言:javascript
运行
复制
Drupal.timeTracker.prototype.stopTracking();

相反,我认为它应该是:

代码语言:javascript
运行
复制
Drupal.timeTracker.stopTracking();

我不相信你应该在原型上调用函数,而是应该在修改了原型的对象上调用函数。

票数 0
EN

Stack Overflow用户

发布于 2010-10-06 01:01:59

当您调用new Drupal.timeTracker(this)时,它会创建一个新对象。该对象继承自Drupal.timeTracker.prototype。在该对象的方法内部,this被设置为对象本身。Drupal.timeTracker.prototype不是对象,而仅仅是一个模板,可以用来形成对象的新实例;就像一个千篇一律的切割器一样,它不是很好吃。最重要的是,你的实际计时器的内部状态都不在那里。

当你调用Drupal.timeTracker.prototype.stopTracking时,它是在模板上被调用的,而不是真正的对象。如果你打电话给tracker.stopTracking(),你会好起来的。您不能调用this.stopTracking(),因为当您要调用stopTracking时,您处于onbeforeunload的事件处理程序中,因此您的this将是window对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3864097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档