Facebook登录对话框弹出窗口被阻止

时间:2016-07-13 13:32:01

标签: javascript facebook

我在这个网站上搜索过这个问题,但并没有真正指出我正确的方向,我希望我应该解决这个问题,因为我似乎更具体一点。

我的FB JS对话框被浏览器中的弹出窗口阻止程序阻止,我知道为什么因为我没有直接调用FB.Login()函数。相反,在我请求许可之前,我正在进行一系列检查,因此它最大限度地减少了推送到服务器的呼叫量,并且不会使用户烦恼。

如果满足某些条件,我只想要求此publish_actions权限,即  1.他们已登录  以前没有问过  3. cookie已经过了日期再次询问

但似乎这是不可能的。

发表评论按钮:

<input class="interaction-button-post" onclick="post_comment(4297,"OOS-4297");return false;" type="submit" value="Post">

使用facebook登录检查向服务器端发表评论的功能:

function post_comment(card_cache_id,offset)
{
    // get content
    if(jQuery("#comment-form-"+offset).closest(".wall-card").hasClass("facebook"))
    {
       FB.getLoginStatus(function(response) {
        if (response.status === 'connected')
        {
            check_permissions();
        }
       });
    }
    //posts the comment to the database using ajax
}
    //ask permission and if granted, make post to update DB 
    function get_perms() {
        FB.login(function(response) {
            console.log(response);
            if (response.authResponse && response.authResponse.grantedScopes.toLowerCase().indexOf("publish_actions") >= 0) {
                set_permission();
            }
            else {
                    date = new Date();
                    date.setDate(date.getDate() + 1);
                    createCookie('fb-publish-actions', date + ',2', 365);
            }
        }, {scope:"publish_actions",
            auth_type: 'rerequest',
            return_scopes: true});
    }

    function set_permission(){
         jQuery.ajax({
                url         : "/social_networking/SetFbPermission",
                type        : 'POST',
                error       : function (xhr, ajaxOptions, thrownError){  
                                console.log(xhr.status);          
                                console.log(thrownError);}
            });
    }

以下功能基本上读取了一组条件。如果cookie不存在,它将要求获得FB许可,cookie中的日期超过当前日期,它将要求获得FB许可,前提是它已被拒绝。如果已经授予许可,那么只需正常进行。

    function check_permissions() {
        var currentDate = new Date();
        if(readCookie('fb-publish-actions') != null)
        {
            thiscookie=readCookie('fb-publish-actions','0');
            aftersplit = thiscookie.split(",");
            fbJsonString = {};
            for (var i = 0; i < aftersplit.length; i++){
                        fbJsonString = {
                            "date" : aftersplit[0],
                            "count": aftersplit[1]
                        };
            }
            date = fbJsonString["date"];
        }
        else{
            date = currentDate.setDate(currentDate.getDate());
        }
        date = new Date(date);
        currentDate.setDate(currentDate.getDate());
        if(currentDate > date  || readCookie('fb-publish-actions') == null)
        {
            FB.api('/me/permissions', function (response) {
                    var perms = response.data;
                    var exists = false;
                    for(var i=0;i<perms.length;i++)
                    {
                        if(perms[i].permission =='publish_actions')
                        {   
                            if(perms[i].status == 'declined')
                            {
                                if(readCookie('fb-publish-actions') == null)
                                {
                                    date = new Date();
                                    date.setDate(date.getDate() + 1);
                                    createCookie('fb-publish-actions', date + ',2', 365);
                                }
                                else {
                                    count = fbJsonString["count"];
                                    console.log("something exists");
                                    date = new Date();
                                    date.setDate(date.getDate() + +count);
                                    if(count < 14)
                                    {
                                        createCookie('fb-publish-actions', date + ','+ (+count + +1), 365);
                                    }
                                    else {
                                        createCookie('fb-publish-actions', date + ','+ count, 365);
                                    }
                                }
                            }
                            else if(perms[i].status == 'granted')
                            {   
                                console.log("its granted");
                                exists=true;
                            }

                            break;
                        }
                    }
                    if(!exists)
                    {
                        get_perms();
                    }
            });
        }
    }

我们有一个评论系统,因此用户可以发布关于链接到Facebook的帖子的评论,我们只想在FB链接的帖子上请求publish_actions权限。

这看起来有可能吗?

1 个答案:

答案 0 :(得分:1)

我设法让这个工作。

TL; DR

  • 弹出窗口必须在用户点击时打开,而不是由其他功能或功能链调用
  • 在页面加载或用户点击之前制定所需条件,最大限度地减少速度问题(如果有的话)

因此,根据CBroe的说法,这是有道理的。我想我必须只在标签的onClick部分显示Login(),如果设置了一组条件,则但仅

基本上,我在页面加载上做了大部分上述操作并设置了两个全局标志。然后当生成输入按钮时,它将查看两个标志以查看它们是否为真,然后它将把Login()放入onClick

这是我所做的代码:

  1. 在会话开始时设置两个全局标记ask以确定是否要求权限,loggedIn检查它们是否已登录到我们的FB应用程序

    var ask;
    var loggedIn;
    
  2. 在页面加载时运行这些,在回调后运行checkLoginStatus,check_permissions()

    jQuery(window).load(function(){
    
        checkLoginStatus(function() {
           if(loggedIn)
           {
                check_permissions();
           }
        });
    
  3. 提供回调的
  4. checkLoginStatus()

    function checkLoginStatus(callback){
    FB.getLoginStatus(function(response) {
        (response.status === 'connected')? loggedIn=true : loggedIn=false;
        callback();
       });
    
    }
    
  5. check_permissions()仅在登录FB时运行,防止JS中的某些读取错误。在此函数中,如果满足条件,则多个ask = false或true setter:

    function check_permissions() {
       if(currentDate > date  || readCookie('fb-publish-actions') == null)
       {
       FB.api('/me/permissions', function (response) {
       var perms = response.data;
       ask=true;
       for(var i=0;i<perms.length;i++)
        {
        if(perms[i].permission =='publish_actions')
         {  
          if(perms[i].status == 'declined')
           {
           //ask is still true
    
           }
           else if(perms[i].status == 'granted')
           {    
            //ask is now false
            ask=false;
            }
    
                 break;
                  }
                }
             });
       }
          else {
               //if date is still greater than current date, dont ask
                 ask=false;
          }
        }
    
    }
    
  6. 最后,代码确定是否添加登录功能:

        if(ask && loggedIn)
        {
            html+="     <input class='interaction-button-post' onclick='add_comment();get_perms();return false;' type='submit' value='Post'/>";
        }
        else {
            html+="     <input class='interaction-button-post' onclick='add_comment();return false;' type='submit' value='Post'/>";
        }
    }