【问题标题】:How we going to maintain a list of objects which are added to canvas in fabric js我们将如何维护一个在fabric js中添加到画布的对象列表
【发布时间】:2018-12-27 10:03:25
【问题描述】:

在我的应用程序中,我想维护一个单独的列表,其中包含添加到画布的对象的详细信息(宽度、高度、id、x、y)。我将在名为“信息”的单独 div 中显示这些详细信息。此外,如果有人从该列表中删除一个对象,则画布中的相关对象也应该删除。

function initCanvas() {
  $('.canvas-container').each(function(index) {

    var canvasContainer = $(this)[0];
    var canvasObject = $("canvas", this)[0];

    var imageOffsetX, imageOffsetY;

    function handleDragStart(e) {
      [].forEach.call(images, function(img) {
        img.classList.remove('img_dragging');
      });
      this.classList.add('img_dragging');
      var imageOffset = $(this).offset();
      imageOffsetX = e.clientX - imageOffset.left;
      imageOffsetY = e.clientY - imageOffset.top;
    }

    function handleDragOver(e) {
      if (e.preventDefault) {
        e.preventDefault();
      }
      e.dataTransfer.dropEffect = 'copy';
      return false;
    }

    function handleDragEnter(e) {
      this.classList.add('over');
    }

    function handleDragLeave(e) {
      this.classList.remove('over');
    }

    function handleDrop(e) {
      e = e || window.event;
      if (e.preventDefault) {
        e.preventDefault();
      }
      if (e.stopPropagation) {
        e.stopPropagation();
      }
      var img = document.querySelector('.furniture img.img_dragging');
      //console.log('event: ', e);

      var offset = $(canvasObject).offset();
      var y = e.clientY - (offset.top + imageOffsetY);
      var x = e.clientX - (offset.left + imageOffsetX);

      var newImage = new fabric.Image(img, {
        width: img.width,
        height: img.height,
        left: x,
        top: y,
        id: img.id
      });
      canvas.add(newImage);
      return false;
    }

    function handleDragEnd(e) {
      [].forEach.call(images, function(img) {
        img.classList.remove('img_dragging');
      });
    }

    var images = document.querySelectorAll('.furniture img');
    [].forEach.call(images, function(img) {
      img.addEventListener('dragstart', handleDragStart, false);
      img.addEventListener('dragend', handleDragEnd, false);
    });
    canvasContainer.addEventListener('dragenter', handleDragEnter, false);
    canvasContainer.addEventListener('dragover', handleDragOver, false);
    canvasContainer.addEventListener('dragleave', handleDragLeave, false);
    canvasContainer.addEventListener('drop', handleDrop, false);
  });
}
initCanvas();

var canvas = new fabric.Canvas('canvas1', {
  selection: false
});

function deleteobject(){
}
canvas{
  border:1px solid #000;
}

.information{
  width:200px;
  height:150px;
  border: 1px solid #eee;
}
<div class="fullpage">
  <div class="section">
 
    <div class="canvas-container">
      <canvas id="canvas1" style="border: 1px solid;width: 500px;height: 500px"></canvas>
    </div>
    <div class="furniture" style="padding: 20px;border: 1px solid;width: 460px">
      <h3>Drag the image to canvas</h3> 
      <img id="pic1" draggable="true" src="https://www.mve.com/media/Move_logo_-01.png" width="60">
      <img id="pic2" draggable="true" src="https://young.scot/media/8787/second-chances-logo-802x644.png" width="60">
    </div>
  </div>
  <div class="information"> </div>
  <button onclick="deleteobject()">Delete</button>
</div>
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>

<script src='https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.6/fabric.min.js'></script>

