对象中的setInterval出现问题's方法
Trouble with setInterval in an object's method
我不明白为什么当我调用对象的重置方法时,计时器仍然为空。下面是我的对象的简化版本,后面是构造新对象并运行代码的jQuery。关于我的具体问题,请参阅大写评论。谢谢
var countdownTimer = {
// Default vars
milliseconds: 120000,
interval: 1000,
timer: false,
/* ... stuff ... */
countdown: function () {
var root = this;
var originalTime = root.milliseconds;
/* ... stuff */
// IN MY MIND THIS NEXT LINE SETS THE INSTANCE OF THIS OBJECT'S TIMER PROPERTY TO THE setIterval's ID. BUT DOESN'T SEEM TO BE CORRECT. WHY?
root.timer = setInterval(function () {
if (root.milliseconds < 1) {
clearInterval(root.timer); // THIS LINE SEEMS TO WORK
root.countdownComplete(); // callback function
return false;
}
root.milliseconds = root.milliseconds - root.interval;
/* .... stuff ... */
}, root.interval);
},
start: function (ms) {
if (ms) {
this.milliseconds = ms;
}
if(this.timer) {
clearInterval(this.timer); // NOT SURE IF THIS WORKS OR NOT
}
this.countdown();
},
reset: function (ms) {
var root = this;
if(root.timer) {
clearInterval(root.timer); // THIS DOES NOT WORK
} else {
console.log('timer not exist!!!!'); // ALWAYS END UP HERE. WHY?
}
/* .... stuff ... */
},
countdownComplete: function() { }
};
// Setting up click events to create instances of the countdownTimer
$(function () {
var thisPageCountdown = 4000;
$('[data-countdown]').on('click', '[data-countdown-start], [data-countdown-reset]', function () {
var $this = $(this);
var $wrap = $this.closest('[data-countdown]');
// create instance of countdownTimer
var myCountdown = Object.create(countdownTimer);
if ($this.is('[data-countdown-start]')) {
$this.hide();
$('[data-countdown-reset]', $wrap).css('display', 'block');
myCountdown.$wrap = $wrap;
myCountdown.start(thisPageCountdown);
// myCountdown.countdownComplete = function() {
// alert("Updated Callback!");
// };
}
if ($this.is('[data-countdown-reset')) {
$this.hide();
$('[data-countdown-start]', $wrap).css('display', 'block');
// RESET CALLED HERE BUT DOESN'T WORK RIGHT. SAYS myCountdown.timer IS STILL null. WHY?
myCountdown.reset(thisPageCountdown);
}
});
});
当您在点击函数回调中使用var myCountdown = Object.create(countdownTimer);
时,您只将其范围限定为该回调,一旦执行了回调,它就会被垃圾回收。您只需要创建countdownTimer
的一个实例,并且它应该在单击事件处理程序之外。
var thisPageCountdown = 4000;
// create instance of countdownTimer
var myCountdown = Object.create(countdownTimer);
$('[data-countdown]').on('click', '[data-countdown-start], [data-countdown-reset]', function () {
var $this = $(this);
var $wrap = $this.closest('[data-countdown]');
TL;DR您可以通过避免在静态方法中使用关键字this
来解决问题。
在静态javascript方法中使用关键字this
时,它指的是调用点最后一个点之前的项。示例:
foo.bar(); // inside, this will refer to foo
foo.bar.foobar(); //inside, this will refer to foo.bar
var a = foo.bar.foobar();
a(); //this will refer to either null or window - oops
为了防止这种行为,您应该在静态方法中始终使用完全限定的名称引用,而不是依赖于this
关键字。
以上示例:
reset: function (ms) {
//var root = this; // don't do this
if(countdownTimer.timer) {
clearInterval(countdownTimer.timer);
} else {
console.log('timer not exist!!!!');
}
/* .... stuff ... */
}
相关文章:
- 文档.编写方法问题
- 使用Ajax的问题's发送多个值的Post方法
- 在对象中添加方法时出现问题
- 简单的javascript方法问题
- Node.js-异步方法调用问题
- 尝试将变量传递到对象中时的作用域问题'的方法构造函数
- 谷歌地图API v3 addDomListener方法问题
- 角度非幂等方法问题
- 如何使用 2 个表单集并保存它们(发布方法问题)
- Javascript Array.push 方法问题
- 在对象数组上划线查找方法问题
- Jquery.click()出现了一个unanonymus方法问题
- Javascript私有方法问题
- Javascript拼接方法问题
- Javascript对象方法问题
- Object.getPrototypeOf(0)方法问题
- Javascript:添加属性方法问题
- j查询切换方法问题
- Javascript RegExp - 测试方法问题
- 下拉菜单-单选按钮列表和Javascript方法问题