在这个场景中,我很难理解“this”的范围。我可以从时间跟踪器开关对象中调用这些函数中的每一个,比如: this.startTracking();。但是,当我尝试执行以下代码时: Drupal.timeTracker.prototype.stopTracking();它丢失了所有变量的作用域,并且我的GET请求变得未定义。如何在卸载前启动stopTracking()?
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));
}
});
};
发布于 2010-10-05 21:39:36
我只拿出一小段:
this.startTracking();
$(window).bind('beforeunload', function() {
// this is defined by the above function definition
tracker.stopTracking();
});
您的问题是,当您创建绑定函数时,其中的this
将引用$(window)
,因此您需要创建一个副本,以便能够在这个新函数中引用它。
发布于 2010-10-05 21:57:17
googletorp的答案应该是有效的,但只需快速注意:
我相信你遇到的问题是因为你想打电话给:
Drupal.timeTracker.prototype.stopTracking();
相反,我认为它应该是:
Drupal.timeTracker.stopTracking();
我不相信你应该在原型上调用函数,而是应该在修改了原型的对象上调用函数。
发布于 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
对象。
https://stackoverflow.com/questions/3864097
复制相似问题