# 使用 jQuery 无法为主题页面元素添加新类吗？

**URL:** https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568
**Category:** Development
**Created:** [2021年二月5日 16:19 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568 "2021-02-05T16:19:35Z")
**Posts on this page:** 17
**Page:** 1

<div class="post-metadata">

### Author: ![cosdesign](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cosdesign/32/208585_2.png) [@cosdesign](https://meta.discourse.org/u/cosdesign)
#### Post date: [2021年二月5日 16:19 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/1 "2021-02-05T16:19:35Z")

</div>

我在学习 Discourse 的工作原理时遇到了困难，即使[阅读了这篇文章](https://meta.discourse.org/t/developer-s-guide-to-discourse-themes/93648)后仍然感到困惑。我试图使用 jQuery 在帖子页面为管理员用户名添加动态标题，但无法生效。

不过，如果我将选择器改为 body 标签并添加一个类，它就能正常工作。  
那么，能否有人解释一下为什么上面的代码无法工作？  
顺便提一下，这段代码是插入在 header 选项卡中的。

```html
<script>
  $(".names span.admin a").attr('title', 'Community Admin');
</script>

```

我是否需要将其注入到插件出口（plugin outlet）或其他地方？

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月5日 19:45 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/2 "2021-02-05T19:45:04Z")

</div>

