首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将javascript对象注入head标记

将javascript对象注入head标记
EN

Stack Overflow用户
提问于 2020-09-09 19:55:29
回答 2查看 2.1K关注 0票数 4

我需要注入到头部标签的脚本和链接标签,这是从API下载的。我有变量injectionScript,它包含完整的标记脚本和带有链接标记的injectionLink。我发现头盔组件接受src、完整性等参数,但我需要注入一个完整的标签。

代码语言:javascript
复制
            <Helmet
                script={[
                    {"src": "https://cdnjs.cloudflare.com/ajax/libs/prism/1.21.0/components/prism-swift.min.js",
                        "integrity": "sha512-WkVkkoB31AoI9DAk6SEEEyacH9etQXKUov4JRRuM1Y681VsTq7jYgrRw06cbP6Io7kPsKx+tLFpH/HXZSZ2YEQ==",
                    "crossOrigin": "anonymous"}
                ]}

有可能吗?我在尝试这样的解决方案:

代码语言:javascript
复制
<Helmet script={injectionScript}>
<Helmet htmlAttributes={{script: injectionScript}}>

但对我不起作用。

编辑:我只有变量const injectScript = (injectionScript),这个变量是从API下载的,它只在一个地方包含了一个完整的标记。

代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.21.0/prism.min.js" integrity="sha512-WkVkkoB31AoI9DAk6SEEEyacH9etQXKUov4JRRuM1Y681VsTq7jYgrRw06cbP6Io7kPsKx+tLFpH/HXZSZ2YEQ==" crossorigin="anonymous"></script>

如何在头盔中使用这个变量injectScript

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-09 20:08:03

您可以将实际的script元素作为Helmet组件的子元素,如下所示:

代码语言:javascript
复制
<Helmet>
    <script
        src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.21.0/components/prism-swift.min.js"
        integrity="sha512-WkVkkoB31AoI9DAk6SEEEyacH9etQXKUov4JRRuM1Y681VsTq7jYgrRw06cbP6Io7kPsKx+tLFpH/HXZSZ2YEQ=="
        crossOrigin="anonymous"
    />
</Helmet>

如果变量script中有scriptAttributes的属性,则可以使用JSX spread syntax (...),如下所示:

代码语言:javascript
复制
const scriptAttributes = {
    "src": "https://cdnjs.cloudflare.com/ajax/libs/prism/1.21.0/components/prism-swift.min.js",
    "integrity": "sha512-WkVkkoB31AoI9DAk6SEEEyacH9etQXKUov4JRRuM1Y681VsTq7jYgrRw06cbP6Io7kPsKx+tLFpH/HXZSZ2YEQ==",
    "crossOrigin": "anonymous",
}

<Helmet>
    <script {...scriptAttributes} />
</Helmet>

或者,用字符串呈现:

代码语言:javascript
复制
const scriptHtmlString = '<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.21.0/prism.min.js" integrity="sha512-WkVkkoB31AoI9DAk6SEEEyacH9etQXKUov4JRRuM1Y681VsTq7jYgrRw06cbP6Io7kPsKx+tLFpH/HXZSZ2YEQ==" crossorigin="anonymous"></script>'

const htmlStrToReactComponent = str => {
    const dom = new DOMParser().parseFromString(str, 'text/html')
  
    const el = dom.documentElement.querySelector(':not(html):not(head):not(body)')

    const NodeName = el.nodeName.toLowerCase()
  
    const attributes = Object.fromEntries([...el.attributes]
        .map(({ name, value }) => [name, value]))

    return <NodeName {...attributes} />
}

const scriptEl = htmlStrToReactComponent(scriptHtmlString)

// use like this...

<Helmet>
    {scriptEl}
</Helmet>
票数 3
EN

Stack Overflow用户

发布于 2020-12-07 20:00:31

这是对我有效的修复,用包装字符串。

代码语言:javascript
复制
<script>
{`
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', ${googleAnalyticsId});
`}
</script>

来源:https://github.com/nfl/react-helmet/issues/334#issuecomment-413319383

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63818705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档