如何编写Confluence用户宏批量完成页面内联任务?
解决Confluence内联任务一键标记完成的用户宏问题
你的代码模拟点击无效,核心原因是Confluence内联任务的状态变更依赖内部封装的事件逻辑或API,单纯触发click事件无法触发完整的状态同步流程(包括后端数据更新和前端样式切换)。以下是两种可行的解决方案:
方案一:调用Confluence内部API(推荐)
直接使用Confluence官方提供的AJS.InlineTasks工具类来完成任务,确保前端状态和后端数据同步:
## Macro title: Check All Tasks ## Macro has a body: N ## Date created: 2022-07-08 ## Installed by: R. ## @noparams <a id="toggleAll" href="#">Check all tasks</a> <script type="text/javascript"> AJS.toInit(function () { AJS.$('#toggleAll').click(function(e) { // 阻止默认跳转行为 e.preventDefault(); // 遍历所有内联任务列表 AJS.$('.inline-task-list').each(function() { var contentId = AJS.$(this).data('inline-tasks-content-id'); // 筛选未完成的任务 var $unfinishedTasks = AJS.$(this).find('li[role="checkbox"][aria-checked="false"]'); $unfinishedTasks.each(function() { var taskId = AJS.$(this).data('inline-task-id'); // 调用Confluence内部API标记任务完成 if (AJS.InlineTasks && typeof AJS.InlineTasks.toggleTask === 'function') { AJS.InlineTasks.toggleTask(contentId, taskId, true); } }); }); }); }); </script>
方案二:模拟完整交互(降级方案)
如果Confluence版本不支持AJS.InlineTasks API,可以通过模拟完整的鼠标交互事件,同时手动更新前端状态:
## Macro title: Check All Tasks ## Macro has a body: N ## Date created: 2022-07-08 ## Installed by: R. ## @noparams <a id="toggleAll" href="#">Check all tasks</a> <script type="text/javascript"> AJS.toInit(function () { AJS.$('#toggleAll').click(function(e) { e.preventDefault(); AJS.$('li[role="checkbox"][aria-checked="false"]').each(function() { var $task = AJS.$(this); // 模拟完整的鼠标交互序列 $task.trigger('mousedown').trigger('mouseup'); // 更新ARIA属性和完成状态类 $task.attr('aria-checked', 'true'); $task.addClass('inline-task-checked'); }); }); }); </script>
关键说明
- Confluence内联任务的完成状态由
aria-checked="true"和inline-task-checked类共同控制,后者会替换未完成状态的背景图 - 方案一优先使用官方API,能确保任务状态同步到Confluence后端,刷新页面后不会丢失;方案二仅更新前端状态,刷新后会还原
- 代码中使用
AJS.$而非原生jQuery或document,是为了兼容Confluence的内部JS环境
内容的提问来源于stack exchange,提问作者Raphael
相关产品推荐
相关产品推荐

