# 发帖时是否需要用户填写表单？

**URL:** https://meta.discourse.org/t/have-users-complete-form-when-creating-a-topic/162378
**Category:** Feature
**Tags:** completed
**Created:** [2020年八月28日 19:08 UTC](https://meta.discourse.org/t/have-users-complete-form-when-creating-a-topic/162378 "2020-08-28T19:08:29Z")
**Posts on this page:** 1
**Showing post:** 4

<div class="post-metadata">

### Author: ![JQ331](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@JQ331](https://meta.discourse.org/u/JQ331)
#### Post date: [2020年八月31日 12:01 UTC](https://meta.discourse.org/t/have-users-complete-form-when-creating-a-topic/162378/4 "2020-08-31T12:01:25Z")

</div>

谢谢。

> [@sam](#):
>
> 这些内容在主题组件中从技术上来说肯定是可行的。

你认为它该如何实现呢？

以下是我的一些想法，不过其中仍有一些问题需要解决：

> **目前的基础功能：占位符。但现在是“全有或全无”的模式**
>
> 我能想到的最接近表单行为的基本结构是，在编辑器（即点击“创建主题”时出现的“d-editor”）中显示该“表单”。
> 
> 在该编辑器中，你可以提供不同的“部分”，例如：
> 
> 姓名
> 
> * * *
> 
> 地点
> 
> * * *
> 
> 问题
> 
> * * *
> 
> 每个部分的标题将作为一个占位符，因此当用户点击它时，标题（例如“姓名”）就会消失。
> 
> 到目前为止，通过 [占位符文本主题组件](https://meta.discourse.org/t/topic-template-placeholder-text-theme-component/149053/47) 已经可以实现这种设置。
> 
> 但是，这还不足以实现类似表单的行为，因为目前存在的占位符是“全有或全无”的，正如我接下来要描述的那样。

* * *

> **类似表单的占位符行为。但如何访问编辑器中的 div？**
>
> 为了使其更像表单，每个部分必须能够独立运作。
> 
> 目前，使用占位符文本主题组件时，它是“全有或全无”的——如果用户点击编辑器，所有占位符标题都会消失。
> 
> 因此，要实现基本的表单行为，我们不能让所有标题同时出现或消失，而是需要让每个占位符标题部分独立运作。这样，当用户点击“姓名”占位符时，只有该占位符会消失，而其他占位符（“地点”和“问题”）则保留。
> 
> 如果每个占位符都能成为文本编辑器内具有唯一 ID 的独立 div 的一部分，那么上述功能就可以实现。然后，借助 jQuery，你可以根据用户是否点击了相应区域来显示或隐藏占位符。这需要在当前为 textarea 的内容中添加独立的 div，但我不确定如何实现这一点。
> 
> _ **此方案的疑问：如何访问编辑器 textarea 内的 div，以便在用户点击它们时执行相应操作？** _

* * *

> **替代方案：使用现有的模板文本选项。但如何使文本不可编辑？**
>
> 另一种可能的方案是，当用户点击时，部分标题不会“消失”。也就是说，部分标题（例如：姓名、地点和问题）将作为保留在页面上的文本。与当前基本主题模板的默认设置相比，为了使其更像表单：
> 
> 1. 部分标题文本不能被用户编辑（即设置 `contenteditable="false"`）
> 2. 部分分隔符不能被用户删除
> 3. 在部分标题下方应有明显的空间供用户输入。在当前默认模板中，用户必须将光标移至文本处，按 `回车` 键才能创建输入空间。
> 
> _**此方案的疑问：如何输入模板文本，同时满足以下两点：(i) 该文本对用户不可编辑，(ii) 在每个文本块下方为用户留出清晰的输入区域？**_

* * *

也许还有更好的方法来实现类似表单的行为？

---

_[View the full topic](https://meta.discourse.org/t/have-users-complete-form-when-creating-a-topic/162378)._
