requestAnimation создают ошибку

Это следующее вызывает ошибку (FF, Хром, и?):

Отдых JSFiddle

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 = 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();

The error is the following in FF - mozRequestAnimationFrame(): NS_ERROR_XPC_BAD_OP_ON_WN_PROTO: Illegal operation on WrappedNative prototype object

The error is the following in Chrome - webkitRequestAnimationFrame(): Uncaught TypeError: Illegal invocation

на линии:

this.requestAnimationFrame...

Регистрация читает вслух "готовые" печати, но не "сделанная"

Если я использую просто функцию вместо родных методов Королевских ВВС, она работает ("сделанный", зарегистрирован):

Отдых JSFiddle

Что продолжает RequestAnimationFrames?

2
добавлено отредактировано
Просмотры: 1
de

2 ответы

Когда вы призываете окно функция, , контекст ( это ) должен быть окном , не ваш объект ( Двигатель случай). связать поможет вам решить что проблема:

Engine.prototype.requestAnimationFrame = 
        (window.requestAnimationFrame && window.requestAnimationFrame.bind(window)) ||
        (window.webkitRequestAnimationFrame && window.webkitRequestAnimationFrame.bind(window)) ||
        //etc...

живет демонстрационный пример

6
добавлено
Конечно, Спасибо! +10
добавлено автор Peter Ajtai, источник
@pimvdb - принятие одного из "окна" методы функции Королевских ВВС доступно. Если это отступает к регулярной функции, которая будет через ошибку...., но да, есть некоторые короткие пути, которые будут сделаны.
добавлено автор Peter Ajtai, источник
@pimvdb undefined.bind (окно) является ошибкой jsfiddle.net/pajtai/RL24r - таким образом, это просто должно быть обернуто немного лучше:
добавлено автор Peter Ajtai, источник
@pimvdb - о, прохладный, да, который работает
добавлено автор Peter Ajtai, источник
Можно также использовать (window.a || window.b ||...) .bind (окно) .
добавлено автор pimvdb, источник
Я don' t думают, что это вызовет ошибку - функция отступления doesn' t использование это , таким образом используя .bind </ код> не для того.
добавлено автор pimvdb, источник
@Peter Ajtai: Я имел в виду это: jsfiddle.net/fdZWD/23. Это работает на меня.
добавлено автор pimvdb, источник
Глэд @PeterAjtai, которая помогла.
добавлено автор Engineer, источник

requestAnimationFrame should be called in the context of the window : this.requestAnimationFrame.call(window, ...); as mentioned here: "Uncaught TypeError: Illegal invocation" in Chrome

2
добавлено