window.requestAnimFrame と window.requestAnimationFrame に違いはありますか?
はい、requestAnimFrame
window オブジェクトに追加されたカスタムの非公式プロパティですが、W3C が「スクリプトベースのアニメーションのタイミング制御」requestAnimationFrame
の WindowAnimation セクションで提供する HTML5 キャンバスの公式標準の一部です。
しかし、彼らは同じことをします。ポール・アイリッシュは怠惰な瞬間を得ました (その場合、彼はそれをrAF
IMO と呼ぶべきでした:-)) - または - 彼は、メソッドを書いた時点でブラウザーで内部的に保護されているというリスクに遭遇したくありませんでした ( Opera の Erik Möller は、フルネームを使用するこのポリフィルの独自のバージョンを作成しました)。
polyfill 、shim、shiv 、 monkey -patch、duck-punching、shaking the bag (! 誰がこれらの名前を思いついたの??) は、とにかく、この場合、さまざまなブラウザーの機能を統一しようとします。
たとえば、 requestAnimationFrame が実験的な状態で実装されていたとき、メソッドはさまざまなブラウザーでプレフィックスとして付けられました。mozRequestAnimationFrame
Firefox/AurorawebkitRequestAnimationFrame
用、Chrome や Safari などの WebKit ブラウザーoRequestAnimationFrame
用、Opera 用など。
したがって、メソッドを呼び出す必要があるたびにこれをテストする代わりに、ポリフィルの並べ替えでこれらをマージするか、利用可能なものを選択して、単一の共通の名前付き呼び出しにし、将来のプレフィックスなしの実装も同様に機能するようにします。
公式の名前付きメソッドがブラウザで利用可能になったときに機能するため、将来の変更を心配することなく、ポリフィルが使用する名前を使用できることを意味します。
(この点に関して朗報です: Chrome と Firefox は現在、このメソッドをプレフィックスなしで出荷しています。他のブラウザーもおそらくそれに続くでしょう)。
window.requestAnimFrame/AnimationFrame は document.onload = または img.onload = 関数に似ていますか?
あまり。これは簡単な方法です。
document.onload = function;
img.onload = function;
一方、ポリフィルは次のことと同等です。
var myVar = var1 || var2 || var3;
( ||
= JavaScript では OR ) wheremyVar
は、1 つだけが設定されている場合、最初に定義された値になります (これらの変数が何であるかに応じて、これ以上のものがあるため、これは非常に単純化された言い方であることに注意してください)。
したがって、window.requestAnimFrame
(またはwindow.requestAnimationFrame
) は、最初に使用可能な定義済みメソッドを設定するように単純に「要求」します。ここでは、プレフィックスなしが優先されます。
window.requestAnimationFrame = window.requestAnimationFrame;
存在するように設定しますが、存在しない場合は、代替値を指定する必要があります。
window.requestAnimationFrame = window.requestAnimationFrame ||
Window.mozRequestAnimationFrame ...
したがって、window.requestAnimationFrame
存在しない場合は、moz プレフィックスなどで試行します。この OR の結果はwindow.mozRequestAnimationFrame
、利用可能な場合に設定さwindow.requestAnimationFrame
れ、その他のプレフィックス付きオプションについても同様です。
存在しない場合は最後の手段として、setTimeout
代わりにフォールバックが設定されます。この場合、署名に互換性があるため、これは機能します(引数として呼び出す関数を取ります)。
その結果、呼び出すことができwindow.requestAnimationFrame
(または Pauls polyfill の場合window.requestAnimFrame
)、プレフィックス付きのメソッドをサポートしているかどうかに関係なく、どのブラウザーでも機能します。
(私はいつも requestAnimationFrame を入力するのにうんざりしていたので、間違いなく Paul を疑います.. :-| )