首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >requestAnimation帧误差

requestAnimation帧误差
EN

Stack Overflow用户
提问于 2012-12-28 10:55:59
回答 2查看 1.3K关注 0票数 2

以下内容导致错误(FF、Chrome和?):

JSFiddle娱乐

代码语言:javascript
运行
复制
Engine.prototype.requestAnimationFrame = window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.oRequestAnimationFrame ||
        window.msRequestAnimationFrame ||
        function(/* function */ callback, /* DOMElement */ element){
            window.setTimeout(callback, 1000 / 60);
};

完整的背景是:

代码语言:javascript
运行
复制
var Engine = function(model) {

        this.model = model;
    };

    Engine.prototype.start = function() {
        console.log("ready")
        this.requestAnimationFrame(function() {
            console.log("done");
        });
    };

    Engine.prototype.updateUi = function() {

        console.log("update ui");
        this.requestAnimationFrame(this.updateUi);
    };

    Engine.prototype.logRAF = function() {
        console.log(window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame);
        return this;
    };

    Engine.prototype.requestAnimationFrame = window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function(/* function */ callback, /* DOMElement */ element){
                window.setTimeout(callback, 1000 / 60);
            };

var engine = new Engine();
engine.logRAF().start();

FF -mozRequestAnimationFrame()中的错误如下:NS_ERROR_XPC_BAD_OP_ON_WN_PROTO: Illegal operation on WrappedNative prototype object

Chrome -webkitRequestAnimationFrame()中的错误如下:Uncaught TypeError: Illegal invocation

在线路上:

代码语言:javascript
运行
复制
this.requestAnimationFrame...

日志将打印出“就绪”,但不显示“已完成”。

如果我只使用一个函数而不是本机RAF方法,它就能工作(“已完成”被记录):

JSFiddle娱乐

RequestAnimationFrames是怎么回事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-28 11:14:14

当您调用window的函数时,上下文(this )必须是window,而不是对象(Engine的实例)。绑定将帮助您解决这个问题:

代码语言:javascript
运行
复制
Engine.prototype.requestAnimationFrame = 
        (window.requestAnimationFrame && window.requestAnimationFrame.bind(window)) ||
        (window.webkitRequestAnimationFrame && window.webkitRequestAnimationFrame.bind(window)) ||
        //etc...

现场演示

票数 6
EN

Stack Overflow用户

发布于 2012-12-28 11:18:11

requestAnimationFrame应该在windowthis.requestAnimationFrame.call(window, ...);的上下文中调用,如这里所提到的:Chrome中的“未登录TypeError:非法调用”

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

https://stackoverflow.com/questions/14068436

复制
相关文章

相似问题

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