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

如何在React组件中运行包含document.write的第三方脚本

解决方案

方案1:临时劫持document.write(首推,改造成本最低)

该方案可以完全规避React环境下document.write执行异常的问题,无需改造第三方脚本逻辑,也不存在iframe方案的跨域、跳转限制缺陷。

import { useEffect, useRef } from 'react';

const ThirdPartyWidget = () => {
  const widgetContainer = useRef(null);

  useEffect(() => {
    const container = widgetContainer.current;
    if (!container) return;

    // 保存原生document.write方法
    const nativeWrite = document.write;
    // 临时劫持write,将内容输出到指定容器
    document.write = (content) => {
      container.innerHTML += content;
    };

    // 动态创建第三方script标签
    const thirdScript = document.createElement('script');
    thirdScript.src = 'https://some.domain/script.js';
    // 脚本加载完成/失败后恢复原生方法,避免全局污染
    thirdScript.onload = thirdScript.onerror = () => {
      document.write = nativeWrite;
    };

    container.appendChild(thirdScript);

    // 组件卸载时清理
    return () => {
      document.write = nativeWrite;
      container.innerHTML = '';
    };
  }, []);

  return <div ref={widgetContainer} />;
};

export default ThirdPartyWidget;

方案优势:第三方脚本依赖的jQuery、内置动态token表单都可以正常运行,表单提交跳转默认走顶层窗口,完全兼容当前需求。

方案2:dangerouslySetInnerHTML直接注入

如果不需要额外控制脚本加载逻辑,也可以直接通过React的内置属性注入script标签,适合仅需单次加载的场景:

const ThirdPartyWidget = () => {
  return (
    <div 
      dangerouslySetInnerHTML={{
        __html: '<script src="https://some.domain/script.js"></script>'
      }}
    />
  );
};

注意:仅在第三方脚本来源完全可信的场景下使用该方案,避免XSS安全风险

可选优化:强制表单新标签页打开

如果需要第三方表单提交后在新标签页打开,可在方案1的脚本加载完成回调中新增表单属性修改逻辑:

thirdScript.onload = () => {
  document.write = nativeWrite;
  // 给第三方表单新增新标签打开属性
  const formEl = container.querySelector('form');
  formEl && formEl.setAttribute('target', '_blank');
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:27:03