ফেসবুকের FB.init সম্পূর্ণ হলে কীভাবে সনাক্ত করবেন


115

পুরানো জেএস এসডিকে FB.ensureInit নামে একটি ফাংশন ছিল। নতুন এসডিকে এমন ফাংশন আছে বলে মনে হচ্ছে না ... আমি কীভাবে নিশ্চিত করতে পারি যে আমি এপিআই কলগুলি সম্পূর্ণরূপে শুরু না করা পর্যন্ত না করব?

আমি প্রতিটি পৃষ্ঠার শীর্ষে এটি অন্তর্ভুক্ত:

<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>

আমার এই সমস্যার সমাধানের জন্য এই লিঙ্কটি দেখুন। facebook.stackoverflow.com/questions/12399428/...
Rémi Grumeau

উত্তর:


138

04 জানুয়ারী, 2012-এ আপডেট

দেখে মনে হচ্ছে আপনি ঠিক আগের মতো এফবি নির্ভর পদ্ধতিগুলি (উদাহরণস্বরূপ FB.getAuthResponse()) কল করতে পারবেন না FB.init(), যেমনটি FB.init()এখন অ্যাসিনক্রোনাস বলে মনে হচ্ছে। FB.getLoginStatus()প্রতিক্রিয়াতে আপনার কোডটি মোড়ানো এআইপিআই সম্পূর্ণ প্রস্তুত হওয়ার সময় সনাক্ত করার কৌশলটি মনে করে:

window.fbAsyncInit = function() {
    FB.init({
        //...
    });

    FB.getLoginStatus(function(response){
        runFbInitCriticalCode(); 
    });

};  

বা যদি fbEnsureInit()নীচে থেকে বাস্তবায়ন ব্যবহার করে:

window.fbAsyncInit = function() {
    FB.init({
        //...
    });

    FB.getLoginStatus(function(response){
        fbApiInit = true;
    });

};  

আসল পোস্ট:

আপনি যদি FB আরম্ভ করার সময় কিছু স্ক্রিপ্ট চালাতে চান তবে আপনি কিছু কলব্যাক ফাংশন ভিতরে রাখতে পারেন fbAsyncInit:

  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();

    runFbInitCriticalCode(); //function that contains FB init critical code
  };

আপনি যদি FB.ensureInit এর সঠিক প্রতিস্থাপন করতে চান তবে কোনও সরকারী প্রতিস্থাপন (বড় ভুল ইমো) না থাকায় আপনাকে নিজের কিছু লিখতে হবে। আমি যা ব্যবহার করি তা এখানে:

  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();

    fbApiInit = true; //init flag
  };

  function fbEnsureInit(callback) {
        if(!window.fbApiInit) {
            setTimeout(function() {fbEnsureInit(callback);}, 50);
        } else {
            if(callback) {
                callback();
            }
        }
    }

ব্যবহার:

fbEnsureInit(function() {
    console.log("this will be run once FB is initialized");
});

2
ধন্যবাদ সার্জ .. আপনি একজন কিংবদন্তি!
পাবলো

3
FB.init ডাকা হওয়ার সাথে সাথেই আমি ফেসবুক এপিআইয়ের অনুরোধটি চালাতে পারছি না - সম্ভবত যে পদ্ধতিটি আমি ব্যবহার করছি তা হচ্ছে 'fql.query'? যেভাবেই হোক, আমাকে fbApiInit পতাকাটিতে দীর্ঘ সময়সীমা নির্ধারণ করতে হবে।
ইয়ান হান্টার

আপডেটের জন্য ধন্যবাদ - আমার একই সমস্যা ছিল এবং আপনার আপডেট সমাধানটি পুরোপুরি কার্যকর হয়েছিল!
তেরি আন

@ জিনল্যান্ড, fql.query এপিআই কলগুলি ব্যবহারকারীর লগ ইন করা দরকার you আপনি কি নিশ্চিত যে আপনি responseআবার ফিরে আসার পরে ক্যোয়ারীটি চালাচ্ছেন FB.getLoginStatus(function(response){}? - উপরের "আসল উত্তর" বনাম "আপডেট হওয়া উত্তর" পার্থক্যটি নোট করুন।
tjmehta

@ সার্গ উদাহরণের জন্য আপনাকে ধন্যবাদ। fbAsyncInitলোডের পরে window.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); };
ডাকার

38

আসলে ফেসবুক ইতিমধ্যে প্রমাণীকরণ ইভেন্টগুলিতে সাবস্ক্রাইব করার একটি ব্যবস্থা সরবরাহ করেছে।

আপনার ক্ষেত্রে আপনি " স্ট্যাটাস: ট্রু " ব্যবহার করছেন যার অর্থ এফবি অবজেক্ট ফেসবুককে ব্যবহারকারীর লগইন স্থিতির জন্য অনুরোধ করবে।

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.getLoginStatus ()" কল করে আপনি আবার একই অনুরোধটি চালাচ্ছেন ।

