在 React.js 应用程序中从广告合作伙伴加载外部脚本

Posted

技术标签:

【中文标题】在 React.js 应用程序中从广告合作伙伴加载外部脚本【英文标题】:Load External Script From Advertising Partner in React.js app 【发布时间】:2020-04-05 00:02:53 【问题描述】:

我想在我的 React.js Web 应用中包含两种类型的广告

<script async="async" data-cfasync="false" src="//somewebstite.com/invoke.js"></script>
<div id="container-4foobarbaz"></div>

还有这个广告:

<script type="text/javascript">
atOptions = 
    'key' : 'somekey',
    'format' : 'iframe',
    'height' : 250,
    'width' : 300,
    'params' : 
;
document.write('<scr' + 'ipt type="text/javascript" src="http' + (location.protocol === 'https:' ? 's' : '') + '://www.cdnwebsite.com/invoke.js"></scr' + 'ipt>');

如何在我的 React 应用程序中包含它? 我尝试了一些方法,但都没有奏效,包括:

    const script = document.createElement("script");
    script.async = true;
    script["data-cfasync"] = true;
    script.src = "//somewebstite.com/invoke.js"

    this.div.appendChild(script); 

渲染中的这个:

<div id="container-4foobarbaz" ref=el => (this.div = el) >

  </div> 

【问题讨论】:

【参考方案1】:

我看到您正在尝试使用 adsTerra,所以这是一个工作示例(在 Typecript 中)

import  useEffect, useRef  from 'react'
export default function Banner(): JSX.Element 
    const banner = useRef<htmlDivElement>()

    const atOptions = 
        key: 'YOUR_KEY',
        format: 'iframe',
        height: 50,
        width: 320,
        params: ,
    
    useEffect(() => 
    if (!banner.current.firstChild) 
        const conf = document.createElement('script')
        const script = document.createElement('script')
        script.type = 'text/javascript'
        script.src = `//www.highperformancedformats.com/$atOptions.key/invoke.js`
        conf.innerHTML = `atOptions = $JSON.stringify(atOptions)`

        if (banner.current) 
            banner.current.append(conf)
            banner.current.append(script)
        
    
, [])

    return <div ref=banner></div>

【讨论】:

【参考方案2】:

您可以使用此示例代码。这背后的想法是在安装组件并初始化广告时导入广告脚本。每次组件重新挂载到 DOM 时,它都不会导入已经导入的广告脚本。我还在 Codesandbox 上为您创建了一个示例:https://codesandbox.io/s/example-react-google-ads-0b700

  componentDidMount() 
    // inject some code to head element
    const head = document.querySelector("head");
    // import google ads script if not yet imported
    if (!head.querySelector("#my-google-ads-1")) 
      const script = document.createElement("script");
      script.id = "my-google-ads-1";
      script.async = true;
      script.src = "https://www.google.com/adsense/search/ads.js";
      head.appendChild(script);
    
    // add another script to head element
    if (!head.querySelector("#my-google-ads-2")) 
      const script = document.createElement("script");
      script.id = "my-google-ads-2";
      script.type = "text/javascript";
      script.charset = "utf-8";
      script.innerHTML = `
        (function(g,o)g[o]=g[o]||function()(g[o]['q']=g[o]['q']||[]).push(
        arguments),g[o]['t']=1*new Date)(window,'_googCsa');
      `;
      head.appendChild(script);
    

    // init ads
    var pageOptions = 
      "pubId": "pub-9616389000213823", // Make sure this the correct client ID!
      "query": "hotels",
      "adPage": 1
    ;

    var adblock1 = 
      "container": "afscontainer1",
      "width": "700",
      "number": 2
    ;

    window._googCsa('ads', pageOptions, adblock1);
  

  render() 
    return (
      <div className="App">
        <h1>Hello React.js</h1>
        <h2>These are sample ads</h2>
        <div id='afscontainer1'></div>
      </div>
    );
  

【讨论】:

如果我使用的是谷歌以外的提供商怎么办?我的供应商是 Adsterra。以下调用window._googCsa('ads', pageOptions, adblock1); 的等效项是什么 您可以查看提供商网站上的文档并将我的示例代码修改为您的。通常所有提供商都要求我们导入库并初始化广告。

以上是关于在 React.js 应用程序中从广告合作伙伴加载外部脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React.js 中从 fabric.js 渲染 svg 字符串?

如何在 React js 中从一个页面导航到另一个页面?

react.js 视频,不点广告的不要进来!!

使用三个 JS 和 React JS 加载 GLTF 模型

Fetch API 无法加载“.php”本地文件 - React JS + PHP

在 React Native WebView 中从注入的 JavaScript 接收消息