Javascript 类型错误:';requestAnimationFrame';在未实现接口窗口的对象上调用
我正在将我的Javascript 类型错误:';requestAnimationFrame';在未实现接口窗口的对象上调用,javascript,Javascript,我正在将我的setInterval代码转换为requestAnimationFrame。我在类中使用它,所以我需要将这个绑定到传递的函数 当我将正确的供应商函数分配给变量(this.raf)时,我得到了错误: TypeError:对不存在的对象调用了“requestAnimationFrame” 实现接口窗口 当我直接调用window.requestAnimationFrame时,代码运行良好。你知道为什么会出错吗 这是 slideshow=(函数(){ 函数幻灯片(){ this.slideS
setInterval
代码转换为requestAnimationFrame
。我在类中使用它,所以我需要将这个
绑定到传递的函数
当我将正确的供应商函数分配给变量(this.raf
)时,我得到了错误:
TypeError:对不存在的对象调用了“requestAnimationFrame”
实现接口窗口
当我直接调用window.requestAnimationFrame
时,代码运行良好。你知道为什么会出错吗
这是
slideshow=(函数(){
函数幻灯片(){
this.slideShowRunning=false;
这个幻灯片=0;
}
slideshow.prototype.startSlideshow=函数(){
var newSlide;
this.slideShowRunning=true;
这是rafId;
this.raf=window.requestAnimationFrame||
window.mozRequestAnimationFrame||
window.webkitRequestAnimationFrame||
window.msRequestAnimationFrame||
window.oRequestAnimationFrame;
函数循环(){
//如果fn返回false,则停止循环
if(this.slideShowRunning!==false){
如果(this.slide
为什么要将其分配给此?只需设置var-raf=代码>(在IIFE的范围内)并调用raf(boundLoop)代码>。无论如何,问题是因为调用函数时设置了运行时使用的this
:x.raf()
将函数中的this
设置为x
requestAnimationFrame
不希望它的此
是您的对象。另外,this.rafId代码>不做任何陈述。@Ryan-你的解释正是我所期望的。你的解决方案太简单了。幸运的是,没有理由将其设置为类变量。感谢您的快速回答和解决方案。
slideshow = (function() {
function slideshow() {
this.slideShowRunning = false;
this.slide = 0;
}
slideshow.prototype.startSlideshow = function() {
var newSlide;
this.slideShowRunning = true;
this.rafId;
this.raf = window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame;
function loop() {
// stop the loop if fn returned false
if (this.slideShowRunning !== false) {
if (this.slide < this.count - 1) {
newSlide = this.slide + 1;
}
this.loadSlide(newSlide);
// loop until cancelled
var boundLoop = loop.bind(this);
// THIS GIVES THE ERROR
this.rafId = this.raf(boundLoop);
// BUT THIS WORKS
//this.rafId = window.requestAnimationFrame(boundLoop);
}
}
var boundLoop = loop.bind(this);
boundLoop();
}
slideshow.prototype.loadSlide = function(slideNumber) {
// loading the slide
console.log(slideNumber);
}
return slideshow;
})();
ss = new slideshow();
divStart = document.getElementById("start");
divStart.onclick = function() {
ss.startSlideshow()
};