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

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

  •  2
  • Flemming  · 技术社区  · 6 年前

    我希望此小提琴取消选择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

    fiddle 2

    2 回复  |  直到 6 年前
        1
  •  1
  •   Neil VanLandingham    6 年前

    https://jsfiddle.net/y74h38av/

    现有代码中的主要问题是将jQuery事件API与Fabric事件API混淆。结构画布对象不接受jQuery事件对象。另外,请注意两个API之间的语法差异。jQuery使用 mousedown 而面料使用 mouse:down . 您可以通过 event jQuery(test).trigger(e); ,这是行不通的。

    我希望这有帮助!

        2
  •  1
  •   shkaper    6 年前

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

    我不熟悉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>