1

现在我完全不知道是什么导致了这个奇怪的错误,我希望能够尽可能地描述它,但是代码已经变得很大并且发布所有这些不会导致一个明确的问题。

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«,很高兴告诉我。否则我认为这是一种错误。

4

0 回答 0