> [@cosdesign](#):
>
> 那么，有人能解释一下为什么无法正常工作吗？

很可能是因为在这种情况下，jQuery 与 Ember 和 Widget 渲染管道之间存在兼容性问题。

你看，在这个脚本中，你无法控制它何时触发，也无法控制它在 JavaScript 应用绘制屏幕时处于哪个阶段。

不过，有一个 JavaScript API 方法可以解决这个问题，详情请点击这里：

[decorateWidget()](https://meta.discourse.org/t/developer-s-guide-to-discourse-themes/93648#heading--4-c-6)

以及这个特定的 Widget：

> <https://github.com/discourse/discourse/blob/015ea287785dacfa1866e677a49f2edf177e1e8f/app/assets/javascripts/discourse/app/widgets/poster-name.js#L37>

不过，在深入这个复杂问题之前，我们先退一步，你只是想要显示一个头衔吗？

例如，在 Jeff 的帖子中：

 ![image](https://global.discourse-cdn.com/meta/original/3X/2/b/2b53857ab111de3b6602714df2d0cb273025741a.png)

他的头衔是：“联合创始人”。

只需创建一个新群组，添加管理员，然后前往“管理” =\> “成员资格”，编辑“默认头衔”。

现在，他们可以在账户设置的“偏好设置”中选择此头衔（或者你也可以为他们设置）。

 ![image](https://global.discourse-cdn.com/meta/original/3X/6/e/6eb7f7cfd350a663bbb08cf7140fdc5818d01271.png)

你也可以用这种方法来显示特殊的头像标识（上述截图也演示了这一点）。

显然，如果你不希望这样“固定”显示，那就只能走代码定制的路子了。但毫无疑问，你也会同意，当前的方法要省力得多。

---

<div class="post-metadata">

### Author: ![cosdesign](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cosdesign/32/208585_2.png) [@cosdesign](https://meta.discourse.org/u/cosdesign)
#### Post date: [2021年二月5日 20:13 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/3 "2021-02-05T20:13:32Z")

</div>

谢谢你的帮助。这并非我要查找的实际论坛标题，但我希望在这个仅管理员可见的小皇冠图标上悬停时显示标题：

 ![image](https://global.discourse-cdn.com/meta/original/3X/d/3/d3a6b410ecf7b5c797f88cc08d7ccd7d1dbce730.png)

顺便提一下，对应的 CSS 代码如下：

```
.names span.admin a::after {
content: "";
width: 17px;
height: 14px;
margin-left: 5px;
background-image: url(https://www.dropbox.com/s/0oi0y3ex3rtfvk5/cd-crown.svg?raw=1);
background-repeat: none;
display: inline-block;
position: relative;

```

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月5日 20:22 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/4 "2021-02-05T20:22:55Z")

</div>

不错。

听起来你可能需要考虑使用小部件（widget）方案。

另外，还可以考虑这个 API 方法：

```plaintext
api.reopenWidget("poster-name", {

      html() {
          <<your-code-here-but-consider-using-the-original-as-template>>
      }
}

```

我建议你参考：[A tour of how the Widget (Virtual DOM) code in Discourse works](https://meta.discourse.org/t/a-tour-of-how-the-widget-virtual-dom-code-in-discourse-works/40347)

在 Discourse 中实现这类功能需要付出更多的精力，因为它是一个自动化的 Web 应用；但一旦正确实现，解决方案将非常稳健。

---

<div class="post-metadata">

### Author: ![cosdesign](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cosdesign/32/208585_2.png) [@cosdesign](https://meta.discourse.org/u/cosdesign)
#### Post date: [2021年二月5日 20:33 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/5 "2021-02-05T20:33:40Z")

</div>

太棒了，非常感谢。我会仔细查看，如果成功了就发布解决方案。乍一看，Discourse 在定制方面显得非常吓人，我还以为 WordPress 很难呢。不过，一旦我熟悉了这些插件和模板，我相信一切都会变得容易起来。

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月5日 20:35 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/6 "2021-02-05T20:35:57Z")

</div>

实际上， boom，也许还有一个更简单的解决方案：

考虑使用这个 API 方法来替换普通的版主盾牌图标：

```plaintext
api.replaceIcon('shield-alt', 'crown');

```

然后修改这里的工具提示文本：

 ![image](https://global.discourse-cdn.com/meta/original/3X/9/a/9a4a6492a40be79553469ba1c78bbda26a6426b3.png)

到了这一步，你原来的 CSS 可能就多余了（不过你仍然可以重新给图标上色）。

---

<div class="post-metadata">

### Author: ![cosdesign](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cosdesign/32/208585_2.png) [@cosdesign](https://meta.discourse.org/u/cosdesign)
#### Post date: [2021年二月5日 20:44 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/7 "2021-02-05T20:44:05Z")

</div>

但这会移除版主旁边的盾牌图标，对吧？因为我不希望这样。我需要只为管理员添加皇冠图标和悬停文本，因为在帖子页面上他们目前没有任何图标。

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月5日 20:48 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/8 "2021-02-05T20:48:30Z")

</div>

啊，是的，我已经习惯了那些我既是版主又是管理员的网站。如果将这些角色分开（即管理员永远不是版主），那就不行了。你需要赋予管理员版主权限。

所以，请探索其他选项。

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月5日 21:00 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/9 "2021-02-05T21:00:53Z")

</div>

试试这个：

```javascript
api.reopenWidget("poster-name", {
  posterGlyph(attrs) {
    if (attrs.moderator || attrs.groupModerator) {
      return iconNode("shield-alt", {
        title: I18n.t("user.moderator_tooltip"),
      });
    }
    if (attrs.admin) {
      return iconNode("crown", {
        title: I18n.t("user.admin_tooltip"),
      });
    }
  }
})

```

以及

 ![image](https://global.discourse-cdn.com/meta/original/3X/5/4/546c4a86772df0b2391d58453fa35ff9feb0e5e4.png)

对我有效：

 ![image](https://global.discourse-cdn.com/meta/original/3X/f/6/f62690f10f765a4361d6e35d844b400fe83c2951.png)

在这种情况下，第一个用户既是管理员又是版主，第二个用户只是管理员。你可以完善这个逻辑；通过调整 if 语句的顺序，让皇冠图标优先显示。

---

<div class="post-metadata">

### Author: ![cosdesign](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cosdesign/32/208585_2.png) [@cosdesign](https://meta.discourse.org/u/cosdesign)
#### Post date: [2021年二月5日 21:25 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/10 "2021-02-05T21:25:41Z")

</div>

听起来是个解决方案，但正如我所说的，我对自定义 Discourse 还很陌生……能否请您具体说明一下，我应该把您的代码粘贴到哪里？因为我到目前为止还没有尝试过任何 API 方法。

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月5日 21:27 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/11 "2021-02-05T21:27:50Z")

</div>

请稍等，我会为您妥善构建这个。

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月5日 22:25 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/12 "2021-02-05T22:25:41Z")

</div>

好的，这现在是一个主题组件：

> **[GitHub - merefield/discourse-tc-staff-icons: A simple Theme Component that places a crown icon...](https://github.com/merefield/discourse-tc-staff-icons)**
>
> A simple Theme Component that places a crown icon by admins name in Post stream

（[https://meta.discourse.org/t/how-do-i-install-a-theme-or-theme-component/63682）](https://meta.discourse.org/t/how-do-i-install-a-theme-or-theme-component/63682%EF%BC%89)

管理员角色具有优先权——默认情况下，同时拥有管理员和版主角色的用户将显示皇冠图标。

你现在可以根据人员类型配置图标。

 ![image](https://global.discourse-cdn.com/meta/original/3X/2/d/2d45d833a81f10ce1280b16166276d6e44e4ff7e.png)

只需确保将图标名称添加到 SVG 图标子集设置中（否则不会显示）：

 ![image](https://global.discourse-cdn.com/meta/original/3X/b/3/b3b699ecd86a63873016a4dd69a7f0ce70ff6bf6.png)

在此处自定义你的标题文本：

 ![image](https://global.discourse-cdn.com/meta/original/3X/5/4/546c4a86772df0b2391d58453fa35ff9feb0e5e4.png)

版主同理。

---

<div class="post-metadata">

### Author: ![cosdesign](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cosdesign/32/208585_2.png) [@cosdesign](https://meta.discourse.org/u/cosdesign)
#### Post date: [2021年二月5日 22:34 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/13 "2021-02-05T22:34:48Z")

</div>

太棒了🙂。非常感谢您的帮助！

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月5日 22:35 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/14 "2021-02-05T22:35:24Z")

</div>

很高兴（那个真的很有趣！）

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2021年二月6日 01:47 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/15 "2021-02-06T01:47:51Z")

</div>

我已更新了主题组件（TC），现在它也会更改用户卡片上的员工图标（可能还有其他地方，因为我修改了辅助函数）。

现在管理员和版主都可以配置图标，管理员的默认图标是皇冠，而版主的默认图标是原版盾牌。

我已重命名了该主题组件。

肯定还有一些地方图标尚未转换，也许我将来会找到更多。

---

<div class="post-metadata">

### Author: ![AEW745](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/aew745/32/245540_2.png) [@AEW745](https://meta.discourse.org/u/AEW745)
#### Post date: [2022年五月7日 00:22 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/16 "2022-05-07T00:22:45Z")

</div>

非常感谢！这对我论坛的帖子很有帮助！我认为您的评论应该被置顶，以方便其他遇到用户名旁图标显示问题的用户。我使用了您的功能，在管理员的个人资料中显示了公开显示给版主的盾牌图标。现在，即使我只有管理员权限，我也可以拥有盾牌图标，并且它会显示正确的管理员工具提示。非常感谢您花费时间为人们的论坛创建这个很棒的组件！

编辑：它不会公开显示在他们的个人资料上。目前它只在帖子中显示。

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2022年五月7日 07:13 UTC](https://meta.discourse.org/t/cant-add-new-class-to-topic-page-elements-using-jquery/178568/17 "2022-05-07T07:13:59Z")

</div>

不客气。欢迎 fork、扩展和提交 PR！
