javascript - 如何在 fabric.js 中触发鼠标事件来模拟鼠标操作?

标签 javascript jquery fabricjs dom-events

我能够在触发时获得 jquery 响应,但 fabric Canvas 未对事件起作用。

我希望这个 fiddle 取消选择 IText 元素:

fiddle

我知道织物 Canvas 有一个触发事件,但它也不起作用。

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

最佳答案

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

我不熟悉 jQuery 的事件,但您可以使用标准 JS 来做同样的事情 MouseEvent constructor .只要确保您:

  • 触发适当的事件类型(即 'mousedown',而不是 'click')
  • 在适当的 DOM 元素上调度它(即 Fabric 的上层 Canvas ,可通过 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>

关于javascript - 如何在 fabric.js 中触发鼠标事件来模拟鼠标操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53558659/

相关文章:

jquery - 在 cakePHP 中调用 ajax 时使用操作 url 的最佳实践

javascript - 添加显示后检测元素的可见性 :none using javascript

javascript - fabricjs 在某些事件不起作用时更改边框大小和颜色

javascript - 如何统计每个用户一个 channel 的消息条数?

javascript - 如何使用 POST 将数据发送到 php,然后使用纯 javascript 中的 GET 从 php 检索数据?

javascript - jQuery 中的 css 列表选择器,继承错误

javascript - 使用 jquery ajax 返回两个值

javascript - Fabricjs 检测鼠标悬停在对象路径上

javascript - 将 Fabric.js 文本转换为路径

javascript - 如何使用 snap.svg 创建线条 - s.line 不是函数