gpt4 book ai didi

javascript - 如何在 FabricJS 上复制/粘贴后保持 IText 可编辑?

转载 作者:行者123 更新时间:2023-11-29 23:50:15 25 4
gpt4 key购买 nike

我想用 FabricJS 复制/粘贴对象,问题是当我复制和粘贴 I 文本时,它变得不可编辑,我想让它可编辑。

这是 JsFiddle:http://jsfiddle.net/7Hsdh/11/

Javascript:

var canvas = new fabric.Canvas('paper');

// adding text on canvas
var text = new fabric.Text('Normal Uneditable Text', {
left: 100,
top: 150,
fontFamily: 'Arial',
fontSize: 15,
fill: '#333'
});
canvas.add(text);

var text = new fabric.IText('IText : not editable anymore once copy/pasted why?', {
left: 10,
top: 50,
fontFamily: 'Arial',
fontSize: 20,
fill: '#333'
});
canvas.add(text);


canvas.renderAll();


createListenersKeyboard();
function createListenersKeyboard() {
document.onkeydown = onKeyDownHandler;
}

function onKeyDownHandler(event) {
var key;
if(window.event){
key = window.event.keyCode;
}
else{
key = event.keyCode;
}

switch(key){
case 67: // Ctrl+C
if(event.ctrlKey){
event.preventDefault();
copy();
}
break;
case 86: // Ctrl+V
if(event.ctrlKey){
event.preventDefault();
paste();
}
break;

default:
// TODO
break;
}
}

var copiedObject,
copiedObjects = new Array();
function copy(){
copiedObjects = new Array();
if(canvas.getActiveGroup()){
canvas.getActiveGroup().getObjects().forEach(function(o){
var object = fabric.util.object.clone(o);
copiedObjects.push(object);
});
}
else if(canvas.getActiveObject()){
var object = fabric.util.object.clone(canvas.getActiveObject());
copiedObject = object;
copiedObjects = new Array();
}
}

function paste(){
if(copiedObjects.length > 0){
for(var i in copiedObjects){
copiedObjects[i]=fabric.util.object.clone(copiedObjects[i]);
copiedObjects[i].set("top", copiedObjects[i].top+100);
copiedObjects[i].set("left", copiedObjects[i].left+100);
canvas.add(copiedObjects[i]);
canvas.item(canvas.size() - 1).hasControls = true;
}
}
else if(copiedObject){
copiedObject= fabric.util.object.clone(copiedObject);
copiedObject.set("top", 10);
copiedObject.set("left", 10);
canvas.add(copiedObject);
canvas.item(canvas.size() - 1).hasControls = true;
}
canvas.renderAll();
}

问题出在哪里,我该如何解决它,以便我也可以复制/粘贴 Itext 并保持原样,而不是将其转换为简单文本?

最佳答案

如果不深入研究 FabricJS 代码,我无法回答“为什么”(我猜这是你问题的一部分)——但我相信如果你真的想知道,你可以自己深入研究 FabricJS 代码.

但是,这里需要对您的代码进行一些调整以使其适合您:

function paste() {
if (copiedObjects.length > 0) {
for (var i in copiedObjects) {
if (/text/.test(copiedObjects[i].type)) {
canvas.add(new fabric.IText(copiedObjects[i].text, {
left: copiedObjects[i].left + 100,
top: copiedObjects[i].top + 100,
fontFamily: copiedObjects[i].fontFamily,
fontSize: copiedObjects[i].fontSize,
fill: copiedObjects[i].fill
}));
} else {
copiedObjects[i] = fabric.util.object.clone(copiedObjects[i]);
copiedObjects[i].set("top", copiedObjects[i].top + 100);
copiedObjects[i].set("left", copiedObjects[i].left + 100);
canvas.add(copiedObjects[i]);
}
canvas.item(canvas.size() - 1).hasControls = true;
}
} else if (copiedObject) {
if (/text/.test(copiedObject.type)) {
canvas.add(new fabric.IText(copiedObject.text, {
left: 10,
top: 10,
fontFamily: copiedObject.fontFamily,
fontSize: copiedObject.fontSize,
fill: copiedObject.fill
}));
} else {
copiedObject = fabric.util.object.clone(copiedObject);
copiedObject.set("top", 10);
copiedObject.set("left", 10);
canvas.add(copiedObject);
}
canvas.item(canvas.size() - 1).hasControls = true;
}
canvas.renderAll();
}

我的猜测,IText 背后的底层对象实际上只是一个普通的旧 Text 对象,带有一个覆盖层以使其响应键盘/鼠标事件。

这是您的 JSFiddle 更新,http://jsfiddle.net/7Hsdh/13/ .

希望对你有所帮助,伙计!

关于javascript - 如何在 FabricJS 上复制/粘贴后保持 IText 可编辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42925401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com