blockly > 事件

事件命名空间

说明
BlockBase 与区块相关的任何事件的抽象类。
BlockChange 当某个分块的某些元素发生变化时(例如字段值、注释等)通知监听器。
BlockCreate 在创建块(或连接的块堆栈)时通知监听器。
BlockDelete 在删除某个分块(或连接的分块堆栈)时通知监听器。
BlockDrag 在手动拖放某个代码块时通知监听器。
BlockFieldIntermediateChange 当某个分块字段的值发生变化但尚未完成更改,并且预计会跟随分块更改事件时,通知监听器。
BlockMove 在移动某个代码块时通知监听器。这可以是从一个连接到另一个连接,也可以是从工作区的一个位置到另一个位置。
BubbleOpen 气泡打开事件的类。
点击 通知监听器某个块状元素已被点击。
CommentBase 评论事件的抽象类。
CommentChange 通知监听器工作区评论的内容已更改。
CommentCollapse
CommentCreate 通知监听器创建了工作区评论。
CommentDelete 通知监听器工作区评论已被删除。
CommentDrag 在手动拖放评论时通知监听器。
CommentMove 通知监听器工作区评论已移动。
CommentResize 通知监听器工作区评论已调整大小。
FinishedLoading 当工作区完成从 JSON/XML 反序列化后,通知监听器。
已选择 所选事件的类。通知监听器已选择新元素。
ThemeChange 通知监听器工作区主题已更改。
ToolboxItemSelect 通知监听器已选择某个工具箱项。
TrashcanOpen 在回收站打开或关闭时通知监听器。
UiBase 界面事件的基类。界面事件是指无需通过线程发送即可实现多用户编辑的事件(例如滚动工作区、缩放、打开工具箱类别)。界面事件无法撤消或重做。
VarBase 可变事件的抽象类。
VarCreate 通知监听器已创建变量模型。
VarDelete 通知监听器变量模型已被删除。
VarRename 通知监听器变量模型已重命名。
VarTypeChange 通知监听器变量的类型已更改。
ViewportChange

通知监听器工作区 Surface 的位置或缩放比例已更改。

当工作区本身调整大小时,不会发出通知。

抽象类

抽象类 说明
摘要 事件的抽象类。

枚举

枚举 说明
BubbleType
ClickTarget

函数

函数 说明
clearPendingUndo() 修改待处理的撤消事件,以便在这些事件触发时,它们不会进入撤消堆栈。由 Workspace.clearUndo 调用。
disable() 停止发送事件。对此函数的每次调用都必须调用 enable。
disableOrphans(event) 根据块是否已正确连接,设置块是否已停用。在所有块都应连接到顶部块的应用中使用此模式。
enable() 开始发送事件。除非在发出相应的停用调用时事件已停用。
filter(queue)

通过合并重复项、移除 null 事件和重新记录 BlockChange 事件来过滤队列中的事件。

此函数的历史记录:

此函数最初是在提交版本 cf257ea5 中添加的,目的是大幅减少分派的事件总数。最初,此问题仅会影响 BlockMove 事件,但后来又影响了其他事件。

添加了代码来重新排列提交 5578458 中添加的 BlockChange 事件,原因不明,但很可能是在尝试解决块更新期间事件排序问题时,仅部分成功。此代码可能应在合并和移除 null 之前添加到函数顶部,但出于现在已忘记的原因,被添加到了底部。如需更详细地了解根本问题以及因此不完整/不正确的修复而导致的一些失败情况,请参阅以下 bug 调查:

https://github.com/google/blockly/issues/8225#issuecomment-2195751783 https://github.com/google/blockly/issues/2037#issuecomment-2209696351

后来,在 PR #1205 中,原始的 O(n^2) 实现被线性时间实现取代,但随后又进行了其他修复。

2024 年 8 月,我们对许多流程进行了重大简化:

此函数之前是从 Workspace.prototype.undo 调用的,但此函数对事件的更改是导致问题 7026 的原因(请注意,事件在反向顺序与正向顺序下会组合不同)。最初为此问题选择的解决方法是在 fireNow 中添加了代码(在 PR #7069 中),以对刚刚参与调度事件的任何工作区的 .undoStack_ 和 .redoStack_ 进行后续过滤;这显然解决了问题,但增加了相当多的额外复杂性,并且难以推理撤消/重做事件的处理方式,因此移除了从撤消调用和后处理代码,并将 forward=true 设为默认值,同时废弃了使用 forward=false 调用函数的做法。

同时,用于重新排列 BlockChange 事件的存在 bug 的代码已替换为通过 fireInternal 调用的 enqueueEvent 新函数中提供的功能的 bug 较少的版本,从而确保在调用过滤器时事件将按正确的顺序排列。

此外,我们修改了事件合并代码,以便仅合并紧挨的事件。这简化了实现,同时确保了事件合并不会导致事件重新排序。

fire(event)

将事件加入队列,以便分派给更改监听器。

注意:

- 事件会加入队列,直到超时为止(通常是在渲染完成后或当前微任务结束时,如果未在浏览器中运行)。- 加入队列的事件会与之后加入队列的事件组合,从而发生破坏性修改,但仅在事件触发之前。- 事件会通过受影响工作区的 fireChangeListener 方法分派。

fromJson(json, workspace) 将 JSON 解码为事件。
get(eventType) 从注册表中获取特定事件类型的类。
getGroup() 当前组。
getRecordUndo() 返回事件是否会添加到撤消堆栈。
isEnabled() 返回是否可以触发事件。
setGroup(state) 开始或停止组合。
setRecordUndo(newValue) 设置是否应将事件添加到撤消堆栈。

接口

接口 说明
AbstractEventJson
BlockBaseJson
BlockChangeJson
BlockCreateJson
BlockDeleteJson
BlockDragJson
BlockFieldIntermediateChangeJson
BlockMoveJson
BubbleOpenJson
ClickJson
CommentBaseJson
CommentChangeJson
CommentCollapseJson
CommentCreateJson
CommentDragJson
CommentMoveJson
CommentResizeJson
SelectedJson
ThemeChangeJson
ToolboxItemSelectJson
TrashcanOpenJson
VarBaseJson
VarCreateJson
VarDeleteJson
VarRenameJson
VarTypeChangeJson
ViewportChangeJson

变量

变量 说明
BLOCK_CHANGE
BLOCK_CREATE
BLOCK_DELETE
BLOCK_DRAG
BLOCK_FIELD_INTERMEDIATE_CHANGE
BLOCK_MOVE
BUBBLE_OPEN
BUMP_EVENTS

导致对象被弹回到工作区的可见部分的事件列表。

请勿与“bumping”混淆,以免断开连接的连接看起来仍处于连接状态。

更改
点击
COMMENT_CHANGE
COMMENT_CREATE
COMMENT_DELETE
COMMENT_DRAG
COMMENT_MOVE
COMMENT_RESIZE
创建
DELETE
FINISHED_LOADING
MOVE
已选
THEME_CHANGE
TOOLBOX_ITEM_SELECT
TRASHCAN_OPEN
界面
VAR_CREATE
VAR_DELETE
VAR_RENAME
VIEWPORT_CHANGE

类型别名

类型别名 说明
BumpEvent

导致对象被弹回到工作区的可见部分的事件类型。

请勿与“bumping”混淆,以免断开连接的连接看起来仍处于连接状态。