现在我完全不知道是什么导致了这个奇怪的错误,我希望能够尽可能地描述它,但是代码已经变得很大并且发布所有这些不会导致一个明确的问题。
1.设置:
背景中的 Box2dWeb 动画,其中Step()
方法的触发是通过遵循» 就是它« 部分中window.requestAnimationFrame
的游戏循环实现来完成的。每次调用 »draw« 方法时,b2body 的转换都会交给 a和 a 。设置所需的动画并充当身体的监视器并驻留在内联中。<div>
<g>
<div>
<g>
<svg>
点击被全局捕获,如果用户点击目标<div>
或<path>
目标获得焦点导致对 b2body 施加力的原因。
2.错误:
总而言之,一切都按预期工作,动画为其<div>
对应的.<g>
<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 );
}
wherethis._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 中,一切都按其应有的方式运行,唯一导致错误行为的是 »click« 与<path>
as 目标一起发生。矩阵是正确的,因为动画继续正确运行<div>
。
什么可能导致这种情况,我应该在哪里搜索,是否有人有想法或有类似的错误?
编辑:
这可能是由于事件被捕获并与整体运行的“更新滴答”“异步”处理的事实引起的吗?
编辑2:
我注意到如果我启动网络检查器并观察元素,也会出现同样的问题,但所有<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«,很高兴告诉我。否则我认为这是一种错误。