【问题讨论】:

    标签: javascript html css fabricjs


    【解决方案1】:

    您需要观察object:addedobject:removed 等事件。检查events demo

    演示

    function initCanvas() {
      $('.canvas-container').each(function(index) {
    
        var canvasContainer = $(this)[0];
        var canvasObject = $("canvas", this)[0];
    
        var imageOffsetX, imageOffsetY;
    
        function handleDragStart(e) {
          [].forEach.call(images, function(img) {
            img.classList.remove('img_dragging');
          });
          this.classList.add('img_dragging');
          var imageOffset = $(this).offset();
          imageOffsetX = e.clientX - imageOffset.left;
          imageOffsetY = e.clientY - imageOffset.top;
        }
    
        function handleDragOver(e) {
          if (e.preventDefault) {
            e.preventDefault();
          }
          e.dataTransfer.dropEffect = 'copy';
          return false;
        }
    
        function handleDragEnter(e) {
          this.classList.add('over');
        }
    
        function handleDragLeave(e) {
          this.classList.remove('over');
        }
    
        function handleDrop(e) {
          e = e || window.event;
          if (e.preventDefault) {
            e.preventDefault();
          }
          if (e.stopPropagation) {
            e.stopPropagation();
          }
          var img = document.querySelector('.furniture img.img_dragging');
          //console.log('event: ', e);
    
          var offset = $(canvasObject).offset();
          var y = e.clientY - (offset.top + imageOffsetY);
          var x = e.clientX - (offset.left + imageOffsetX);
    
          var newImage = new fabric.Image(img, {
            width: img.width,
            height: img.height,
            left: x,
            top: y,
            id: img.id
          });
          canvas.add(newImage);
          return false;
        }
    
        function handleDragEnd(e) {
          [].forEach.call(images, function(img) {
            img.classList.remove('img_dragging');
          });
        }
    
        var images = document.querySelectorAll('.furniture img');
        [].forEach.call(images, function(img) {
          img.addEventListener('dragstart', handleDragStart, false);
          img.addEventListener('dragend', handleDragEnd, false);
        });
        canvasContainer.addEventListener('dragenter', handleDragEnter, false);
        canvasContainer.addEventListener('dragover', handleDragOver, false);
        canvasContainer.addEventListener('dragleave', handleDragLeave, false);
        canvasContainer.addEventListener('drop', handleDrop, false);
      });
    }
    initCanvas();
    
    var canvas = new fabric.Canvas('canvas1', {
      selection: false
    });
    
    function deleteobject(){
      var selectedObject = canvas.getActiveObject();
      selectedObject && canvas.remove(selectedObject);
      
    }
    var infDiv = document.getElementsByClassName('information')[0];
    var objId = 0;
    canvas.on('object:added',function(options){
      var obj = options.target;
      obj.id = objId++;
      updateList();
    });
    canvas.on('object:removed',function(options){
      updateList();
    })
    function updateList(){
      infDiv.innerHTML = '';
      canvas.forEachObject(function(obj,i){
        var spanEl = document.createElement('span');
        spanEl.innerHTML = 'Object: '+(obj.id+1)+'->'+ 'width: '+obj.width+', height: '+obj.height+', id:'+obj.id+',x: '+obj.left+',y: '+obj.top+'<br>';
        infDiv.appendChild(spanEl);
      });
    }
    canvas{
      border:1px solid #000;
    }
    .information{
      width:200px;
      height:150px;
      border: 1px solid #eee;
    }
    <div class="fullpage">
      <div class="section">
     
        <div class="canvas-container">
          <canvas id="canvas1" style="border: 1px solid;width: 500px;height: 500px"></canvas>
        </div>
        <div class="furniture" style="padding: 20px;border: 1px solid;width: 460px">
          <h3>Drag the image to canvas</h3> 
          <img id="pic1" draggable="true" src="https://www.mve.com/media/Move_logo_-01.png" width="60">
          <img id="pic2" draggable="true" src="https://young.scot/media/8787/second-chances-logo-802x644.png" width="60">
        </div>
      </div>
      <div class="information"> </div>
      <button onclick="deleteobject()">Delete</button>
    </div>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>
    
    <script src='https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.6/fabric.min.js'></script>

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 2017-01-10
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2018-12-12
      • 2020-01-13
      • 1970-01-01
      • 2016-05-26
      相关资源
      最近更新 更多