FabricJS дважды щелкните по объектам

Я пытаюсь выполнить специальное действие, когда пользователь дважды щелкает любой объект, находящийся внутри полотна. Я прочитал документы и не нашел никаких mouse:dblclick - подобное событие в документации. Я попытался сделать что-то вроде:

fabric.util.addListener(fabric.document, 'dblclick', callback);

который запускает событие dblclick, но не дает конкретной информации о фактическом объекте, который щелкается на холсте.

любые идеи самого FabricJS-y способа сделать это?

5 ответов


более элегантный способ-переопределить ткань.Холст._initEventListeners для добавления поддержки dblclick

_initEventListeners: function() {
  var self = this;
  self.callSuper('_initEventListeners');

  addListener(self.upperCanvasEl, 'dblclick', self._onDoubleClick);
}

_onDoubleClick: function(e) {
  var self = this;

  var target = self.findTarget(e);
  self.fire('mouse:dblclick', {
    target: target,
    e: e
  });

  if (target && !self.isDrawingMode) {
    // To unify the behavior, the object's double click event does not fire on drawing mode.
    target.fire('object:dblclick', {
      e: e
    });
  }
}

Я также разработал библиотеку для реализации нескольких событий пропустил в fabricjs : https://github.com/mazong1123/fabric.ext


это похоже на ответ @LeoCreer, но на самом деле получает доступ к целевому объекту

fabric.util.addListener(canvas.upperCanvasEl, 'dblclick', function (e) {
  var target = canvas.findTarget(e);
});

правильный способ добавления пользовательских событий в ткани.js

window.fabric.util.addListener(canvas.upperCanvasEl, 'dblclick', function (event, self) {
  yourFunction(event);
});

или использовать ткани.доб


вот быстрый и простой способ добавить обработчик событий двойного щелчка в Fabric JS -

включите следующий фрагмент кода в свой html-файл. Просто убедитесь, что это загружено после основной ткани.библиотека js

<script type="text/javascript">
        fabric = (function(f) { var nativeOn = f.on; var dblClickSubscribers = []; var nativeCanvas = f.Canvas;   f.Canvas = (function(domId, options) { var canvasDomElement = document.getElementById(domId); var c = new nativeCanvas(domId, options);   c.dblclick = function(handler) { dblClickSubscribers.push(handler) };   canvasDomElement.nextSibling.ondblclick = function(ev){ for(var i = 0; i < dblClickSubscribers.length; i++) { console.log(ev); dblClickSubscribers[i]({ e :ev }); } }; return c; });   return f; }(fabric)); 
</script>

затем добавьте этот код для прослушивания события двойного щелчка:

canvas.dblclick(function(e) { 

}); 

чтобы получить информацию о фактическом объекте, который нажимается на холсте, используйте следующий метод -

canvas.getActiveObject();

например.

canvas.dblclick(function(e) { 
     activeObject = canvas.getActiveObject();
}); 

Я использую этот метод:

  var timer = 0;
  canvas.item(0).on('mouseup', function() {
    var d = new Date();
    timer = d.getTime();
  });
  canvas.item(0).on('mousedown', function() {
    var d = new Date();
    if ((d.getTime() - timer) < 300) {
      console.log('double click')
    }
  });