Facebook登录IE后无法重新加载

时间:2013-05-21 18:32:46

标签: facebook internet-explorer internet-explorer-9 facebook-javascript-sdk

我正在使用Facebook PHP SDK和Facebook JS SDK来管理网络应用中的身份验证。流程应如下所示:单击FB登录按钮 - >启动OAuth对话框 - >在OAuth对话框中输入帐户详细信息 - >关闭OAuth对话框并重新加载网页(现在显示经过身份验证的用户的内容)。我认为所有标准都非常标准。

我最初订阅了auth.login和auth.logout,这在Firefox中完美运行,但是在IE 10中它没有在OAuth对话框后重新加载 - 我不得不手动重新加载以查看作为经过身份验证的用户的网站。从使用警报进行测试(以及阅读有关SO的其他问题),似乎Facebook的auth.login事件在IE 10下根本不会触发(虽然auth.logout工作正常)。所以我切换到订阅auth.authResponseChange事件,它现在在Firefox和IE 10下正确重新加载。

但是,我仍然在IE 9下遇到同样的问题:OAuth关闭后没有重新加载。 auth.authResponseChange事件被识别,但在手动重新加载页面之前,它似乎不会在IE 9下触发。显然,尽管我们都喜欢放弃它,IE 9的使用范围非常广泛,支持它不是可选的,并且在登录后需要手动重新加载是不可接受的。

我相信我的代码很好,因为它在其他浏览器中正常工作,并且一旦事件被触发,即使在IE 9中,auth.authResponseChange事件触发的代码也能正确运行 - 问题是由于某种原因,事件只是在手动重新加载之后才触发。不过,这是我的FB init代码供参考:

<!-- START FACEBOOK CONNECT -->
<div id="fb-root"></div>
<script>
function setCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function clearCookie(name) {
    setCookie(name,"",-1);
}

// Main init code
window.fbAsyncInit = function() {
    FB.init({
        appId      : '<?=$vt->conf->fb->appID?>',
        channelUrl : '//<?=$vt->conf->domain?>/fb_channel.html',
        status     : true,
        cookie     : true,
        xfbml      : true
    });

    // Additional init code here
<?php if ($page->vt->auth->usingFacebook) { ?>
    FB.Event.subscribe('auth.authResponseChange', function(response) {
        if (response.status != 'connected') {
            // User has been logged out
            //console.log('FB: logout');
            alert('FB logout');
            clearCookie('vt_fbat');
            window.location.reload(true);
        }
    });
<?php } else { ?>
    FB.Event.subscribe('auth.authResponseChange', function(response) {
        if (response.status == 'connected') {
            // User has been logged in
            //console.log('FB: login');
            alert('FB login');
            setCookie('vt_fbat',response.authResponse.accessToken);
            window.location.reload(true);
        }
    });
<?php } ?>
    //
    //
    //FB.Event.subscribe('auth.authResponseChange', function(response) {
    //  alert('FB: login');
    //  console.log('FB: login');
    //  console.dir(response);
    //  setCookie('vt_fbat',response.authResponse.accessToken);
    //  window.location.reload(true);
    //});
    //FB.Event.subscribe('auth.logout', function(response) {
    //  console.log('FB: logout');
    //  clearCookie('vt_fbat');
    //  window.location.reload(true);
    //});
};

// Load the SDK Asynchronously
(function(d){
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    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));
</script>
<!-- END FACEBOOK CONNECT -->

由于它可以在其他浏览器中运行,并且我已经仔细检查了IE 9下的源代码,我确信PHP工作正常,但您知道:它使用PHP来填写App ID和频道文件URL。此外,根据PHP SDK是否检测到已登录Facebook,打印不同的JavaScript。如果我们已经登录到Facebook,它正在注意退出;如果我们不是,它正在观看登录。这是必要的,因为切换到auth.authResponseChange,它会一直触发。

我已经阅读了关于SO的多个相关问题并尝试了我能想到的一切,但我无法在IE 9下工作。任何人都可以提出任何建议吗?

0 个答案:

没有答案
相关问题