有时我在加载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*/}
感谢您的回答!
答案 0 :(得分:77)
我认为你应该解决主要问题,哪个解决方案是由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>
Facebook SDK for JavaScript没有任何独立文件 需要下载或安装,而只需要包含 HTML中的一小段常规JavaScript 将SDK异步加载到您的页面中。 异步加载意味着 它不会阻止加载页面的其他元素。
更新: 使用文档中的最新代码。
答案 1 :(得分:16)
假设FB是包含Facebook对象的变量,我会尝试这样的事情:
if (typeof(FB) != 'undefined'
&& FB != null ) {
// run the app
} else {
// alert the user
}
为了测试普通旧JavaScript中未定义的内容,您应该使用“typeof”运算符。您显示的示例只是将它与字符串'undefined'进行比较,将评估为false,除非您的FB对象确实包含字符串'undefined'!
另外,您可能希望使用Firebug(在Firefox中)等各种工具来查看您是否可以解决为什么没有加载Facebook文件。
答案 2 :(得分:11)
我猜你错过了将分号;
放在}
的结束大括号window.fbAsyncInit = function() { ... };
上
答案 3 :(得分:9)
对于仍然遇到这个FB错误的人,我使用这个厚脸皮修复这个问题。
我使用 HTTPS 而不是http://connect.facebook.net/en_US/all.js,而是将其更改为https://connect.facebook.net/en_US/all.js 它解决了我的问题。
答案 4 :(得分:4)
有解决方案:)
您必须在加载窗口后运行脚本
如果你使用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>
答案 5 :(得分:2)
您与原始示例非常接近。您可以使用@ jAndy的建议或:
if (typeof FB != 'undefined')
答案 6 :(得分:1)
如果您的脚本标记正确,那么FB不能加载到您的javascript中是很奇怪的。检查您的浏览器中是否安装了任何中和FB Connect代码的javascript阻止程序,广告拦截器,跟踪拦截器等。
答案 7 :(得分:1)
我从未定义过FB。原来我将原型函数原型化为Object类,称为“merge”,另一个称为“toArray”。 这两个搞砸了Facebook,没有错误消息,但它不会加载。
我更改了原型的名称,现在可以使用了。嘿,如果Facebook要打造原型Object,我不应该被允许原型化吗?
答案 8 :(得分:1)
FB建议在正文后添加async all.js include,以便在页面中使用FB对象时做好准备。
您还可以使用setTimeout进行人工延迟以确保加载FB对象。 e.g。
<script>setTimeout(function(){
FB.Event.subscribe('edge.create',
function (response) {
alert('msg via fb');
});},2000);
</script>
答案 9 :(得分:0)
<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
答案 10 :(得分:0)
我有一个类似的问题,结果是Adblocker Pro。请务必检查是否已禁用此阻止扩展程序或其他阻止扩展程序。因此,我失去了大约1小时30分钟。感觉像这样的菜鸟;)
答案 11 :(得分:-1)
...
</head>
<body>
<!-- Load Facebook SDK for JavaScript -->
<div id="fb-root"></div>
<script type="text/javascript">
...
检查div id =“fb-root”/ div“!!!运行非常重要。