我如何确保在 facebook 像素跟踪 NextJS 之前加载我的 onetrust 同意脚本

mac*_*kee 1 javascript cookies next.js

我需要将 Cookies 同意脚本作为 NextJS 应用程序中的第一个脚本加载。我的问题是,我们实施了 Facebook 像素跟踪,而他们也有一个, parentNode.insertBefore 因此他们的脚本始终位于最上面。

这就是我们使用 facebook Pixel 的方式,它来自他们自己的文档

const html = [
  "!function(f,b,e,v,n,t,s)",
  "{if(f.fbq)return;n=f.fbq=function(){n.callMethod?",
  "n.callMethod.apply(n,arguments):n.queue.push(arguments)};",
  "if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';",
  "n.queue=[];t=b.createElement(e);t.async=!0;",
  "t.src=v;s=b.getElementsByTagName(e)[0];",
  "s.parentNode.insertBefore(t,s)}(window,document,'script',",
  "'https://connect.facebook.net/en_US/fbevents.js');",
  `fbq('init', '111222333');`,
  "fbq('track', 'PageView');",
  `fbq('init', '1234');`,
  "fbq('track', 'PageView');",
].join("");

const DocumentFacebookPixel = () => (
  <>
    <script key="track-fb-pixel" dangerouslySetInnerHTML={{ __html: html }} />
  </>
);

export default DocumentFacebookPixel;
Run Code Online (Sandbox Code Playgroud)

这是 onetrust 代码

 const DocumentOneTrust = () => {
  return (
    <>
      <script
        src="https://url.com"
        type="text/javascript"
        charSet="UTF-8"
        data-domain-script="id-123-4"
      ></script>

      <script type="text/javascript">{function OptanonWrapper() {}}</script>
    </>
  );
};

export default DocumentOneTrust;
Run Code Online (Sandbox Code Playgroud)

我在 facebook 之前加载我的 onetrust 脚本组件,在这里:

class Document extends NextDocument {
  render() {
    return (
      <Html>
        <NextHead>
         <DocumentOneTrust />
        </NextHead>
        <body>
          <Main />
          <NextScript />
          <DocumentFacebookPixel />
        </body>
      </Html>
    );
  }
}


Run Code Online (Sandbox Code Playgroud)

小智 5

我们创建了一个 _app.tsx 来处理这个问题。首先,检查 onetrust 窗口是否处于活动状态或者是否设置了选择加入的 cookie。只要其中之一没问题,我们的脚本(我们使用 Google 跟踪代码管理器)就会包含在内。

function App({ Component, pageProps }: AppProps) {
 const [injectScript, setInjectScript] = useState(false);
 useEffect(() => {
  if (typeof window !== 'undefined' && !window.OptanonWrapper) {
   window.OptanonWrapper = () => {
    window.OneTrust.OnConsentChanged(() => {
      if (window.OptanonActiveGroups.indexOf('C0004') > -1) {
        setInjectScript(true);
      }
    });
   };
  }

  if (typeof window !== 'undefined' &&
   document.cookie.replace(/(?:(?:^|.*;\s*)OptanonConsent\s*=\s*([^;]*).*$)|^.*$/, '$1').indexOf('C0004') > -1) {
    setInjectScript(true);
   }
  }, []);

 return (
   <GTMProvider state={{ injectScript, ...gtmParams }}>
    <Component {...pageProps} />
   </GTMProvider>
 );
}
Run Code Online (Sandbox Code Playgroud)