RailsでGoogle AdsenseのJavaScriptがエラーを吐く (adsbygoogle.push() error: All ins elements in the DOM with class=adsbygoogle already have ads in them.)
Railsで作っているプロジェクトにGoogle Adsenseのタグを埋め込んでいました. 新しく作ったリンクへページ遷移をすると,次のエラーが出ました.
"adsbygoogle.push() error: All ins elements in the DOM with class=adsbygoogle already have ads in them."
adsbygoogle.push()で,新しい広告を<ins>
に追加しようとしたけど,もう既に広告あるじゃん!っていう意味です.
Railsの機能のturbolinksが邪魔しているだろうなと思ったので,次のサイトを参考にturbolinksをオフにしたらエラーが出なくなりました.
turbolinksをオフにしてページの読み込みが遅くなるのが嫌だったので,turbolinksをオンに戻してどうにかできないか探しました.
次の記事によると,<script>
を<body>
内に書くとturbolinksとは共存しないらしいことが分かりました.
また,Google Adsense turbolinks
で調べてたら,turbolinksの対応方法が出てきました.
Turbolinks Compatibility with Google AdSense
う〜んわからん・・・ でもturbolinks切りたくない・・・
もしかして,既に広告があるのが悪いなら,リロードの度に消せば良い・・・?
改変前Google Adsenseコード
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-xxxxxxxxxxxx" data-ad-slot="xxxxxxxxxxx" data-ad-format="auto"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>
改変後Google Adsenseコード
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-xxxxxxxxxxxx" data-ad-slot="xxxxxxxxxxx" data-ad-format="auto"></ins> <script> var element = document.getElementsByClassName("adsbygoogle")[0]; while (element.firstChild) element.removeChild(element.firstChild); (adsbygoogle = window.adsbygoogle || []).push({}); </script>
<ins>
の子要素をエラーの原因になった(adsbygoogle = window.adsbygoogle || []).push({});
の前に毎回消すようにしました.
やってみると,エラーは出たままですが(謎)リロードの度に広告が表示されるようになりました.
よかった〜!