WordPressにいいね!ボタンを設置した(その2)
WordPressにいいね!ボタンを設置した(その1)の続き。その1で課題となっていた、トップページの表示速度の低下を改善する。
1.遅延ロード
今までは、ブックマークボタン等を処理する各種JavaScriptをbody
タグが閉じる直前にずらずらと並べていた(以下、Google +1ボタンを例にする)。
<script type="text/javascript">
(function() {
var po = document.createElement('script');
po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(po, s);
})();
</script>
</body>
これを、今回設置したbookmarkボタンが押下されたタイミングで実行するように変更する。
<!-- bootstrapのDropdownを使った、bookmarkボタン。sb-buttonsクラスを付与しておく。 -->
<div class="btn-group dropup sb-buttons">...</div>
...
<script type="text/javascript">
$(".sb-buttons").on('show.bs.dropdown', function() {
(function() {
var po = document.createElement('script');
po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(po, s);
})();
});
</script>
</body>
このままだと、bookmarkボタンを押下する度にdocument.createElement('script')
が実行されるので、script
タグが生成済みの場合は何もしないようにしておく(この辺りは、他のブックマークボタンの実装を参考にしている)。
(function(d, e, id) {
if (d.getElementById(id)) return;
var po = d.createElement(e);
po.type = 'text/javascript'; po.async = true; po.id = id;
po.src = 'https://apis.google.com/js/plusone.js';
var s = d.getElementsByTagName(e)[0];
s.parentNode.insertBefore(po, s);
})(document, 'script', 'gpo-jssdk');
同様に、はてなブックマーク用のスクリプト等、他のスクリプトについてもbookmarkボタン押下時に一度だけ実行されるように修正する。
2.結果と次の課題
トップページの表示速度は、bookmarkボタンを設置する前の状態に戻り、快適になった。ただし、ボタンを押下してから各種ブックマークボタンが表示されるまでが長い。また、各種ブックマークボタンが表示されるまでの間は「真っ白」なので、ユーザーには「バグか?」と思われそう。