javascript - 如何在 React SPA 中实现添加自定义 js 代码片段功能?
问题描述
我正在构建一个白标 Web 应用程序。我需要实现添加自定义 js 代码片段功能(营销术语中的“标签”),以让营销人员添加跟踪代码,如谷歌分析代码和堆代码。在管理应用程序中,管理员可以像这样添加自定义 js 代码片段。
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-160375581-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-160375581-1');
</script>
如您所见,我需要同时支持<script src/>
和<script>code</script>
。
在 Web 应用程序 (Create-React-App SPA) 中,我需要在文档中添加此代码段。我不知道如何实现这个功能。我尝试使用 React dangersoulySetInnerHTML 功能注入此代码片段。但 innerHTML 不允许<script>
.
请仔细查看代码片段示例,它还必须支持使用src
属性指定的外部脚本。
此屏幕截图将帮助您了解我要实现的功能。
解决方案
我实现了这样的添加自定义脚本功能。请查看代码。我希望你提出另一个好的解决方案。我制作 cloneScript 函数的原因是制作没有“已经开始”状态的 HTML 脚本标签。如果你不明白,请检查这个文档。 https://html.spec.whatwg.org/multipage/scripting.html#script-processing-model
const cloneScript = (script) => {
const s = document.createElement('script');
// copy attributes
const attrs = script.attributes;
for (let i = 0; i < attrs.length; i++) {
s.setAttribute(attrs[i].name, attrs[i].value);
}
// copy inner text of script
s.text = script.text;
return s;
};
const addCustomScripts = (custom_tag) => {
try {
const parser = new DOMParser();
const doc = parser.parseFromString(custom_tag, 'text/html');
const collection = doc.head.children;
Array.from(collection)
.map((script) => cloneScript(script))
.forEach((script) => document.body.appendChild(script));
} catch (e) {
console.error(e);
}
};
const str = `
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-160375581-1"></script>
<script id="stella" data-state="inactive">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-160375581-1');
</script>`
addCustomScripts(str);
推荐阅读
- html - 尝试使用 flexbox 重新创建 Google 登录页面
- python - 我在从 python 发送电子邮件时遇到问题,收到了一些电子邮件,但对于特定的电子邮件,它不会显示以下错误
- applescript - 如何使用 applescript 在系统偏好设置中单击此按钮?
- asp.net-core - 在创建带有Work和accounts的asp.net core时,我们需要在azure还是microsoft里面注册我们的应用程序
- android - 订购发送到 Firestore 的内部数据
- python - 如何确定您之前是否在时间序列数据中访问过某个区域
- r - 将 R 中的多个双精度变量转换为整数
- html - 设置样式时切换时不显示 Div
- keyword - 如何使用 DOORS DXL 按关键字查找需求
- reactjs - React:检查不同组件中的元素是否重叠