Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检测何时在Facebook应用程序中加载DOM和frame?_Javascript_Jquery_Facebook_Facebook Javascript Sdk - Fatal编程技术网

Javascript 如何检测何时在Facebook应用程序中加载DOM和frame?

Javascript 如何检测何时在Facebook应用程序中加载DOM和frame?,javascript,jquery,facebook,facebook-javascript-sdk,Javascript,Jquery,Facebook,Facebook Javascript Sdk,我正在编写一个Facebook应用程序,我试图找出如何检测iFrame DOM何时准备就绪,以及iFrame何时已完全加载。我不相信window.fbasyninit()就足够了,因为加载FBAPI时就会触发。我特别想寻找与jQuery(document.ready()和jQuery(window.load())等价的工具,但它必须在我的页面所在的Facebook iFrame中工作 编辑:大多数回复似乎引用文档就绪,但没有人提到窗口加载。我对了解两者都感兴趣,而不仅仅是其中之一。在我的例子中,

我正在编写一个Facebook应用程序,我试图找出如何检测iFrame DOM何时准备就绪,以及iFrame何时已完全加载。我不相信
window.fbasyninit()
就足够了,因为加载FBAPI时就会触发。我特别想寻找与jQuery(document.ready()和jQuery(window.load())等价的工具,但它必须在我的页面所在的Facebook iFrame中工作

编辑:大多数回复似乎引用文档就绪,但没有人提到窗口加载。我对了解两者都感兴趣,而不仅仅是其中之一。在我的例子中,窗口加载的等价物实际上更重要,因为我在页面上有一些大的图形,必须完全加载才能进行操作


编辑2:进一步调查后,答案可能是简单地将
jQuery(document).ready()
包装在
window.fbAsyninit()
中,或者使用
jQuery(window).load()
。我最初的测试表明这些方法并没有像预期的那样有效。我正在处理的页面有一些重JS,结果表明页面上有大量异步加载导致我的测试无效
jQuery(document).ready()
包装在
window.fbAsyninit()
jQuery(window.load()
中似乎是正确的方法。

这看起来像是解决方案:

经过一些测试后,我确实相信这是必要的:

<script type="text/javascript" src="https://connect.facebook.net/en_US/all.js"></script>
<script type="text/javascript" charset="utf-8">
window.fbAsyncInit = function() {
    FB.init({
         appId: 'xxxxxxxxxxxxxxx', 
         status: true, 
         cookie: true, 
         xfbml: true
    });

    FB.Canvas.setDoneLoading( function() {
        // Put code here that you want executed after page is done loading.
        console.log("done");
    });
}
</script>  

window.fbAsyninit=函数(){
FB.init({
appId:'xxxxxxxxxxxxx',
状态:正确,
曲奇:是的,
xfbml:对
});
FB.Canvas.setDoneLoading(函数(){
//将您希望在页面加载完成后执行的代码放在此处。
控制台日志(“完成”);
});
}

您可以使用普通的jQuery on document ready函数,没有什么可以阻止您使用它,它将像普通函数一样工作。您可能遇到的唯一问题是,如果您的代码依赖于正在加载的facebook js sdk,因为您使用的是异步方法,因此无法保证它在页面加载时可用

因此,我实际上建议不要使用异步方法(特别是在画布应用程序中),否则基本上需要将所有依赖facebook sdk的应用程序代码放在“fbAsyninit”函数中

<body>
    <div id="fb-root"></div>
    <script src="//connect.facebook.net/en_US/all.js"></script>
    <script type="text/javascript">
        jQuery(function(){
            // ... your 'on document ready' code
        });
        FB.init({
            appId                   : 'XXXXXX',
            status                  : true,
            cookie                  : true,
            xfbml                   : true,
            oauth                   : true,
            frictionlessRequests    : true
        });
        FB.Canvas.setAutoGrow();
        jQuery(function(){
            // ... more 'on document ready' code
        });
    </script>

jQuery(函数(){
//…您的“on document ready”代码
});
FB.init({
appId:'XXXXXX',
状态:正确,
曲奇:是的,
xfbml:是的,
真的,
无摩擦要求:正确
});
FB.Canvas.setAutoGrow();
jQuery(函数(){
//…更多“文档就绪”代码
});

据我所知,在运行某些代码之前,您需要两件事。这些是:

  • 你的页面需要准备好
  • Facebook API JS已下载并初始化
  • 不幸的是,我无法找到一种简单的方法来检测Facebook API是否完全初始化。(因为
    FB.init
    是异步的,所以不能假设下面的行与init done一样工作。)

    在我的实验中,Facebook函数具有回调功能,在
    FB.init
    之后调用,直到async
    FB.init
    完成。(请注意,
    auth.statusChange
    在某些情况下不会触发。)

    这样的东西对你有用吗?您可以根据需要使用
    allready
    事件的
    window

    <script type="text/javascript" src="https://connect.facebook.net/en_US/all.js"></script>
    <script type="text/javascript" charset="utf-8">
    
    window.fbAsyncInit = function() {
        FB.init({appId: "238797476172233"});
    
        FB.getLoginStatus(function(response) {
            /* at this point you know that you can use FB API's. */
            $().ready(function() {
              /* at this point you also know that your document is ready. */
              $(window).trigger("allready", [response]);
            });
        });
        FB.Canvas.setAutoGrow();
    };
    
    $(window).bind("allready", function() {
       /* optionally you can use e and response as function parameters */   
       alert("now I am sure that both page and FB API's are initialized. I can do anything in this callback!");   
    });
    </script>
    
    
    window.fbAsyninit=函数(){
    FB.init({appId:“23879747617223”});
    FB.getLoginStatus(函数(响应){
    /*此时,您知道您可以使用FBAPI*/
    $().ready(函数()){
    /*此时,您还知道您的文档已准备就绪*/
    $(window.trigger(“allready”,[response]);
    });
    });
    FB.Canvas.setAutoGrow();
    };
    $(window.bind(“allready”,function()){
    /*您可以选择使用e和response作为函数参数*/
    警报(“现在我确定页面和FBAPI都已初始化。我可以在此回调中执行任何操作!”);
    });
    
    JSFiddle:(我将JSFiddle URL添加到我的虚拟应用程序的域中,但如果它不起作用,请检查控制台并通知我。)

    除此之外,你没有任何“非api方式”来理解Facebook是否像Ian评论的那样加载

    我试图找出如何检测iFrame DOM何时准备就绪,以及iFrame何时已完全加载。我认为window.fbasyninit()是不够的,因为加载FBAPI时就会触发

    如果将异步加载SDK的script元素放在body元素的最末端,那么当FBAsyncint事件触发时,DOM应该已经准备就绪

    如果您认为这还不够,那么只有在触发两个事件时,才有一种更简单、更通用的方法来执行某些操作—通过增加一个简单计数器:

    var howManyOfUsHaveFired = 0;
    
    function doMyShit() {
      if(howManyOfUsHaveFired < 2) {
        return; // i don't want to do shit already
      }
      // now I will do shit
    }
    
    $(function() {
      ++howManyOfUsHaveFired;
      doMyShit();
    });
    
    window.fbAsyncInit = function() {
      FB.init(...);
      ++howManyOfUsHaveFired;
      doMyShit();
    }
    
    var howmanyofhavefired=0;
    函数doMyShit(){
    如果(点火次数<2){
    return;//我已经不想做狗屎了
    }
    //现在我要做狗屎
    }
    $(函数(){
    ++有多少人被解雇;
    doMyShit();
    });
    window.fbAsyninit=函数(){
    FB.init(…);
    ++有多少人被解雇;
    doMyShit();
    }
    
    您可以尝试小jquery库-


    由于iframe是针对不同的域的,您将无法进入它的“窗口”,因此您必须使用一些API功能,Ian说的是正确的。为什么不能在iFrame中加载的页面的JavaScript中使用doc ready?@SpYk3HH在我的初始测试中,我得到了一些与事件触发不一致的结果。我怀疑我可以使用api ready包装的doc ready。函数名令人困惑,示例也是如此。如果仔细阅读,此函数将随时手动调用
    $(document).ready(function() {
    
       // Add the function to run after FB is initialized
       $(document).on('fb:initialized', function() {
         FB.getLoginStatus(fbAuthStatusChange);
       });
       $(document).fb('youappid');
    
    });