ソーシャルプラグインのlazyload
- 調べたり試したことのまとめ
- とりあえずfb,twitter,g+だけ
- コピペ用コード並べた
やりたいこと
- 画像でみかける遅延読み込み、オンデマンドでの読み込み
- それをlikeboxとか、tweetボタンとかでもやりたい
- techcrunchのトップとかでやってるあれ
- mashableのトップは全然違う
- layzyload関係ない
- あれはサーバ側であらかじめページにボタンを埋め込んでる
- だからtweet数とかlike数とかの数値がかなりずれる
- 割り切り型の手法
- そもそもfb/tw/g+へhttpリクエスト出さない
- CDNもつかって速さに挑戦してる
- 「この辺までスクロールしたら表示」とか「カーソルこの辺まで来たらロード」ロードとか
- 出来るだけhttpリクエストを減らす、というより、小出しにしたい
- 初回ページロードだけでなく、ajaxとかpjaxにも対応
##ライブラリはあるにはあるが。。。
Socialite.js
- 機能が足りない感じ
- ボタンだけとか
- ソーシャルプラグイン側の仕様にがっつり追従できるのか、不安
- 実際`socialite.js`は最近開発されてない
- プラグインのSDK
##ライブラリ(SDK)の読み込み
- とりあえず何度も読みに行かない
plusone.js
、`widgets.js`、`all.js`を何度もリクエストしないFB
、twttr
、gapi
オブジェクトの有無を判定すればOK
# jQuery + coffeescriptで # twitter if !twttr? jQuery.getScript "//platform.twitter.com/widgets.js" else console.log "OK" # facebook if !FB? jQuery.getScript "//connect.facebook.net/ja_JP/all.js" else console.log "OK" # google+ if !gapi? jQuery.getScript "//connect.facebook.net/ja_JP/all.js" else console.log "OK"
プラグラインの初期化
- SDKが入ったjsを読み込んだ後の話
- 初期化?
- 初期化の設定でプラグインのロード(レンダリング)だけはオフにしたい
- facebook、google+はAPIがサポートしてるのでシンプルにできる
- fb
xfbml:false
をFB.init({..option.})
のオプションに指定
- G+
parsetags:"explicit"
をwindow.___gcfg
プロパティにセット
- fb
- twitterはアカン
widgets.js
読み込みおわったらページ内の全てのソーシャルプラグインのレンダリングが始まる- developer toolsのnetworkタブは凄いことに
- 引数無しの
twttr.widgets.load()
が必ず走ってしまう - ページ全体の全てのplaceholder(=プラグイン埋め込み予定地)でプラグインのロードが始まる
- twitterはアカンが回避方法は一応。。
- 初期化のタイミングは気にしとく
- SDKを非同期読み込みするから
FB
オブジェクトがないのにFB.init()
とかやってしまわない- とはいえ気にしないといけないのはfacebookだけ
- facebook sdkもそんなに大変じゃない
window.fbAsyncInit= fucntion(){....}
の....
でFB.init(...)
書く- こう書けば安全に
FB.init()
できる
# g+ window.___gcfg = parsetags:"explicit" # レンダリング=手動に lang:"ja" # ローカライズ #facebook window.fbAsyncInit = -> FB.init( xfbml:false ) # g+の___gcfgプロパティに設定できるオプションの話 # https://developers.google.com/+/web/+1button/?hl=ja # # FB.init(options)のoptions一覧はここ # https://developers.facebook.com/docs/reference/javascript/FB.init/
twitter sdk読み込み直後の自動レンダリングを回避する
- g+やfbのと違って一手間必要
twttr.widegets.load(arg)
はこんな動きtwttr.widgets.load()
はプレースホルダがなければ空振りする- プレースホルダーかの条件
- a要素か、blockquote要素
- それぞれ決まったclass名がついてる
//cssセレクタで書くとこんな感じ "a.twitter-share-button" "a.twitter-mention-button" "a.twitter-hashtag-button" "a.twitter-follow-button" "a.twitter-timeline" "blockquote.twitter-tweet" /* http://platform.twitter.com/widgets.js の後ろのほうに書いてある */
引数なし、ありを比較するとこんな感じ
# プラグインをロードする箇所を明示してる場合 twttr.widgets.load document.getElementById(".share")[0] # twttr.widgets.load()ただするだけだとこんな感じになる selector = "a.twitter-share-button" selector += ",a.twitter-mention-button" selector += ",a.twitter-hashtag-button" selector += ",a.twitter-follow-button" selector += ",a.twitter-timeline" selector += ",blockquote.twitter-tweet" jQuery(selector).each -> twttr.widgets.load @
- プレーホルダーとして検出されないようにするやり方1
- スニペットをちょっとだけ直す(class名かえとく)
<!--スニペットで、twitter-tweetになってるとこを、no-twitter-tweetにしといて、.load()する直前にclass名かえとく--> <blockquote class="no-twitter-tweet"> <p>なんでや! 家入さん無関係やろ! RT <a href="https://twitter.com/fukuyuki">@fukuyuki</a>: 今回のロリポップの大量ハッキング騒動で最も特筆するべきことは、この騒動の中、創業者である家入さんは「ネットも電気もお金もない砂漠の真ん中で一週間生活する」というバーニングマンというイベントに参加していたことだと思う。</p> ― やまもといちろう (@kirik) <a href="https://twitter.com/kirik/statuses/373370555464183808">August 30, 2013</a> </blockquote>
- その2
- ボタンをオンザフライで生成するメソッドを使う
twttr.widgets.createShareButton()
とか
//.share内部にボタンが挿入される twttr.widgets.createShareButton( "http://hatena.ne.jp" document.getElementById(".share")[0] -> console.log "buttonできた" return count:"horizontal" text:"Hatena" lang:"ja" )
オンデマンドでプラグインをロード
- sdkロード、sdk初期化が終わったあとの話
- スクロールしたタイミング
- ajaxやら、history api経由とかコンテンツ持って来たあととか
- ここからはfacebook,g+,twitterはだいたい同じ
- ロード用のメソッドにプレースホルダーのdomノード渡すだけ
### 引数に渡すdomノードは placeholderそのものじゃなくて placeholderの親要素でok ### jQuery(.social).each -> #g+ gapi.plusone.go @ #twitter twttr.widgets.load @ #facebook FB.XFBML.parse @
- あとはイベント発火のタイミングとかであれこれ指定したらいい