fb.login后FB.ui feed弹出窗口被阻止

时间:2015-05-29 01:50:44

标签: javascript facebook

这是代码流,首先是登录,它的工作正常,但之后我想立即调用feed函数,这可能是浏览器阻止它的原因,有什么其他方法可以做到这一点吗?如果将显示设置为iframe,它的工作效果很好,但我真的希望它作为弹出窗口。 Tahnks。

<a href="#" onclick="fblogin()">Share</a>

功能

function fblogin() {  
    FB.login(function(response) {
        if (response.authResponse) {  
            FB.api('/me', {fields: 'last_name, first_name, gender, email, id'}, function(reslog) { 
                FB.getLoginStatus(function(response) {
                    if (response.status === 'connected') {
                         postToFeed(reslog.gender);
                    }
                });
            });
        } else {
            //console.log('X');
        }
    }, {scope:'email'});      
}

postToFeed

function postToFeed(gender) {
    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            FB.ui( {
                method: 'feed',
                display: 'popup',
                [...]
            }, function( response ) {
                console.log( 'before',response );
                if ( response !== null && typeof response.post_id !== 'undefined' ) {
                    console.log( 'done',response );
                }
            });       
        }
    }); 
} 

1 个答案:

答案 0 :(得分:0)

您必须直接在用户交互上调用FB.ui对话框(=在鼠标事件的回调函数中)。 FB.getLoginStatus是异步的,这就是(好的)浏览器阻止它的原因。

改为在页面加载时使用FB.getLoginStatus,并存储状态。或者更好:删除它,因为您不需要授权用户使用FB.ui对话框。在您的代码中它没有任何意义,因为您只在FB.login之后使用它,甚至在API调用之后 - 因此用户肯定会登录。

FB.login也是异步的,并且尝试在登录后立即向用户呈现共享对话框不仅令用户烦恼,而且还违反规则imho。我认为这是“激励”:

  

只有激励用户登录您的应用,才能进入促销活动   您应用的页面,或在某个地方办理登机手续。不要激励其他人   动作。

来源:https://developers.facebook.com/policy/

新代码:

HTML:

<a href="#" onclick="postToFeed()">Share</a>

JavaScript函数“postToFeed”:

FB.ui( {
    method: 'feed',
    display: 'popup',
    [...]
}, function( response ) {
    console.log( 'before',response );
    if ( response !== null && typeof response.post_id !== 'undefined' ) {
        console.log( 'done',response );
    }
});