【问题标题】:Fabric js - Do not add more than two text areas to the canvasFabric js - 不要在画布上添加两个以上的文本区域
【发布时间】:2021-05-14 11:44:53
【问题描述】:

在我的 Fabric js 4.3.1 项目中,我试图设置向画布添加文本的限制。我的目标是限制添加 2 个文本,每个文本区域一个。

这是我现在的代码,但它不能很好地工作,因为每次我在 textarea 中写入时,都会将一个文本添加到另一个之上,没有限制......

var canvas = this.__canvas = new fabric.Canvas('canvas');

$(function() {
            
            canvas.setHeight('300');
      canvas.setWidth('800');
      canvas.renderAll();
      
      fabric.Object.prototype.transparentCorners = false;
            fabric.Object.prototype.padding = 5;
            
            
            
            var textOptions = { 
              fontSize:16, 
              left:20,
              top:20, 
              radius:10, 
              borderRadius: '25px', 
              hasRotatingPoint: true 
            };
      
      var textOptions2 = { 
              fontSize:16, 
              left:20,
              top:50, 
              radius:10, 
              borderRadius: '25px', 
              hasRotatingPoint: true 
            };


            //TEXT 1
            $( "#AddTextCust" ).keyup(function() {
            var textObject = new fabric.IText($("#AddTextCust").val(), textOptions);
            if($.trim($(this).val()).length > 0){
            canvas.add(textObject);
            canvas.renderAll();
      }
            });

            document.getElementById('AddTextCust').addEventListener('keyup', function () {
              canvas.getActiveObject().text = document.getElementById('AddTextCust').value;
              canvas.renderAll();
            });
      
      
      //TEXT 2
      $( "#AddTextCust2" ).keyup(function() {
            var textObject = new fabric.IText($("#AddTextCust2").val(), textOptions2);
            if($.trim($(this).val()).length > 0){
            canvas.add(textObject);
            canvas.renderAll();
      }
            });

            document.getElementById('AddTextCust2').addEventListener('keyup', function () {
              canvas.getActiveObject().text = document.getElementById('AddTextCust2').value;
              canvas.renderAll();
            });
      
      
      
      });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/4.3.1/fabric.min.js"></script> 

<div id="contCanvasLogo" style="float:left;width:100%;">
 <canvas id="canvas" class="resize canvasLogo" style="width:500px;height:500px;border:1px solid #ccc;"></canvas>
 </div>
 
 <textarea id="AddTextCust" rows="3" cols="20"></textarea>
 <textarea id="AddTextCust2" rows="3" cols="20"></textarea>

如何设置此添加文本限制?

【问题讨论】:

  • 您的代码 sn-p 不起作用。但是,如果您看到在旧文本顶部绘制的新文本,我想您需要在调用 .renderAll() 之前清除画布。
  • 感谢您的回复。因此,当我在 textarea 上执行 keyup 时只添加一个文本,我该如何编写代码?
  • @Ouroborus 我的代码有效,请检查此小提琴jsfiddle.net/Jackom/d28cwokz/11。正如您所看到的,当我尝试编写重叠的文本时,我希望它只打印一次。
  • 用按钮确认输入怎么样
  • 我更新了我的小提琴:jsfiddle.net/Jackom/d28cwokz/34 使用 canvas.clear() 文本不重叠但清除所有元素并重置我的文本在画布中的位置,这对我不利。

标签: javascript html jquery html5-canvas fabricjs


【解决方案1】:

您正在为每个 keyup 事件添加一个新的 IText 对象。因此,fabric 正在渲染多个文本片段。 (您还有多个 keyup 事件处理程序对相同的对象执行大致相同的操作。)

您的原始代码:

            //TEXT 1
            $( "#AddTextCust" ).keyup(function() {
            var textObject = new fabric.IText($("#AddTextCust").val(), textOptions);
            if($.trim($(this).val()).length > 0){
            canvas.add(textObject);
            canvas.renderAll();
      }
            });

            document.getElementById('AddTextCust').addEventListener('keyup', function () {
              canvas.getActiveObject().text = document.getElementById('AddTextCust').value;
              canvas.renderAll();
            });

与其添加新的IText 对象,不如只创建一个并更新它。 (另外,删除keyup 事件处理程序之一):

            //TEXT 1
            const $addTextCust = $('#AddTextCust');
            const textObject = new fabric.IText($addTextCust.val(), textOptions);
            canvas.add(textObject);

            $addTextCust.keyup(function() {
              textObject.text = $addTextCust.val();
              canvas.renderAll();
            });

【讨论】:

  • 完美男人!请最后一件事!如果我想在画布中调整和移动这个字符串,我不能。为什么??谢谢
  • @Jackom Fabric.js 对象有一个.top.left 属性,可以用来偏移它们的位置。
  • 好吧,如果我想在使用 keyup 书写时更改画布中文本的不透明度,我该怎么办??
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 2015-06-25
  • 2017-11-10
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2016-04-21
相关资源
最近更新 更多