通过数字输入更改对象属性(左、上、半径等)后的奇怪 "mouse:over" 行为

Strange "mouse:over" behavior after changing object attributes (left, top, radius etc.) via numeric input

我对 JavaScript 编程和 FabricJS 还很陌生(我现在只学习了大约一个月)所以请多多包涵。

我正在尝试使用 FabricJS 创建一个用户界面,其基本功能如下所述:

  1. 用户创建了一个新的圈子对象
  2. 用户select创建的圈子对象
  3. 用户可以使用边界框修改 selected 对象(像往常一样)
  4. 在 select 编辑圆形对象后,位于 canvas 旁边的侧边栏会使用 selected 对象的参数动态更新(在本例中为 X(左)、Y(顶部)和半径参数)。为此,用户需要在右侧的输入框中输入新的所需值,然后单击“更新”按钮。

这由 switch case 处理:

 case 'circle':
      if (rows <= 1) {
        //------------------------------PARAMETER VARIABLES-----------------------------------------------------
        var x = Math.round(activeObj.get("left"));
        var y = Math.round(activeObj.get("top"));
        var r = Math.round(activeObj.get("radius"));
        //------------------------------DYNAMIC PARAMETERS------------------------------------------------------
        $('#parameter_input_table tbody').append("<tr><td>X</td><td><input type=\"text\" id=\"x_table\" value=\"" + x + "\"></td></tr>");
        $('#parameter_input_table tbody').append("<tr><td>Y</td><td><input type=\"text\" id=\"y_table\" value=\"" + y + "\"></td></tr>");
        $('#parameter_input_table tbody').append("<tr><td>R</td><td><input type=\"text\" id=\"r_table\" value=\"" + r + "\"></td></tr>");
        $('#parameter_input_table tbody').append("<tr><td><button id=\"btn_submit\">Update</button></td></tr>")

        //------------------------------HANDLERS------------------------------------------------------------------
        //add event listeners for numeric input
        $('#parameter_input_table tbody tr td input').eq(0).on('input', function() {
          x = this.value;
          activeObj.set({
            left: x
          });
          activeObj.setCoords();
          canvas.requestRenderAll();
        });
        $('#parameter_input_table tbody tr td input').eq(1).on('input', function() {
          y = this.value;
          activeObj.set({
            top: y
          });
          activeObj.setCoords();
          canvas.requestRenderAll();
        });
        $('#parameter_input_table tbody tr td input').eq(2).on('input', function() {
          r = this.value;
          activeObj.set({
            radius: r
          });
          activeObj.setCoords();
          canvas.requestRenderAll();
        });
        $('#parameter_input_table tbody tr #btn_submit').on('click', function() {
          activeObj.set({
            left: x,
            top: y,
            radius: r
          });
          activeObj.setCoords();
          canvas.discardActiveObject().requestRenderAll();
        });
      }
      break;
  1. 此外,用户可以通过按键盘上的“Delete”键删除当前select编辑的对象。

我创建了一个工作 Fiddle,其中基本上实现了上述所有功能。

Fiddle: Changing FabricJS object parameters using numeric input

但是,我 运行 遇到了一个奇怪的问题,即通过数字输入更新值会导致光标在 “错误” 处变为移动光标尽管在修改对象后调用了 setCoords() 仍放置。

自己试试吧,你会明白我的意思:打开Fiddle、select默认圆圈,更改右侧的值并点击更新。您可能会看到光标以某种方式做出反应,就好像“鼠标悬停”事件是在新圆圈的假定边界框之外触发的。

当前解决方法:

但显然这不是一个好的解决方法。

我也试过删除 activeObject 并在更新按钮后创建一个新对象,其值保存在 x、y 和 r 中。问题仍然存在。

如果有人可以帮助我解决此问题 issue/direct 我进行现有的讨论(如果这个问题之前已经出现过),我将不胜感激。

当使用来自输入的值时,您需要使用 parseInt() 将值从字符串转换为整数。

x = parseInt(this.value);
activeObj.set({
   left: x
});