Google Blockly UI on jQuery 对话框不可编辑

Google Blockly UI on jQuery Dialog is not editable

在 jQuery 对话框中呈现 Blockly UI 时,它不允许编辑输入。

原因是 Blockly 添加一个 div 到 DOM,输入字段如下:

<div class="blocklyWidgetDiv" style="direction: ltr; display: block; left: 514.052px; top: 133.094px; width: 91.5547px;">
  <input class="blocklyHtmlInput" value="dfgfdgdfgdfg">
</div>

但实际的 blocklyDiv 附在 jQuery 对话框下。输入字段直接附加到 html 正文。

当我在 Dialog 中移动 blocklyWidgetDiv 时,它显示了页面中某处的输入字段,而不是在确切的编辑器位置呈现。

尝试使用以下代码根据您的面板调整 svg 的大小,重新初始化 svg 可能会奏效一段时间 Blockly.svgResize(Blockly.getMainWorkspace())

我同时发现并解决了我这边的问题

TL;DR:Blockly 工作区的其中一个容器的缩放系数不同于 1,这是导致任何输入元素的大小和位置错误的原因!

更长的解释

在输入期间通过 HTML 表单元素在其工作区内块状地覆盖 SVG 显示区域。虽然工作空间可以在文档深处的任何地方找到,但输入元素被放置在文档主体的直接子元素中(并且定位完全取决于 SVG 区域的位置)。如果任何工作区父级的缩放因子不为 1,则计算出的位置与实际位置不同,并且输入元素错位

可能的解决方案

  • 摆脱那个缩放因子(对我来说不可行,因为它是由我正在使用的库设置的)
  • 让 Blockly 开发人员将任何表单元素放置在靠近工作区的位置(例如,作为公共容器中最外层 SVG 元素的同级元素)——这将是最可靠的解决方案(因为“缩放”不是很好)这些天支持)
  • 正确支持“缩放”(这似乎不可行)
  • 编写一个可以正确重塑输入元素的 hack

很遗憾,我不得不选择最后一个。

我做了什么:

  • 让 MutationObserver 查找那些臭名昭著的表单元素并
  • 每当出现新的表单元素时,计算该元素的正确位置和大小(这有点棘手)
  • 然后给表单元素指定适当的大小和原始位置与适当位置的差异(因为该表单元素的容器也起到定位和调整大小的作用)
  • 此外,根据任何用户输入调整表单元素的大小
  • 并聆听布局的变化,例如由于 window 调整大小...

结果是一个奇怪的 hack,这就是为什么我不想向 public 显示代码 - 在很长一段时间内,我肯定会建议将表单元素放置在更靠近 Blockly 工作区的位置。 .

编辑:

不幸的是,这个 hack 无法解决当尝试将缩放因子远大于 1 的方块拖入垃圾桶时出现的问题。