如何白名单化任意 HTML 属性?

显然,这里以前在 Meta 上有一个主题,可以指导你如何注入脚本,但已被移除。

起初,我不知道 Markdown 会剥离 HTML 帖子中的 id 和类,随后我又发现脚本的执行方式有所不同。

我试图让这个 CodePen 示例在 Discourse 站点中运行,但不确定从何入手,因为显然无法通过常规的复制/粘贴方式实现:

我明白只能从管理员端添加脚本,我也确实这样做了,但我认为还需要更多工作才能让它在主题内部正常运行。

基本上,这些外部脚本会被触发,向具有特定数据属性的 div 注入内容。

我是否必须用 jQuery 和 Ember 重写整个外部脚本来注入带有内容的 div?我希望不必重新发明轮子。

提前感谢,

我不明白这个请求。你是想让普通用户只需在回复中发布任意 JavaScript 代码,就能在你的 Discourse 中注入吗?这将会是一场安全噩梦。

Jeff,感谢您的快速回复。

普通用户不会添加外部脚本,他们只会提供带有数据属性的 div,这些 div 会被列入白名单,以便在检测到这些 div 时触发外部 JS 脚本填充内容。

带有属性的 div(基础 HTML)是否已经得到编辑器支持,允许普通用户发布?还是说,只有像我这样的管理员才能使用基础 HTML,而普通用户不行?

其他大型网站如 wowhead 和 icyveins 一直让用户使用这些脚本,难道他们也有风险吗?

再次感谢您的帮助。

所以,你不需要 JavaScript,而是想要

<div attribute='blah'>

我会编辑你的帖子标题,使其更准确地反映你的实际提问。我不确定我们是否允许对单个 HTML 属性进行任意的白名单设置。

不过,你可以在站点设置中白名单 <iframe> 域名,以实现类似的效果。

如果你在 Meta 搜索中搜索“wowhead”,你会找到:

在那里我们提供了一些将帖子与游戏数据库集成的示例。

你是否有想要实现的具体示例?

谢谢 Jeff,我过去曾成功白名单化 iframe,但这并非我所期望的行为。

你好 Rafael,
我想我可能没表达清楚。这个帖子中有一个示例:

在该链接底部的我的帖子中,显示着“加载中(Loading)”。这是一个带有特定属性的 div,旨在触发我放置在管理主题 /body 部分(脚本放置处)的外部脚本,并通过 JavaScript 生成内容(填充统计图表)。

最终效果应与我之前在主题顶部链接的 CodePen 示例一致,即数据生成后的样子。

自定义数据属性在 Discourse 中默认已被白名单化,不会像 id 或 class 那样从 div 中被移除。

我的问题是:如何使这些外部脚本执行,并根据这些属性在空的 div 中生成数据?基于这些属性,它们可以因主题或帖子而异,从而触发脚本显示由这些外部脚本生成的不同数据。

总结一下我的意图

在管理 > 自定义 > 主题“编辑 CSS/HTML” 部分放置的外部脚本:

<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://bloodmallet.com/js/bloodmallet_chart_import.min.js"></script>

用户或我在编辑器中输入的内容:

<div 
  data-bloodmallet="chart"
  data-wow-class="shaman" 
  data-wow-spec="elemental" 
  data-chart-engine="highcharts"
  data-tooltip-engine="wowhead"
  data-type="trinkets"
  data-azerite-tier="all"
  data-fight-style="patchwerk"
  data-entries="7"
  data-background-color="#343a40" 
  data-font-color="#f8f9fa" 
  data-axis-color="#828282"
  data-language="en"
>加载中...</div>

当找到该 div 并执行外部 JavaScript(即我在管理端放置的脚本)后,基于这些数据属性生成内容时的输出效果:

我表达清楚了吗?如果我没能解释清楚,请见谅。作为双语者,我有时会让事情听起来更复杂。

这正是 @Falco 发给你的链接,请阅读 https://github.com/xfalcox/discourse-hearthstone,里面有你所需的一切。

你好,Joffrey,

好的,谢谢。我尝试阅读并理解了一些代码,看看能进展到哪儿。

再次感谢。

我刚刚意识到我从未写过关于这个的内容,但 Generic bbcode wrapper for theme components 可能对您的用例非常有帮助。