You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js/React.js项目集成Adsterra Banner页面空白问题求助

解决Next.js集成Adsterra横幅广告导致页面空白的问题

问题根源

你当前实现里的document.write是导致页面空白的核心原因。在Next.js的hydration流程或页面加载完成后调用document.write,会直接清空当前文档内容——这个API是为早期同步加载脚本设计的,完全不兼容React/Next.js的组件化渲染模型。另外,直接定义的atOptions可能不在全局作用域,Adsterra的invoke.js脚本会无法读取到配置。

修复方案

方案1:Next.js Script组件+全局变量+动态创建脚本

修改Script组件代码,把配置挂载到全局window对象,同时用动态创建script标签替代document.write:

import Script from 'next/script';

export default function BannerAd() {
  return (
    <Script id="adsterra-banner" strategy="afterInteractive">
      {`
        // 将配置挂载到全局window对象
        window.atOptions = {
          key: 'XXXXXX',
          format: 'iframe',
          height: 50,
          width: 320,
          params: {}
        };
        
        // 动态创建script标签并插入页面
        const script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = \`\${location.protocol === 'https:' ? 'https' : 'http'}://www.effectivecreativeformat.com/66e709b141fa8aa6d66cfda7e0b098a6/invoke.js\`;
        document.body.appendChild(script);
      `}
    </Script>
  );
}

方案2:客户端组件useEffect(适配TS/JS项目)

如果是Next.js 13+的App Router,建议创建客户端组件,用useEffect在组件挂载后加载广告脚本:

'use client';

import { useEffect } from 'react';

export default function AdsterraBanner() {
  useEffect(() => {
    // 避免重复加载脚本
    if (document.querySelector('#adsterra-invoke-script')) return;

    // 设置全局配置(TS项目需类型断言)
    (window as any).atOptions = {
      key: 'XXXXXX',
      format: 'iframe',
      height: 50,
      width: 320,
      params: {}
    };

    // 创建并插入脚本
    const script = document.createElement('script');
    script.id = 'adsterra-invoke-script';
    script.type = 'text/javascript';
    script.src = `${location.protocol === 'https:' ? 'https' : 'http'}://www.effectivecreativeformat.com/66e709b141fa8aa6d66cfda7e0b098a6/invoke.js`;
    document.body.appendChild(script);

    // 组件卸载时清理脚本和全局变量
    return () => {
      script.remove();
      delete (window as any).atOptions;
    };
  }, []);

  // 可选:给广告指定容器,方便样式控制
  return <div id="adsterra-banner-container"></div>;
}

额外注意事项

  • 替换代码中的XXXXXX为你实际的Adsterra密钥。
  • 若广告仍不显示,检查浏览器控制台是否有报错(比如CORS限制、脚本加载失败)。
  • 上述方案均确保广告脚本仅在客户端执行,适配Next.js的SSG/SSR渲染模式。

内容的提问来源于stack exchange,提问作者user20951184

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:37:41