JS SDK lama memiliki fungsi yang disebut FB.ensureInit. SDK baru tampaknya tidak memiliki fungsi seperti itu ... bagaimana saya bisa memastikan bahwa saya tidak melakukan panggilan api sampai dimulai sepenuhnya?
Saya menyertakan ini di bagian atas setiap halaman:
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $conf['fb']['appid']; ?>',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
FB.Canvas.setAutoResize();
};
(function() {
var e = document.createElement('script');
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
</script>
javascript
facebook
Pablo
sumber
sumber
Jawaban:
Pembaruan pada 4 Januari 2012
Sepertinya Anda tidak bisa begitu saja memanggil metode yang bergantung pada FB (misalnya
FB.getAuthResponse()
) tepat setelahFB.init()
seperti sebelumnya, karenaFB.init()
tampaknya tidak sinkron sekarang. Membungkus kode Anda menjadiFB.getLoginStatus()
respons tampaknya melakukan trik untuk mendeteksi ketika API sepenuhnya siap:atau jika menggunakan
fbEnsureInit()
implementasi dari bawah:Posting Asli:
Jika Anda ingin menjalankan beberapa skrip saat FB diinisialisasi, Anda dapat meletakkan beberapa fungsi panggilan balik di dalamnya
fbAsyncInit
:Jika Anda ingin penggantian yang tepat dari FB.ensureInit maka Anda harus menulis sesuatu sendiri karena tidak ada pengganti resmi (kesalahan besar imo). Inilah yang saya gunakan:
Pemakaian:
sumber
response
kembaliFB.getLoginStatus(function(response){}
? - perhatikan perbedaan "jawaban yang diperbarui" vs. "jawaban asli" di atas.fbAsyncInit
dalamnya agar dapat dipanggil setelah pemuatanwindow.fbAsyncInit = function() { FB.init({ appId : '*************', channelUrl : 'http://www.mydomain.com', status : true, // check login status cookie : true, // enable cookies to allow the server to access the session oauth : true, // enable OAuth 2.0 xfbml : true // parse XFBML }); setTimeout(function() { myfunction(function (callback) {}, '', '', '' ); }, 1200); };
Sebenarnya Facebook sudah menyediakan mekanisme untuk berlangganan event otentikasi.
Dalam kasus Anda, Anda menggunakan " status: true " yang berarti bahwa objek FB akan meminta status login pengguna dari Facebook.
Dengan memanggil "FB.getLoginStatus ()" Anda menjalankan permintaan yang sama lagi .
Sebaliknya Anda bisa menggunakan FB.Event.subscribe untuk berlangganan auth.statusChange atau auth.authResponseChange acara SEBELUM Anda menelepon FB.init
Kemungkinan besar, saat menggunakan " status: false " Anda dapat menjalankan kode apa pun tepat setelah FB.init, karena tidak akan ada panggilan asinkron.
sumber
cookie
ketrue
dalam objek param init.Berikut adalah solusi jika Anda menggunakan jquery dan Facebook Asynchronous Lazy Loading:
sumber
version: 'v2.5'
init json lain bijaksana itu tidak akan berhasil .. setidaknya tidak untuk saya. terima kasih atas bantuannyaCara lain untuk memeriksa apakah FB telah diinisialisasi adalah dengan menggunakan kode berikut:
Jadi dalam acara siap halaman Anda, Anda dapat memeriksa ns.FBInitialized dan menunda acara ke fase selanjutnya dengan menggunakan setTimeOut.
sumber
Sementara beberapa solusi di atas berfungsi, saya pikir saya akan memposting solusi akhirnya - yang mendefinisikan metode 'siap' yang akan diaktifkan segera setelah FB diinisialisasi dan siap digunakan. Ini memiliki keunggulan dibandingkan solusi lain yang aman untuk dihubungi baik sebelum atau setelah FB siap.
Ini dapat digunakan seperti ini:
Berikut file sumbernya (perhatikan bahwa itu didefinisikan dalam namespace 'f52.fb').
sumber
Saya telah menghindari penggunaan setTimeout dengan menggunakan fungsi global:
EDIT CATATAN: Saya telah memperbarui skrip pembantu berikut dan membuat kelas yang lebih mudah / sederhana untuk digunakan; lihat di sini ::: https://github.com/tjmehta/fbExec.js
fbEnsureInit akan memanggilnya callback setelah FB.init
fbEnsureInitAndLoginStatus akan memanggil callbacknya setelah FB.init dan setelah FB.getLoginStatus
fbEnsureInit contoh penggunaan:
(FB.login harus dijalankan setelah FB diinisialisasi)
fbEnsureInitAndLogin contoh penggunaan:
(FB.api harus dijalankan setelah FB.init dan pengguna FB harus masuk.)
sumber
Alih-alih menggunakan setTimeout atau setInterval, saya akan tetap menggunakan objek yang ditangguhkan (implementasi oleh jQuery di sini ). Masih sulit untuk menyelesaikan antrian pada saat yang tepat, karena init tidak memiliki panggilan balik tetapi menggabungkan hasil dengan langganan acara (seperti yang ditunjukkan seseorang sebelum saya), harus melakukan trik dan cukup dekat.
Pseudo-snippet akan terlihat sebagai berikut:
sumber
Berikut adalah metode yang lebih sederhana, yang tidak memerlukan kejadian atau waktu tunggu. Namun, itu membutuhkan jQuery.
Gunakan
jQuery.holdReady()
(dokumen)Jadi, segera setelah skrip jQuery Anda, tunda acara siap.
Kemudian, di fungsi init Facebook Anda, lepaskan:
Kemudian Anda dapat menggunakan acara siap seperti biasa:
sumber
Anda dapat berlangganan acara:
yaitu)
sumber
Pemberitahuan kecil tapi PENTING:
FB.getLoginStatus
harus dipanggil setelahnyaFB.init
, jika tidak maka acara tidak akan disulut.Anda dapat menggunakan
FB.Event.subscribe('auth.statusChange', callback)
, tetapi tidak akan menyala saat pengguna tidak masuk facebook.Berikut adalah contoh kerja dengan kedua fungsi tersebut
sumber
API Facebook mengawasi FB._apiKey sehingga Anda dapat melihatnya sebelum memanggil aplikasi API Anda sendiri dengan sesuatu seperti:
Tidak yakin ini membuat perbedaan tetapi dalam kasus saya - karena saya ingin memastikan UI sudah siap - saya telah membungkus inisialisasi dengan dokumen jQuery siap (bit terakhir di atas):
Perhatikan juga bahwa saya TIDAK menggunakan async = true untuk memuat all.js Facebook, yang dalam kasus saya tampaknya membantu masuk ke UI dan menjalankan fitur dengan lebih andal.
sumber
Terkadang fbAsyncInit tidak berfungsi. Saya tidak tahu mengapa dan menggunakan solusi ini kemudian:
sumber