Per documentation, the html attribute 'onlogin' can be used to run a callback function after a login is complete
However we're consistently getting the supplied function run twice, causing problems when it does actual work.
While we can catch this with a counter of how many times its run I'd rather have an understanding of why this happens and fix it than apply a workaround. The entirety of the code is below (won't run in snippet):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>facebook login test</title>
<script src="/Vendors/jQuery/jquery-3.2.1.min.js"></script>
</head>
<body>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : 'foobar123456', // see https://developers.facebook.com/apps/
cookie : true,
xfbml : true,
version : 'v2.11' // see https://developers.facebook.com/docs/javascript/quickstart
});
FB.AppEvents.logPageView();
};
(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 = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
<!-- LOGIN BUTTON scope at: https://developers.facebook.com/docs/facebook-login/permissions/ -->
<div class="fb-login-button" data-width="250" data-max-rows="1" data-size="large" onlogin="fbLoginHandler" data-scope="public_profile,email" data-button-type="login_with" data-show-faces="false" data-auto-logout-link="true" data-use-continue-as="true"></div>
<script>
console.log("reached script tag");
var timesfbLoginHandlerFired = 0;
var fbLoginHandler = ()=>{
timesfbLoginHandlerFired++;
console.log("fbLoginHandler fired ["+timesfbLoginHandlerFired+"] times");
};
</script>
</body>
</html>
And the console:
Navigated to https://fbtest.dev/fblogin <- on page load
reached script tag <- on page load
XHR finished loading: POST "https://www.facebook.com/ajax/bz". <- on page load
XHR finished loading: POST "https://www.facebook.com/ajax/bz". <- on facebook login prompt window opening
fbLoginHandler fired [1] times <- on login complete
fbLoginHandler fired [2] times <- on login complete
My Faster workaround was as following:
I just set a variable called fblogin_done
fblogin_done = 0;
And in the function that is being executed twice i put a counter and a blocker with a timer
function CheckLoginState() {
if (fblogin_done == 1) return; // avoid twice executions
fblogin_done = 1;
window.setTimeout(function(){
fblogin_done = 0; // wait 1 second after a second execution
}, 1000);
}
A second was enough to me to avoid more than 1 execution,
It seems to have to do with the data-auto-logout-link set to true.
Setting that to false, stops the button from firing the onlogin function twice.
Without seeing how the SDK handles it, my best guess is that when the button changes to become a logout button, it must be checking for login and triggering the onlogin function a second time.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With