【问题标题】:Facebook javascript events not fired any way i turn itFacebook javascript事件没有以任何方式触发我打开它
【发布时间】:2022-01-31 15:25:46
【问题描述】:

我在我的网站上使用 Facebook JavaScript SDK,有一个选项可以在用户从 Facebook 登录/注销时设置事件,这样我就可以在我的网站上向他显示通知。 无法使其正常工作,尝试了所有方法,还使用了 offline_access 权限。

这是我的 html 代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="description" content="blabla" />
        <meta name="keywords" content="blabla" />
        <meta property="og:title" content="blabla" /> 
        <meta property="og:url" content="http://XXX/" />
        <meta property="fb:app_id" content="XXX" />
        <title>Facebook Notifier</title>
        <link href="<?php echo base_url(); ?>styles/style.css" rel="stylesheet" type="text/css" />
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
        <script type="text/javascript" src="<?php echo base_url(); ?>js/jquery.cookie.js"></script>
        <script src="http://connect.facebook.net/en_US/all.js"></script>
        <script type="text/javascript" src="<?php echo base_url(); ?>js/global.js"></script>
    </head>
    <body>
<div id="fb-root"></div>
    <div id="my_div">
    </div>
</a>
</body></html>

这是我的js代码:

FB.init({
        appId  : 'XXX',
        status : true, // check login status
        cookie : true, // enable cookies to allow the server to access the session
        xfbml  : true, // parse XFBML
        oauth : true, // enables OAuth 2.0
        channelUrl : 'http://XXX/channelUrl'
    });

    FB.getLoginStatus(function(response) {
        if (response.authResponse) {
            connected = true;
        }
        else{
            connected = false;
        }
    }, true);

    FB.Event.subscribe('auth.authResponseChange', function(response) {
        if(response.authResponse) connected = true;
        else connected = false;
    });

在这个 js 代码的最后,我有一个函数每隔几秒钟运行一次,检查连接变量,它是一个全局变量。它没有改变我试图从 facebook 登录/注销并且没有事件触发。 只有当我刷新页面时,我才能获得用户状态。 在 firefox firebug 控制台中,我收到消息(也在 chrome 中尝试过,即): 未捕获的异常:错误:https://www.facebook.com Proxy.InstallTrigger 我试图通过尽我所能在谷歌和stackoverflow中找到关于这个错误的一切来解决它,但仍然无法正常工作。 顺便说一句:当我在原始文件中写 XXX 时,它是我的 url 或我的 appid。 谢谢。

【问题讨论】:

    标签: javascript facebook


    【解决方案1】:

    我一直对 Facebook 触发的 auth. 事件持怀疑态度,所以在你的情况下,我可能只是自己设置一个轮询器来检查连接用户的身份验证状态。像这样:

    var connected;
    
    FB.init({
        appId  : 'XXX',
        status : true, // check login status
        cookie : true, // enable cookies to allow the server to access the session
        xfbml  : true, // parse XFBML
        oauth : true, // enables OAuth 2.0
        channelUrl : 'http://XXX/channelUrl'
    });
    
    
    FB.getLoginStatus(handleUserStateChange);
    FB.Event.subscribe('auth.authResponseChange', handleUserStateChange);
    
    function handleUserStateChange(response) {
        connected = !!response.authResponse;
    }
    
    setInterval(function() {
        FB.getLoginStatus(handleUserStateChange, true);
    }, 10000)   // poll every 10 seconds
    

    此外,正如您在 FB.init 配置对象中定义的 status: true 一样,您不需要在开始时将第二个参数传递给 FB.getLoginStatus,因为这会强制检查 Facebook 而不是从存储的变量中读取(其中已经是我们刚刚初始化的最新信息了)。

    【讨论】:

    • 你能解释一下你为什么使用双“非”运算符吗?:connected = !!response.authResponse; 你只是把它用作“惰性类型转换”吗?
    • 顺便说一句,+1 因为轮询FB.getLoginStatus() 确实解决了我的问题。我觉得这不是“正确”的做法,但确实有效!
    【解决方案2】:

    您的 connected 看起来可能存在变量范围问题。

    这样的事情可能会有所帮助:

    var connected; // define/initialize connected variable outside functions
    FB.init({
        appId  : 'XXX',
        status : true, // check login status
        cookie : true, // enable cookies to allow the server to access the session
        xfbml  : true, // parse XFBML
        oauth : true, // enables OAuth 2.0
        channelUrl : 'http://XXX/channelUrl'
    });
    
    FB.getLoginStatus(function(response) {
        if (response.authResponse) {
            connected = true;
        }
        else{
            connected = false;
        }
    }, true);
    
    FB.Event.subscribe('auth.authResponseChange', function(response) {
        if(response.authResponse) connected = true;
        else connected = false;
    });
    

    我会在您的函数中使用console.log() 来响应订阅的事件,以查看真正发生的事情(或未发生的事情)。然后根据console.log() 告诉你的内容编写你的真实代码。

    【讨论】:

    • 我在问题中提到我已按照您所说的那样连接为全局变量。我也尝试了 console.log() 的事情。没有记录在那里。只有在 firefox firebug 中,我在尝试登录/注销 facebook 时遇到未捕获的异常,在 chrome firebug 中我什么也得不到。
    【解决方案3】:

    我在一个在文档就绪事件上调用的函数中执行FB.Event.subscribe

    <script>(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/all.js#xfbml=1&appId=...";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
    
    $("document").ready(function(){
        FB.Event.subscribe('edge.create',
          function(response) {
            alert('You liked the URL: ' + response);
          });
    });
    </script>
    

    或者here 有另一个例子可以确保在你进行任何调用之前初始化 FB。

    【讨论】:

    • 如果使用jQuery,为什么不使用jQuery.getScript()来获取SDK?
    【解决方案4】:

    我是 FB 开发的新手,几天前遇到了同样的问题。

    我尝试了几乎所有可用的答案和解决方案,但没有 解决了。不管我做了什么,这该死的事件都不想触发 最新的 VS 项目。但是我记得在我的第一个 VS 项目中让它工作 我在同一问题上遵循了教程。过了一会儿,我检查了最初的项目,令我惊讶的是,它在那里启动,而不是在我的另一个项目中。

    最后我意识到,FB 上的 Canvas Url(应用设置)是罪魁祸首: h t t p: // 本地主机:15497/

    它被设置为我的本地主机和我在其他项目中使用的端口。我更改了端口号,突然它也可以在我的其他项目中使用。

    确保 FB 应用设置中的画布 URL 与 Visual Studio 运行应用的位置匹配。部署网络应用后,还要更改该值。

    【讨论】:

      【解决方案5】:

      如果您在 2022 年想知道为什么它不会触发。启用 3rd 方 cookie,这对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-02
        • 2014-07-07
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        相关资源
        最近更新 更多