我正在尝试设置fabric.js画布,以便用户可以将图像文件从系统拖放到画布上。在寻找一种方法时,我发现this pen,它可以正常工作,但我也使用jQuery,我喜欢在文档的开头创建我的主变量/函数并调用它们以后需要。
当我重新组织代码以匹配我的设置时,drop函数停止工作。 Here's a pen(or a fiddle,如果您愿意),模仿我想要使用的设置。
以下是笔的掉落功能我的基础是:
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);
“Drop done”文本记录在控制台上,但画布上实际上没有显示任何图像。我完全不知道为什么这不起作用。
此外,这将是Photoshop扩展程序的一部分,Adobe扩展程序在Chromium上运行。因此,这只需要在Chrome中运行。
答案 0 :(得分:0)
你需要做的drop处理程序
reader.onload = loadReader;
在image 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