如何在fabric.js中触发鼠标事件以模拟鼠标动作?

时间:2018-11-30 13:37:40

标签: javascript jquery fabricjs dom-events

我能够在触发器上获得jquery响应,但结构画布未对事件起作用。

我希望这个小提琴会取消选择IText元素:

fiddle

我知道织物画布有触发事件,但是它也无法正常工作。

var canvas = new fabric.Canvas("c");
var test = jQuery("#c");

test.on("mouse:down", function (){
    alert("you clicked me");
  canvas.renderAll();
  debugger;
});

canvas.on({"mousedown": function() {
  alert("you clicked me too");
}});

$("#testClick").click(function() {
  var e = jQuery.Event("mouse:down", {
    pageX: 10,
    pageY: 10
  });
  jQuery(canvas).trigger(e);//Missed - not jquery
  jQuery(jQuery("#c")).trigger(e);
  jQuery(test).trigger(e);
});

/*************** TEXT ****************/
 var text = new fabric.IText('FaBric.js', {
  fontSize: 40,
  textAlign: 'center',
  fontWeight: 'bold',
  left: 128,
  top: 128,
  angle: 30,
  originX: 'center',
  originY: 'center',
  shadow: 'blue -5px 6px 5px',
  styles: {
    0: {
      0: {
        fontSize: 60,
        fontFamily: 'Impact',
        fontWeight: 'normal',
        fill: 'orange'
      }
    }
  }

});

text.setSelectionStyles({
  fontStyle: 'italic',
  fill: '',
  stroke: 'red',
  strokeWidth: 2
}, 1, 5);
canvas.add(text);
canvas.setActiveObject(text);

编辑1

我已经尝试过“ mouse:down”和“ click”事件,但是该对象并未取消选择:fiddle 2

2 个答案:

答案 0 :(得分:1)

这是您的小提琴的工作叉子:https://jsfiddle.net/y74h38av/

现有代码中的主要问题是您将jQuery事件API与Fabric事件API混淆了。 Fabric画布对象不接受jQuery事件对象。另外,请注意两个API之间的语法差异。 jQuery使用mousedown,而Fabric使用mouse:down。您可以通过event方法直接在Fabric对象上访问Fabric事件API。如果您尝试将Fabric对象包装在jQuery对象中,就像在这里jQuery(test).trigger(e);那样,它将无法正常工作。

我希望这会有所帮助!

答案 1 :(得分:1)

仅通过Fabric的trigger触发事件是不够的。 Fabric对象发出的事件不会用于触发内部逻辑,因此触发它们不会有任何好处,除非您想触发自己的事件处理程序。

我对jQuery的事件不熟悉,但是使用标准的JS MouseEvent constructor也可以做到。只要确保您是:

  • 触发适当的事件类型(即'mousedown',而不是'click'
  • 在适当的DOM元素(即Fabric的上部画布,可通过canvas.upperCanvasEl访问)上分发它
  • 设置事件的clientX / clientY而不是pageX / pageY

var canvas = new fabric.Canvas("c");

canvas.on({"mouse:down": function(e) {
  console.log("Mouse down", e.e.clientX, e.e.clientY);
  canvas.renderAll();
}});

document.querySelector('#testClick').onclick = function() {
  var evt = new MouseEvent("mousedown", {
    clientX: 15,
    clientY: 15
  });
  canvas.upperCanvasEl.dispatchEvent(evt);
  // same as:
  //document.querySelector(".upper-canvas").dispatchEvent(evt);
}


/*************** TEXT ****************/

var text = new fabric.IText('FaBric.js', {
  fontSize: 40,
  textAlign: 'center',
  fontWeight: 'bold',
  left: 128,
  top: 128,
  angle: 30,
  originX: 'center',
  originY: 'center',
  shadow: 'blue -5px 6px 5px',
  styles: {
    0: {
      0: {
        fontSize: 60,
        fontFamily: 'Impact',
        fontWeight: 'normal',
        fill: 'orange'
      }
    }
  }

});

text.setSelectionStyles({
  fontStyle: 'italic',
  fill: '',
  stroke: 'red',
  strokeWidth: 2
}, 1, 5);
canvas.add(text);
canvas.setActiveObject(text);
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.20/fabric.js"></script>
<canvas id="c" width="300" height="200"></canvas>
<button id="testClick">Deselect</button>