一般 facebook social plugin 初始化方式會是以下的程式碼,藉由引入外部 javascript 檔案作第三方服務需要的事情,以臉書來說就是判別 fb-root,根據裡面的屬性產生像是「讚」的按鈕。觸發時機多是在第一次網頁讀取完成的同時執行。

而 infinite scrolling 產生更多網站內容的作法流程是,隨著網頁滾動,不斷透過 ajax 方式讀取後台資料呈現出來,導致產生出來的 facebook social plugin 程式碼沒有辦法被初始化。

<div id="fb-root"></div>
<script>
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=679022945540034&version=v2.0";
    fjs.parentNode.insertBefore(js, fjs);
  }(document, 'script', 'facebook-jssdk'));
</script>

解決方法

方法很簡單,只要在完成資料呈現的同時,加入以下程式碼即可。

FB.XFBML.parse();

官方文件是這麼描述這行程式碼的用途

You can use this function to re-render social plugins using either the XFBML syntax (e.g. fb:like) or the HTML5 syntax (e.g. <div class="fb-like">)

也就是說只要呼叫這行程式碼,就會將整份網站內,所有根據 XFBML 語法的元素,重新再被初始化呈現一次。FBML 則是 FaceBook Markup Language 的縮寫,XFBML 即是代表 HTML + FBML 的意思。

進階用法

在 parse 的函式內甚至可以針對新加到網站內容內的元素直接作重新初始化,避免原先已經存在的 social plugin 又再次被初始化。

FB.XFBML.parse(document.getElementById('foo'));