将fabric.js和jQuery结合使用时将图像拖放到画布上不起作用

NikkiBdraws

我正在尝试设置fabric.js画布,以便用户可以将图像文件从其系统拖放到画布上。在寻找一种方法时,我发现了这支笔,它可以正常工作,但是我也在使用jQuery,我想在文档的开头创建主要的变量/函数,并在以后根据需要调用它们上。

当我重新组织代码以匹配我的设置时,放置功能将停止工作。这是一支笔或小提琴,如果您愿意的话),它模仿了我要使用的设置。

这是我基于此的笔的放置功能:

var canvas_container = document.getElementById('canvas-container');
        var canvas = new fabric.Canvas('c');
        var ctx = canvas.getContext('2d');
        canvas_container.addEventListener('drop', function (e) {
            console.log("DROP");
            e = e || window.event;
            if (e.preventDefault) {
                e.preventDefault();
            }
            var dt = e.dataTransfer;
            var files = dt.files;
            for (var i=0; i<files.length; i++) {
                var file = files[i];
                var reader = new FileReader();

                //attach event handlers here...
                reader.onload = function (e) {
                    var img = new Image();
                    img.src = e.target.result;
                    var imgInstance = new fabric.Image(img, {
                        left: 100,
                        top: 100,
                    });
                    canvas.add(imgInstance);
                }
                reader.readAsDataURL(file);
            }

            return false;
        });

我想要使​​用的设置:

var $main = $('#content'), 
  canvas = new fabric.Canvas('canvas', {
    width: 400,
    height: 550
  }),
dropImage = function (e) {
    var dt = e.originalEvent.dataTransfer,
        files = dt.files;
    e = e || window.event;
    e.preventDefault();
    e.stopPropagation();
    console.log("Drop started");
    $('.refs').removeClass('highlight');
    canvas.remove(introTxt);

    //Loop through files
    for (var i=0; i<files.length; i++) {
      var file = files[i],
          reader = new FileReader();
      reader.onload = loadReader(e);
      reader.readAsDataURL(file);
    }
    function loadReader(e) {
        var img = new Image();
        img.src = e.target.result;
        var imgInstance = new fabric.Image(img, {
          left: 100,
          top: 100
        });
        canvas.add(imgInstance);
        console.log('Images found');
    }
    console.log('Drop done');
  };
  $main.on('drop', dropImage);

控制台上将记录“已完成”文本,但画布上实际上未显示任何图像。我完全为为什么这不起作用而感到困惑。

此外,这将是Photoshop扩展的一部分,而Adobe扩展可在Chromium上运行。因此,这仅需要在Chrome中运行。

杜尔加

在您的放置处理程序中,您需要执行

reader.onload = loadReader;

并在图像onload事件上将图像添加到画布

function loadReader(event) {
  var img = new Image();
  img.src = event.target.result;
  img.onload = function(){
    var imgInstance = new fabric.Image(img, {
      left: 100,
      top: 100
    });
    canvas.add(imgInstance);
  }
}

这是更新的jsfiddle

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章