【问题标题】:Embed <script> tag into React Gatsby Component将 <script> 标签嵌入到 React Gatsby 组件中
【发布时间】:2020-11-02 01:49:29
【问题描述】:

我正在尝试嵌入 Buzzsprout 提供的播客播放器。这是他们提供的代码。

<div id="buzzsprout-player-61XX09"></div>
<script src="https://www.buzzsprout.com/14XX79/61XX09-the-podcast-promo.js?container_id=buzzsprout-player-61XX09&player=small" type="text/javascript" charset="utf-8"></script>

其目的是在一个页面上拥有多个播放器,即播客剧集列表。但是,上面的代码不适用于 Gatsby 组件。我一直在寻找包含此内容的方法,但无法找到解决方案。

我尝试了以下方法,但这不起作用。

const IndexPage = () => (
<script dangerouslySetInnerHTML={{__html: `src="https://www.buzzsprout.com/14XX79/61XX09-the-podcast-promo.js?container_id=buzzsprout-player-61XX09&player=small" type="text/javascript" charset="utf-8"`}} />
)

花了一些时间尝试其他选项,例如 react-script-tag 包,但使用了不推荐使用的方法并且不起作用。任何帮助都会很棒!

【问题讨论】:

  • 尝试在 gatsby 上弹出 html.js 页面时使用 react-helmet 添加

标签: reactjs gatsby


【解决方案1】:

使用&lt;Helmet&gt;组件:

const IndexPage = () => (
<>
  <Helmet>
    <script defer src="https://www.buzzsprout.com/14XX79/61XX09-the-podcast-promo.js?container_id=buzzsprout-player-61XX09&player=small" type="text/javascript" charset="utf-8" />
  </Helmet>
</>
)

基本上,&lt;Helmet&gt;(从react-helmet 导入)组件将包裹在其中的所有内容放入head 标签内。如果需要,您可能想要使用defer 属性(感谢@LekoArtshttps://github.com/gatsbyjs/gatsby/discussions/30752 的参考)。

请记住,使用您的方法,您是 exposing the site to XSS (Cross-Site Scripting) attacks,因为您使用的是 dangerouslySetInnerHtml(因此得名)。如果需要,您可以使用一些 parse libraries 来避免使用它。使用&lt;Helmet&gt; 接近您的网站是完全安全的。


这个用例使用原生 iframe 解决了这个问题。

【讨论】:

  • 这在开发中有效,但一旦构建,页面就会损坏。播放器出现在页面顶部&lt;body&gt; 元素的开头。我确定这与反应生命周期有关,但不能确定到底是什么。关于为什么的任何想法?
  • 您是否要在某个 div 中打印您的脚本?这改变了游戏规则。
  • 是的。播放器查找带有特定 id&lt;div&gt; 以将 iframe 注入其中。
  • 好主意哈,刚刚尝试过,是的,它有效!嵌入代码有不同的id,注入的iframe 包含播客标题。手动添加iframe 意味着更新id 并手动更改title 属性。这还不错。感谢您的帮助!
  • 您需要将defer 标签添加到脚本中,请参阅:github.com/gatsbyjs/gatsby/discussions/30752
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2019-01-25
  • 1970-01-01
  • 2022-01-04
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多