এর পরিবর্তে আপনি ব্যবহার করতে পারে FB.Event.subscribe সাবস্ক্রাইব করার জন্য auth.statusChange বা auth.authResponseChange ঘটনা আগে আপনি FB.init কল

FB.Event.subscribe('auth.statusChange', function(response) {
    if(response.status == 'connected') {
        runFbInitCriticalCode();
    }
});

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.init এর পরে চালাতে পারবেন, কারণ কোনও অ্যাসিঙ্ক্রোনাস কল থাকবে না।


দ্রষ্টব্য: এই পদ্ধতির সাহায্যে কেবলমাত্র সতর্কতা হ'ল আপনি লগ ইন না করে থাকলে ইভেন্টটি ট্রিগার করা হবে না। কেবলমাত্র আপনার ডিফল্ট ইউআই অবস্থাটি এমনভাবে তৈরি করুন যেন সত্যায়িত হয় না এবং এটি পুরোপুরি কার্যকর হয়। তারপরে আপনি ইভেন্ট হ্যান্ডলারের অভ্যন্তরে সংযুক্ত বা না-অনুমোদিত ized
ডেভিড সি

এছাড়াও, ফ্রন্ট-এন্ড অ্যাপসের জন্য, সেট রিফ্রেশ ব্যবাহারকারীর লগইন অবস্থা, বজায় রাখার জন্য cookieকরতে trueInit PARAM বস্তু।
এমকে সাফি

12

আপনি যদি ব্যবহার করেন তবে একটি সমাধান এখানে এবং ফেসবুক অ্যাসিনক্রোনাস অলস লোডিং:

// listen to an Event
$(document).bind('fbInit',function(){
    console.log('fbInit complete; FB Object is Available');
});

// FB Async
window.fbAsyncInit = function() {
    FB.init({appId: 'app_id', 
         status: true, 
         cookie: true,
         oauth:true,
         xfbml: true});

    $(document).trigger('fbInit'); // trigger event
};

3
আমি এটা ভালোবাসি! একমাত্র সমস্যা হ'ল ফেসবুক জোর দিয়েছিল যে <body> ট্যাগ খোলার পরে আপনার নিজের সরাসরি এফবি টিআইএন কোডটি অন্তর্ভুক্ত করা উচিত, এবং সেরা অনুশীলন বলছে আপনার সমাধি <body> ট্যাগের আগে jQuery লোড করা উচিত। ডোহ! মুরগি এবং ডিম। আমি "স্ক্রু আপনাকে, ফেসবুক" বলতে প্ররোচিত করছি এবং jQuery এর পরে এফবি লোড করব।
ইথান ব্রাউন

@ ইথানব্রাউন আমি সম্মতি জানাই - আপনার পৃষ্ঠায় সম্ভবত এফবি প্রয়োজনের তুলনায় jQuery এর বেশি প্রয়োজন যাতে এটি বুঝতে পারে। আমি কয়েক বছর আগে পৃষ্ঠাটির শেষে jQuery লোড করার চেষ্টা ছেড়ে দিয়েছি ;-)
সাইমন_উইভার

version: 'v2.5'আর ডি জেএসনে যোগ করুন অন্যান্য বুদ্ধিমান এটি কাজ করবে না .. লিট এ আমার জন্য হয়নি। সহায়তার জন্য ধন্যবাদ
বিকাশ বানসাল

10

FB আরম্ভ হয়েছে কিনা তা পরীক্ষা করার আরেকটি উপায় নিম্নলিখিত কোডগুলি ব্যবহার করে:

ns.FBInitialized = function () {
    return typeof (FB) != 'undefined' && window.fbAsyncInit.hasRun;
};

সুতরাং আপনার পৃষ্ঠার প্রস্তুত ইভেন্টে আপনি এনএস.এফ.বি.আই.এনটিআইটিয়ালাইজড পরীক্ষা করতে পারেন এবং সেটটাইমআউট ব্যবহার করে ইভেন্টটি পরবর্তী পর্যায়ে পিছিয়ে দিতে পারেন।


এটাই আসল জিনিস! ধন্যবাদ!
থিয়াগো ম্যাসাডো

এটি একটি সহজ। এটি পছন্দ
ফারিস রায়হান

5

উপরের কয়েকটি সমাধানের কাজ করার সময়, আমি ভেবেছিলাম যে আমি আমাদের চূড়ান্ত সমাধান পোস্ট করব - যা একটি 'প্রস্তুত' পদ্ধতির সংজ্ঞা দেয় যা এফবি আরম্ভ হওয়ার সাথে সাথে প্রস্তুত হওয়ার সাথে সাথেই গুলি চালানো হবে। অন্যান্য সমাধানগুলির তুলনায় এটির সুবিধা রয়েছে যা এফবি প্রস্তুত হওয়ার আগে বা পরে কল করা নিরাপদ।

