代码之家  ›  专栏  ›  技术社区  ›  el_moke

KineticJS:被破坏的形状仍在侦听事件

  •  0
  • el_moke  · 技术社区  · 11 年前

    我试图通过点击来破坏一个形状,但在它被破坏后,这个形状的mouseleave事件处理程序仍在被触发(控制台中的错误)。我假设KineticJS会解除对被破坏形状的所有事件的绑定。因此,基本上的问题是,如果我想在KineticJS中销毁某个形状,是否必须手动禁用该形状的所有事件侦听器。

    以下是jsfiddle的链接和代码: http://jsfiddle.net/evNyp/8/

    var stage = new Kinetic.Stage({
        container: 'container',
        width: 578,
        height: 200
    });
    
    var layer = new Kinetic.Layer();
    
    // dashed line
    var greenLine = new Kinetic.Line({
        points: [73, 70, 340, 23, 450, 60, 500, 20],
        stroke: 'green',
        strokeWidth: 10,
        lineJoin: 'round',
        dashArray: [10, 5],
        dashArrayEnabled: false
    });
    
    layer.add(greenLine);
    stage.add(layer);
    
    greenLine.on('mouseenter', function() {
        console.log('enter');
        this.setDashArrayEnabled(true);
        this.getLayer().draw();
    });
    
    greenLine.on('mouseleave', function() {
        console.log('leave');
        this.setDashArrayEnabled(false);
        this.getLayer().draw();
    });
    
    greenLine.on('click', function() {
        //this.off('mouseleave');
        this.destroy();
        layer.draw();
    });
    
    1 回复  |  直到 11 年前
        1
  •  0
  •   markE    11 年前

    您必须从greenLine.on事件处理程序外部调用greenLine.dedestroy()。

    原因是:您无法销毁当前范围内的内容(greenLine的事件处理程序仍在范围内)。

    例如,您可以监听stage上的点击,并销毁该事件处理程序中的greenLine。

    $(stage.getContent()).on('click', function (event) {
        greenLine.destroy();
        layer.draw();
    });
    

    这是一个Fiddle: http://jsfiddle.net/m1erickson/BVyNF/