今のところ、この奇妙なバグの原因がまったくわからないので、できるだけ詳しく説明したいと思っていますが、コードが大きくなり、すべてを投稿しても明確な質問にはなりません.
1. セットアップ:
バックグラウンドでの Box2dWeb アニメーション。ここで、メソッドのトリガーは、»That's it« セクションのゲーム ループの実装に従ってStep()
行われます。»draw« メソッドが呼び出されるたびに、b2body の変換が aとa に渡されます。は目的のアニメーションを設定し、は本体のモニターとして機能し、 inline に常駐します。window.requestAnimationFrame
<div>
<g>
<div>
<g>
<svg>
クリックはグローバルにキャッチされ、ユーザーが<div>
または<path>
ターゲットをクリックすると、b2body に力が適用されてフォーカスが得られます。
2. バグ:
全体として、すべてが期待どおりに機能し、アニメーションは<div>
とそれに対応するの流動的に実行され、<g>
両方をクリックすると、フォーカス状態が正しく変更されますが、クロムと Safari では、<g>
ユーザーが をクリックすると、アニメーションの表示が停止します<g>
。
b2Body から への変換を設定するために使用されるコードは次の<g>
とおりです。
function draw(){
var str = this._sprite.transform;
var mtrs = this._transformItem.matrix;
mtrs.a = str.a1;
mtrs.c = str.a2;
mtrs.e = str.a3;
mtrs.b = str.b1;
mtrs.d = str.b2;
mtrs.f = str.b3;
this._transformItem.setMatrix( mtrs );
}
ここで、カスタム typ の変換行列を指しthis._transformItem
ます。<g>.transform.baseVal.getItem( 0 )
this._sprite.transform
クリックをキャッチするコードは次のとおりです。
function getClickTargets( target ){
var targets = { 'sprite' : null, 'link' : null };
while( target ){
if( target.nodeName.toLowerCase() === 'a' &&
targets.link == null ){
targets.link = target;
}
if( target.hasAttribute &&
target.hasAttribute( 'data-sprite-id' ) &&
targets.sprite == null ){
targets.sprite = this._stage.getSpriteById(
target.getAttribute( 'data-sprite-id' ) );
}
if( target.nodeName.toLowerCase() == 'path' ){
var attr = target.getAttributeNS( NS, 'monitor-for-sprite' );
if( attr != '' ){
targets.sprite = this._stage.getSpriteById( attr );
}
}
if( targets.link != null && target.sprite != null ){
break;
}
target = target.parentNode;
}
return targets;
};
FF、IE9/10、Chrome、Opera では、すべて正常に動作しますが、誤動作を引き起こす唯一の原因は、<path>
as target で »click« が発生することです。アニメーションが に対して正しく実行され続けるため、行列 は正しくなり<div>
ます。
これは何が原因で、どこを検索すればよいのでしょうか?
編集:
これは、イベントがキャッチされ、実行中の全体的な「更新ティック」に対して「非同期」に処理されることが原因でしょうか?
編集2:
Web インスペクターを起動して要素を監視すると、同じ問題が発生することに気付きましたが、すべての<g>
要素がフリーズします。
編集3:
少なくともクロムで実行していますが、Safariでも実行できると思います。»draw« 関数を次のように少し変更しました。
function(){
var str = this._sprite.transform;
var mtrs = this._transformItem.matrix;
mtrs.a = str.a1;
mtrs.c = str.a2;
mtrs.e = str.a3;
mtrs.b = str.b1;
mtrs.d = str.b2;
mtrs.f = str.b3;
//this._transformItem.setMatrix( mtrs ); //old line
this._transformList.replaceItem(
this._transformList.createSVGTransformFromMatrix( mtrs ), 0 ); //new working line
}
新しい »SVGTransform« でのみ機能する理由を誰かが知っている場合は、お知らせください。そうでなければ、これは一種のバグだと思います。