এটি এর মতো ব্যবহার করা যেতে পারে:

f52.fb.ready(function() {
    // safe to use FB here
});

সোর্স ফাইলটি এখানে (নোট করুন এটি একটি 'f52.fb' নেমস্পেসের মধ্যে সংজ্ঞায়িত করা হয়েছে)।

if (typeof(f52) === 'undefined') { f52 = {}; }
f52.fb = (function () {

    var fbAppId = f52.inputs.base.fbAppId,
        fbApiInit = false;

    var awaitingReady = [];

    var notifyQ = function() {
        var i = 0,
            l = awaitingReady.length;
        for(i = 0; i < l; i++) {
            awaitingReady[i]();
        }
    };

    var ready = function(cb) {
        if (fbApiInit) {
            cb();
        } else {
            awaitingReady.push(cb);
        }
    };

    window.fbAsyncInit = function() {
        FB.init({
            appId: fbAppId,
            xfbml: true,
            version: 'v2.0'
        });

        FB.getLoginStatus(function(response){
            fbApiInit = true;
            notifyQ();
        });
    };

    return {
        /**
         * Fires callback when FB is initialized and ready for api calls.
         */
        'ready': ready
    };

})();

4

আমি একটি গ্লোবাল ফাংশন ব্যবহার করে সেটটাইমআউট ব্যবহার এড়াতে পেরেছি:

সম্পাদনা দ্রষ্টব্য: আমি নিম্নলিখিত সহায়ক স্ক্রিপ্টগুলি আপডেট করেছি এবং একটি ক্লাস তৈরি করেছি যা ব্যবহার সহজ / সহজ; এটি এখানে দেখুন: :: https://github.com/tjmehta/fbExec.js

window.fbAsyncInit = function() {
    FB.init({
        //...
    });
    window.fbApiInit = true; //init flag
    if(window.thisFunctionIsCalledAfterFbInit)
        window.thisFunctionIsCalledAfterFbInit();
};

fbEnsureInit FB.init এর পরে কলব্যাক কল করবে

function fbEnsureInit(callback){
  if(!window.fbApiInit) {
    window.thisFunctionIsCalledAfterFbInit = callback; //find this in index.html
  }
  else{
    callback();
  }
}

fbEnsureInitAndLoginStatus FB.init এর পরে এবং FB.getLoginStatus এর পরে কলব্যাক কল করবে

function fbEnsureInitAndLoginStatus(callback){
  runAfterFbInit(function(){
    FB.getLoginStatus(function(response){
      if (response.status === 'connected') {
        // the user is logged in and has authenticated your
        // app, and response.authResponse supplies
        // the user's ID, a valid access token, a signed
        // request, and the time the access token
        // and signed request each expire
        callback();

      } else if (response.status === 'not_authorized') {
        // the user is logged in to Facebook,
        // but has not authenticated your app

      } else {
        // the user isn't logged in to Facebook.

      }
    });
  });
}

fbEnsure উদাহরণ ব্যবহারের জন্য:

(এফবি.লগিন এফবি আরম্ভ করার পরে চালানো দরকার)

fbEnsureInit(function(){
    FB.login(
       //..enter code here
    );
});

fbEnsureInitAndLogin উদাহরণ ব্যবহার:

(FB.api FB.init পরে চালানো দরকার এবং এফবি ব্যবহারকারী অবশ্যই লগ ইন করতে হবে))

fbEnsureInitAndLoginStatus(function(){
    FB.api(
       //..enter code here
    );
});

1
আমি এই সহায়ক ক্লাসটি লিখেছি যা উপরের মতো একইসাথে আরও সহজ এবং পরিচ্ছন্নতার সাথে সম্পাদন করে; এটি এখানে দেখুন: :: github.com/tjmehta/fbExec.js
tjmehta

4

কোনও সেটটাইমআউট বা সেটইন্টারওয়াল ব্যবহার করার পরিবর্তে আমি পিছিয়ে থাকা বস্তুগুলিতে আটকে থাকি ( এখানে jQuery দ্বারা প্রয়োগ )। যথাযথ মুহুর্তে সারিটি সমাধান করা এখনও জটিল, কারণ থ্রিতে কলব্যাক নেই তবে ইভেন্টের সাবস্ক্রিপশনের সাথে ফলাফলের সংমিশ্রণ করা (যেমন কেউ আমার আগে নির্দেশ করেছেন), কৌশলটি করা উচিত এবং যথেষ্ট কাছে হওয়া উচিত।

সিউডো-স্নিপেট নীচের মত দেখতে হবে:

