【发布时间】:2021-05-15 02:33:13
【问题描述】:
这有点类似于这个问题:
Adding script tag to React/JSX
但就我而言,我正在加载这样的脚本:
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','ID');</script>
<!-- End Google Tag Manager -->
现在我知道谷歌标签管理器有一个 npm 包,但我很好奇如果我想以自定义方式执行此操作,我该怎么做?
在上面的问题中,我看到了很多:
const script = document.createElement("script");
script.src = "https://use.typekit.net/foobar.js";
script.async = true;
document.body.appendChild(script);
这很好,但如果我在加载的脚本中有一个函数,我将如何正确执行它?
【问题讨论】:
-
将该函数设为全局变量,然后在任何地方使用它,如下所示:
gloabl.functionFromScript。此外,您为什么要这样做,无论您的实际用例如何,都必须有更好的解决方案。 -
另外,如果您想始终加载自定义脚本,只需将其添加到您的
index.html,而不是通过所有 js 将脚本标签附加到正文 -
你是对的。上面的脚本将被移动到 index.html 但我有一个不同的场景,其中添加了类似的东西但它仅用于特定场景,因此为了不加载基本上只是坐在那里直到用户来到的全局脚本特定的场景并不理想,所以我想一旦用户触发所需的行为,我就会加载它。我想避免将其保存在全局变量中,因此情况相同。我有一个 HOOK,我想触发以与上面类似的方式编写的脚本,但无法弄清楚如何正确执行。
-
你不能将你的函数附加到一个对象上,然后将它暴露给其他脚本使用。是的,新对象最终将附加到全局/窗口,但还能做什么。
标签: javascript reactjs