どうも、イソップです。
Ajaxで読み込んだコンテンツの中にSNSボタンがあったとしても、レンダリングされません。
さぁ、困りました。
でも調べてみたら、表示させる方法がちゃ〜んと用意されていましたよ。
ボタンだけを再読み込み(リロード)したいときにも使えます。
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'));
いいねボタンもシェアボタンも同じ仕組みです。
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'));