JSだけでソーシャルボタン設置

# はじめに

いいねボタン（シェアボタン）、Twitterツイートボタン、LINEボタン、Google+ +1ボタンをJSだけで読み込む方法を試行錯誤しました。

基本的には、

- 各SNSのボタン設置用スクリプトを動的に読み込み
- ページのロードのタイミングで公式の設置コードをHTMLに埋め込み
- 各SNSの動的更新コマンドを実行

という流れです。

# ソース

雛形のHTMLはこんな感じです。OGPを仕込んで自前のCSS・JSを読み込む以外は、何の変哲もないソースです。

```html:index.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="utf-8">
  <title>JS share button</title>

  <meta property="og:title" content="XHTML like">
  <meta property="og:type" content="website">
  <meta property="og:url" content="http://example.com/">
  <meta property="og:image" content="http://example.com/ogp.png">

  <link rel="stylesheet" href="css/style.css">
</head>

<body>
  <div class="wrapper">
    <ul class="list-share">
      <li class="item facebook"></li>
      <li class="item twitter"></li>
      <li class="item line"></li>
      <li class="item gplus"></li>
    </ul>
  </div>

  <script type="text/javascript" src="js/script.js"></script>
</body>

</html>
```

JSはそれぞれ小分けして記載しています。（上記で `js/script.js` としているところを適宜書き換えてください。）
※ FacebookのappIdは2箇所各自埋め込んでください。

```js:like-button.js
(function likeButton() {
  var likeElm = document.createElement('div');
  likeElm.innerHTML = '<div class="fb-like" data-action="like" data-href="http://example.com/" data-layout="button_count" data-share="false" data-size="small"></div>';

  window.addEventListener('load', function() {
    document.querySelector('.facebook').appendChild(likeElm);

    window.fbAsyncInit = function() {
      FB.init({
        appId      : 'XXXXXXXX',
        xfbml      : true,
        version    : 'v2.8'
      });
    };

    (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/sdk.js#xfbml=1&version=v2.8&appId=XXXXXXXX";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
  });
})();
```

```js:tweet-button.js
(function tweetButton() {
  window.addEventListener('load', function() {
    var tweetElm = document.createElement('div');
    tweetElm.innerHTML = '<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://example.com" data-text="JS share button" data-lang="ja">ツイート</a>';

    document.querySelector('.twitter').appendChild(tweetElm);

    !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');
  });
})();
```

```js:line-button.js
(function lineButton() {
  var scriptElm = document.createElement('script');
  scriptElm.src = '//scdn.line-apps.com/n/line_it/thirdparty/loader.min.js';
  document.body.appendChild(scriptElm);

  window.addEventListener('load', function() {
    var lineElm = document.createElement('div');
    lineElm.innerHTML = '<div class="line-it-button" style="display: none;" data-type="share-a" data-lang="ja" ></div>';

    document.querySelector('.line').appendChild(lineElm);

    LineIt.loadButton();
  });
})();
```

```js:plusone-button.js
(function plusoneButton() {
  var scriptElm = document.createElement('script');
  scriptElm.src = 'https://apis.google.com/js/platform.js';
  scriptElm.innerHTML = "{lang: 'ja', parsetags: 'explicit'}";
  document.body.appendChild(scriptElm);

  window.addEventListener('load', function() {
    var gplusElm = document.createElement('div');
    gplusElm.innerHTML = '<div class="g-plusone" data-size="medium"></div>';

    document.querySelector('.gplus').appendChild(gplusElm);

    gapi.plusone.go();
  });
})();
```

# 注意事項

本プログラムは2016年11月8日現在のものです。
ソーシャルボタンの仕様はよく変わるので、そのときに応じた公式のボタン設置コードに準ずるようにしましょう。


# まとめ

HTMLに手を入れることなくJavaScriptだけでソーシャルボタンを設置する方法を提示しました。
設置するコード自体は元々HTMLに埋め込むものと変わりないですが、
全てをJavaScriptで賄うことができるのでパッケージ化は楽になるかと思われます。
また、PugやSlimなどが使えない環境で、シェア文言などを書き換える必要があるとき、
変数を使って文字列を書き換えるのにも便利だと思います。