现在我正在尝试在 ComponentDidMount 生命周期方法中创建一个函数,它将一个脚本标记注入到 return 语句中。此脚本将用于调用Clicktale。但是,即使在检查组件已安装并且文档状态已达到“完成”之后,当我尝试查找脚本标记时,它仍然会返回未定义。因此,我无法将属性添加到将调用 Clicktale 的脚本标记。通常使用 Clicktale,您只需在正文底部添加脚本,但对于我正在处理的项目,我需要使用 React。
我知道在 React 中使用 getElementsByTagName 方法时,它应该返回一个具有该标签名称的元素数组。但是当控制台日志记录时,
document.getElementsByTagName('script')
我只收到
HTMLCollection {}
我认为这意味着它是空的,因为日志记录document.getElementsByTagName('script')[0]
返回未定义。
这是主要组件:
import React, { Component } from 'react';
class Clicktale extends Component {
componentDidMount() {
if (!window.clickTaleTagInjected) {
const clickTaleTagInjected = true;
function injectTag() {
const ns = document.createElementNS;
const a = ns ? ns.call(document, 'http://www.w3.org/1999/xhtml', 'script') : document.createElement('script');
const s = document.getElementsByTagName('script')[0];
a.async = true;
a.crossOrigin = 'anonymous';
a.type = 'text/javascript';
a.src = 'specific clicktale cdn url I am using here';
s.parentNode.insertBefore(a, s);
}
if (document.readyState === 'complete') {
injectTag();
} else {
window.addEventListener('load', () => {
setTimeout(injectTag, 0);
});
}
}
}
render() {
return (
<div>
</div>
);
}
}
export default Clicktale;
这是父组件(我认为这不应该干扰?):
import React from 'react';
import Helmet from 'react-helmet';
import Clicktale from './Clicktale';
export const Parent = () => (
<div>
<Helmet
link={[
{
rel: 'stylesheet',
href: 'using private link here',
},
]}
/>
<Clicktale />
</div>
);
export default Parent;
我收到的具体错误是:
TypeError: Cannot read property 'parentNode' of undefined
这指的是与
s.parentNode.insertBefore(a, s)
最终,我试图弄清楚为什么它在注入后找不到脚本标签。我还想知道我是否应该在返回中包含除 div 标签之外的其他内容?我认为该组件可以毫无问题地在其中注入脚本标签,但事实并非如此。
谢谢你的任何指点:)