MyNamespace.Facebook.coffee:
namespace 'MyNamespace', (exports) ->
exports.FacebookAPILoader = class
constructor: (@appId, @channelFileUrl) ->
@init()
init: (fbAPILoadedCallback) ->
#FB triggers/calls window.fbAsyncInit() after the API javascript loads:
window.fbAsyncInit = () =>
@initFb()
fbAPILoadedCallback() if fbAPILoadedCallback?
return
@loadAPI()
loadAPI: () ->
((d) ->
id = 'facebook-jssdk'
ref = d.getElementsByTagName('script')[0]
return if d.getElementById id
js = d.createElement 'script'
js.id = id
js.async = true
js.src = "//connect.facebook.net/en_US/all.js"
ref.parentNode.insertBefore js, ref
)(document)
# Set app specific settings here:
initFb: () ->
fbConfig =
appId: @appId
channelUrl: @channelFileUrl
status: true
cookie: true
xfbml: true
FB.init fbConfig
これは、ビューに API をロードする方法です: //MyView.cshtml:
@using (Script.Foot()) {
var settingsReader = new System.Configuration.AppSettingsReader();
var facebookAPIAppId = settingsReader.GetValue("Facebook_API_AppId", typeof(string));
var hostName = settingsReader.GetValue("EnvHostname", typeof(string));
<script type="text/javascript">
var myFb;
$(document).ready(function () {
myFb = new MyNamespace.FacebookAPILoader(
'@Html.Raw(facebookAPIAppId)'
, '//@Html.Raw(hostName)/modules/myapp/channel.html'
);
});
</script>
}
</body>
Jquery は終了タグの直前にロードされます。2 つの質問があります。
ここにロードする方法に何か問題がありますか? jquery がドキュメントの「ready」イベントを発生させた後、非同期でロードされると思いますが、それは正しいですか? パフォーマンスが向上する方法はありますか?
fbAsyncInit() 内で実行される任意のコールバックを渡すことができるように、このモジュールをセットアップする最良の方法は何ですか? これを CMS (Orchard) 駆動の Web サイト内で使用しています。fbAsyncInit() の一部として実行する必要がある独自のカスタム コールバックを追加するために、同じ HTTP 要求に複数のビューを含めることができます。どうすればそれを達成できますか? コールバック配列を渡すだけでよいことはわかっていますが、特定のページのさまざまな機能すべてが、Facebook 関連のコードが何であるかを確認する方法と、 FacebookAPILoader.init() は、これらすべての FB ウィジェットのコールバックと DOM 要素の後にのみ実行され、すべてがそれと対話する準備ができています。
更新:_gaq
Google アナリティクスの非同期トラッキングがグローバル名前空間の変数で
行うのと同じ方法でこれを行うと思います。Facebook API との対話が必要なコードは、コールバックを _gaq スタイルのキューにプッシュできます。準備ができたら、FacebookAPILoader モジュールがそのキューをプルします。これは素朴なアプローチですか?fbAPILoadedCallback() が既に呼び出された後に、私のコードが_gaqスタイルのキューに追加しようとする危険性はありますか?