如何在FabricJS中为IText对象添加按键监听器?

时间:2018-08-10 03:55:36

标签: fabricjs fabricjs2

我目前有此代码

fabric.IText.prototype.keysMap[13] = 'onEnterKeyPress';
fabric.IText.prototype.onEnterKeyPress = (e) => {
  console.log('onEnterKeyPress', e);
  // this.insertChars(e);
  // fabric.IText.insertChars(e);
  // return true;
  // return e;
};
  
let canvas = new fabric.Canvas('canvas', {
  preserveObjectStacking: true,
  width: 980,
  height: 600
});

let itext = new fabric.IText(
  'Edit this text',
  {
    editable: true,
    left: 100,
    top: 100,
    fontSize: 24
  }
);

canvas.add(itext);
canvas.requestRenderAll();
<html>
  <body>
    <canvas id="canvas"></canvas>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.3.4/fabric.min.js"></script>
  </body>
</html>

问题是,一旦我附加了按键监听器,如果我按Enter键,它就会触发函数回调,但不会在文本中添加回车符。

如果我删除按键监听器,它会恢复正常,即在回车键上添加回车符。

似乎我在附加按键监听器时必须手动添加回车符?不确定怎么做。

谢谢。

顺便说一句,我正在使用最新的FabricJS 2.3.4

1 个答案:

答案 0 :(得分:1)

您可以覆盖onKeyDown,然后调用原始方法。

演示*

fabric.IText.prototype.onKeyDown = (function(onKeyDown) {
  return function(e) {
    if (e.keyCode == 13)
      console.log('enter key');
    onKeyDown.call(this, e);
  }
})(fabric.IText.prototype.onKeyDown)

let canvas = new fabric.Canvas('canvas', {
  preserveObjectStacking: true,
  width: 980,
  height: 600
});

let itext = new fabric.IText(
  'Edit this text', {
    editable: true,
    left: 100,
    top: 100,
    fontSize: 24
  }
);

canvas.add(itext);
canvas.requestRenderAll();
<html>
  <body>
    <canvas id="canvas"></canvas>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.3.4/fabric.js"></script>
  </body>
</html>