28
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-08

はじめに

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

基本的には、

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

という流れです。

ソース

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

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箇所各自埋め込んでください。

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'));
  });
})();
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');
  });
})();
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();
  });
})();
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などが使えない環境で、シェア文言などを書き換える必要があるとき、
変数を使って文字列を書き換えるのにも便利だと思います。

28
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?