Ajaxで動的に追加したSNSボタンを表示させる方法と、SNSボタンの再読み込みについて

どうも、イソップです。

Ajaxで読み込んだコンテンツの中にSNSボタンがあったとしても、レンダリングされません。
さぁ、困りました。

でも調べてみたら、表示させる方法がちゃ〜んと用意されていましたよ。
ボタンだけを再読み込み(リロード)したいときにも使えます。

Twitter

HTML

<!-- 事前にtwitter-widgetの読み込み -->
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

もしくはJS側でwidgetを読み込んでおく。

// 事前にtwitter-widgetの読み込み
window.twttr = (function (d,s,id) {
  var t, js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;
  js.src="https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs);
  return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });
}(document, "script", "twitter-wjs"));

例えば、動的にボタン要素を追加したとする。

<div class="contents">
  <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://***" data-lang="ja" data-text="Tweet!">ツイート</a>
</div>

JavaScript

// 任意のタイミングで更新
twttr.widgets.load();

// DOMを引数で指定すると、その子要素を探索するので速くなる
twttr.widgets.load(document.getElementById('contents'));

Facebook

いいねボタンもシェアボタンも同じ仕組みです。

HTML

<!-- 事前にJavascriptSDKの読み込み -->
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1&appId=*****";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

例えば、動的にボタン要素を追加したとする。

<!-- いいねボタン -->
<div class="contents">
  <div class="fb-like" data-href="http://***/" data-send="false" data-layout="button" data-width="200" data-show-faces="false"></div>
</div>

<!-- シェアボタン -->
<div class="contents">
  <div class="fb-share-button" data-href="http://***" data-layout="button" data-size="small" data-mobile-iframe="true"><a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2F[***]amp;src=sdkpreparse">シェア</a></div>
</div>

JavaScript

// 任意のタイミングで更新
FB.XFBML.parse();

// DOMを引数で指定すると、その子要素を探索するので速くなる
FB.XFBML.parse(document.getElementById('contents'));

SNSボタンの実装方法はこちらから

五十川 洋平(Yohei Isokawa)

五十川 洋平(Yohei Isokawa)

フロントエンドエンジニア/面白法人カヤックなどのWeb制作会社に勤務したのち、故郷の新潟に戻り独立。JSフレームワークAngularやFirebase、Google Cloud Platformを使ったWebアプリ開発が得意。 また、Udemyのプログラミング解説の講師、writer.appの自主開発や上越TechMeetupの主催などを行っています。

プロフィール

©Copyright 2022 Yohei Isokawa All Rights Reserved.