FB.Event.subscribe('auth.statusChange', function(response) {
   if (response.authResponse) {
       // user has auth'd your app and is logged into Facebook
   } else {
       // user has not auth'd your app, or is not logged into Facebook
   }
   DeferredObject.resolve();
});

4

এখানে একটি সহজ পদ্ধতি, এর জন্য ইভেন্ট বা টাইমআউটগুলির প্রয়োজন নেই। তবে এর জন্য jQuery দরকার নেই।

ব্যবহার jQuery.holdReady() (দস্তাবেজ)

সুতরাং, আপনার jQuery স্ক্রিপ্টের সাথে সাথেই, প্রস্তুত ইভেন্টটি বিলম্ব করুন।

<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
    $.holdReady( true ); // don't fire ready until told (ie when FB loaded)
</script>

তারপরে, আপনার ফেসবুক ইন ফাংশনে, এটি প্রকাশ করুন:

window.fbAsyncInit = function() {
    FB.init({
        appId: '11111111111111',
        cookie: true,
        xfbml: false,
        version: 'v2.4'
    });

    // release the ready event to execute
    $.holdReady( false );
};

তারপরে আপনি প্রস্তুত ইভেন্টটি সাধারণ হিসাবে ব্যবহার করতে পারেন:

$(document).ready( myApp.init );

2

আপনি ইভেন্টটি সাবস্ক্রাইব করতে পারেন:

বড়)

FB.Event.subscribe('auth.login', function(response) {
  FB.api('/me', function(response) {
    alert(response.name);
  });
});

2

ছোট কিন্তু গুরুত্বপূর্ণ নোটিশ:

  1. FB.getLoginStatusঅবশ্যই পরে ফোন করা উচিত FB.init, অন্যথায় এটি ইভেন্টটিকে আগুন ধরিয়ে দেবে না।

  2. আপনি ব্যবহার করতে পারেন FB.Event.subscribe('auth.statusChange', callback), কিন্তু ব্যবহারকারী ফেসবুকে লগইন না করা অবস্থায় এটি আগুন লাগবে না।

উভয় ফাংশন সহ কার্যকারী উদাহরণ এখানে

window.fbAsyncInit = function() {
    FB.Event.subscribe('auth.statusChange', function(response) {
        console.log( "FB.Event.subscribe auth.statusChange" );
        console.log( response );
    });

    FB.init({
        appId   : "YOUR APP KEY HERE",
        cookie  : true,  // enable cookies to allow the server to access
                // the session
        xfbml   : true,  // parse social plugins on this page
        version : 'v2.1', // use version 2.1
        status  : true
    });

    FB.getLoginStatus(function(response){
        console.log( "FB.getLoginStatus" );
        console.log( response );
    });

};

// Load the SDK asynchronously
(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/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

1

ফেসবুক এপিআই FB._apiKey এর জন্য নজর রাখে যাতে আপনি API এর নিজের অ্যাপ্লিকেশনটি কল করার আগে এই জাতীয় কিছু দিয়ে দেখতে পারেন:

window.fbAsyncInit = function() {
  FB.init({
    //...your init object
  });
  function myUseOfFB(){
    //...your FB API calls
  };
  function FBreadyState(){
    if(FB._apiKey) return myUseOfFB();
    setTimeout(FBreadyState, 100); // adjust time as-desired
  };
  FBreadyState();
}; 

এটি নিশ্চিত না যে এটি একটি পার্থক্য করেছে তবে আমার ক্ষেত্রে - কারণ আমি নিশ্চিত হতে চেয়েছিলাম যে ইউআই প্রস্তুত ছিল - আমি জিকুয়েরির নথি প্রস্তুতের সাথে প্রাথমিককরণটি গুটিয়ে রেখেছি (শেষের দিকে কিছুটা):

  $(document).ready(FBreadyState);

এটাও খেয়াল করুন যে আমি ফেসবুকের সমস্ত.জেএস লোড করার জন্য অ্যাসিঙ্ক = সত্য ব্যবহার করছি না, যা আমার ক্ষেত্রে ইউআইতে সাইন ইন করতে এবং ড্রাইভিং বৈশিষ্ট্যগুলিকে আরও নির্ভরযোগ্যতার সাথে সহায়তা করছে বলে মনে হয়।


1

কখনও কখনও fbAsyncInit কাজ করে না। আমি কেন জানি না এবং এই কাজটি তখন ব্যবহার করি না:

 var interval = window.setInterval(function(){
    if(typeof FB != 'undefined'){
        FB.init({
            appId      : 'your ID',
            cookie     : true,  // enable cookies to allow the server to access// the session
            xfbml      : true,  // parse social plugins on this page
            version    : 'v2.3' // use version 2.3
        });

        FB.getLoginStatus(function(response) {
            statusChangeCallback(response);
        });
        clearInterval(interval);
    }
},100);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.