Javascript 如何检测何时在Facebook应用程序中加载DOM和frame?
我正在编写一个Facebook应用程序,我试图找出如何检测iFrame DOM何时准备就绪,以及iFrame何时已完全加载。我不相信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中工作 编辑:大多数回复似乎引用文档就绪,但没有人提到窗口加载。我对了解两者都感兴趣,而不仅仅是其中之一。在我的例子中,
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(函数(){
//…更多“文档就绪”代码
});
据我所知,在运行某些代码之前,您需要两件事。这些是:
FB.init
是异步的,所以不能假设下面的行与init done一样工作。)
在我的实验中,Facebook函数具有回调功能,在FB.init
之后调用,直到asyncFB.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');
});