【问题标题】:How to workaround 'FB is not defined'?如何解决“未定义 FB”?
【发布时间】:2011-07-16 21:55:49
【问题描述】:

有时我在加载http://connect.facebook.net/en_US/all.js 时遇到“FB 未定义”问题

我意识到问题在于有时我的网站无法加载该文件。所以它什么也得不到,而且对象 FB 根本不存在。

我的解决方案是在发生这种情况时阻止我的用户,所以我在 JavaScript 中尝试了以下代码,但似乎没有一个有效:

if (FB) {/*run the app*/} else {/*alert the user*/}
if (FB!==false) {/*run the app*/} else {/*alert the user*/}
if (FB!='undefined') {/*run the app*/} else {/*alert the user*/}

感谢您的回答!

【问题讨论】:

    标签: javascript facebook


    【解决方案1】:

    我认为你应该解决主要问题,Facebook 提供的解决方案(异步加载 SDK):

    您应该将它直接插入到要加载它的每个页面的开始标记之后:

    <script>
      window.fbAsyncInit = function() {
        FB.init({
          appId      : 'your-app-id',
          xfbml      : true,
          version    : 'v2.1'
        });
      };
    
      (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/sdk.js";
         fjs.parentNode.insertBefore(js, fjs);
       }(document, 'script', 'facebook-jssdk'));
    </script>
    

    来自documentation

    适用于 JavaScript 的 Facebook SDK 没有任何独立文件 需要下载或安装,而您只需要包含 HTML 中的一小段常规 JavaScript 将 SDK 异步加载到您的页面中。 异步加载意味着 它不会阻止加载页面的其他元素。

    更新:使用文档中的最新代码。

    【讨论】:

    • 感谢您的回答,我终于想通了my problem! +1
    【解决方案2】:

    假设 FB 是一个包含 Facebook 对象的变量,我会尝试这样的事情:

    if (typeof(FB) != 'undefined'
         && FB != null ) {
        // run the app
    } else {
        // alert the user
    }
    

    为了测试在普通的旧 JavaScript 中某些东西是未定义的,你应该使用“typeof”操作符。除非您的 FB 对象确实包含字符串 'undefined',否则您在将其与字符串 'undefined' 进行比较时显示的示例将评估为 false!

    顺便说一句,您可能希望使用 Firebug(在 Firefox 中)等各种工具来查看您是否可以找出 Facebook 文件未加载的原因。

    【讨论】:

      【解决方案3】:

      我猜你错过了将分号 ; 放在 window.fbAsyncInit = function() { ... }; 的右花括号 }

      【讨论】:

      • Javascript 中通常不需要分号。唯一需要它们的情况是,如果您将 2 个可以用分号分隔的语句放在同一行上。假设代码自提问者发布以来没有更改,他的代码对我来说看起来不错。
      【解决方案4】:

      对于仍然有这个 FB 错误的人,我使用这个厚颜无耻的修复来解决这个问题。

      我使用 HTTPS 而不是 http://connect.facebook.net/en_US/all.js,并将其更改为 https://connect.facebook.net/en_US/all.js 它解决了我的问题。

      【讨论】:

        【解决方案5】:

        有适合​​你的解决方案:)

        您必须在加载窗口后运行您的脚本

        如果你使用jQuery,你可以使用简单的方式:

        <div id="fb-root"></div>
        <script>
            window.fbAsyncInit = function() {
                FB.init({
                    appId      : 'your-app-id',
                    xfbml      : true,
                    status     : true,
                    version    : 'v2.5'
                });
            };
        
            (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/sdk.js";
                fjs.parentNode.insertBefore(js, fjs);
            }(document, 'script', 'facebook-jssdk'));
        </script>
        
        <script>
        $(window).load(function() {
            var comment_callback = function(response) {
                console.log("comment_callback");
                console.log(response);
            }
            FB.Event.subscribe('comment.create', comment_callback);
            FB.Event.subscribe('comment.remove', comment_callback);
        });
        </script>
        

        【讨论】:

          【解决方案6】:

          您与原始示例非常接近。您可以使用@jAndy 的建议或:

          if (typeof FB != 'undefined')
          

          【讨论】:

            【解决方案7】:

            如果你的脚本标签正确,FB 不被加载到你的 javascript 中是很奇怪的。检查您的浏览器中是否安装了任何 javascript 拦截器、广告拦截器、跟踪拦截器等来中和您的 FB Connect 代码。

            【讨论】:

            • 我通过将 来修复它
            • @RickLeinecker 你能解释一下你做了什么改变吗?
            • rAjA 他删除了脚本的异步加载,因此页面等待该脚本将被加载而不是加载其他外部/内部脚本列表
            【解决方案8】:

            我从未定义过 FB。原来,我正在将函数原型设计到名为“merge”的 Object 类和另一个名为“toArray”的类中。 这两个都搞砸了 Facebook,没有错误消息,但它不会加载。

            我更改了原型的名称,现在可以使用了。嘿,如果 Facebook 打算制作 Object 的原型,难道我不应该被允许制作它的原型吗?

            【讨论】:

              【解决方案9】:

              FB 建议在 body 之后添加 async all.js include,以便在页面中使用时准备好 FB 对象。

              您还可以使用 setTimeout 进行人为延迟,以确保加载 FB 对象。例如

              <script>setTimeout(function(){
              FB.Event.subscribe('edge.create',
              function (response) {
                  alert('msg via fb');
              });},2000);
              </script>
              

              【讨论】:

                【解决方案10】:
                <script>  
                    window.fbAsyncInit = function() {    
                        FB.init({      
                            appId      :'your-app-id',      
                            xfbml      :true,      
                            version    :'v2.1'
                        });
                    };
                    (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 /sdk.js";     
                        fjs.parentNode.insertBefore(js, fjs);
                    }
                    (document,'script','facebook-jssdk'));
                </script> 
                

                来自文档:Facebook SDK for JavaScript 没有任何需要下载或安装的独立文件,您只需在 HTML 中包含一小段常规 JavaScript 即可

                【讨论】:

                  【解决方案11】:

                  我遇到了类似的问题,结果是 Adblocker Pro。请务必检查此或其他阻止扩展是否已被禁用。由于这个原因,我损失了大约 1 小时 30 分钟。感觉自己像个菜鸟;)

                  【讨论】:

                    【解决方案12】:
                    ...
                    </head>
                    <body>
                        <!-- Load Facebook SDK for JavaScript -->
                        <div id="fb-root"></div>
                    <script type="text/javascript">
                    ...
                    

                    检查 div id="fb-root" /div" !!! 运行很重要。

                    【讨论】:

                      猜你喜欢
                      • 2013-05-25
                      • 2016-12-07
                      • 2019-05-09
                      • 1970-01-01
                      • 2017-01-15
                      • 2014-09-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多