fix(submit): show body placeholder on first load and restore caret on blank clicks

两个前台投稿编辑器的缺陷,根因都在占位符的实现方式:

1. 首次加载不显示占位符,输入一个再删掉才出现。
   旧实现往正文插了一个 data-mce-bogus 占位段落,而 TinyMCE 在
   setContent(studio 初始化时必调)与清理 bogus 元素时会把它移除。

2. 光标在块级结构里时,点击正文空白处无法落回正文。
   占位段落占着首行、且 pointer-events:none,点击落不到可编辑元素上;
   正文以表格 / 代码块这类结构块结尾时也没有可承载光标的段落。

改为 front-submit-editor-basics.js(替换 front-submit-placeholder.js):
- 占位符改成 body 属性 + content CSS 的 ::before,正文 DOM 不含占位节点;
- 点击空白处(事件目标是 body)且光标不在普通文本里时,补一个可编辑尾段
  并把光标放进去;
- 两份 content CSS 让 html/body 撑满编辑区,studio 的 syncEditorHeight
  以编辑器声明高度为下限,空正文时 iframe 不会缩成一行。

新增 tests/widget-system/submit-placeholder-behavior.test.cjs(jsdom 跑真实插件)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
kate522andClaude Opus 5 committed 2026-11-09 20:38:02 +08:00
1 parent c2733017fd
commit 5afa7ab9df
10 files changed
+428 -172

No files matched your search

+7 -7
View File
@@ -76,9 +76,9 @@ final class CreatorStudio {
$payload = $this->bootstrap();
$payload['creator']['contentCss'] = $content_css_url;
// WordPress 打包的 TinyMCE 4.9 不含 placeholder 插件,
// 占位符由主题插件实现,地址交给编辑器初始化。
$payload['creator']['placeholderPlugin'] = $this->placeholder_plugin_url();
// 占位符与空白处落光标由主题插件实现(TinyMCE 4.9 没有 placeholder 插件),
// 地址交给编辑器初始化。
$payload['creator']['editorBasicsPlugin'] = $this->editor_basics_plugin_url();
$tinymce_data = $this->tinymce_payload($payload);
if (file_exists($plugin_path)) {
@@ -125,17 +125,17 @@ final class CreatorStudio {
}
/**
* 正文占位符插件地址(带文件时间戳做缓存失效)。
* 正文基础插件地址(占位符 + 空白处落光标,带文件时间戳做缓存失效)。
*/
private function placeholder_plugin_url(): string {
$path = get_template_directory() . '/assets/js/front-submit-placeholder.js';
private function editor_basics_plugin_url(): string {
$path = get_template_directory() . '/assets/js/front-submit-editor-basics.js';
if (!file_exists($path)) {
return '';
}
return (string) add_query_arg(
'ver',
(string) filemtime($path),
get_template_directory_uri() . '/assets/js/front-submit-placeholder.js'
get_template_directory_uri() . '/assets/js/front-submit-editor-basics.js'
);
}