Ответ 1
Я видел случай, когда Chrome установил WidgetBlock, который блокировал Facebook script. Результатом было именно это сообщение об ошибке. Убедитесь, что вы отключили любые расширения, которые могут мешать.
Следующий код, скопированный из документации Facebook здесь, не работает для меня в Chrome.
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({
appId : 'YOUR APP ID',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
</script>
В консоли Javascript я получаю:
Uncaught ReferenceError: FB is not defined
У меня нет проблем с SDK в Firefox или Safari, просто Chrome.
Я видел случай, когда Chrome установил WidgetBlock, который блокировал Facebook script. Результатом было именно это сообщение об ошибке. Убедитесь, что вы отключили любые расширения, которые могут мешать.
Итак, проблема в том, что вы не дожидаетесь завершения init. Это приведет к случайным результатам. Вот что я использую.
window.fbAsyncInit = function () {
FB.init({ appId: 'your-app-id', cookie: true, xfbml: true, oauth: true });
// *** here is my code ***
if (typeof facebookInit == 'function') {
facebookInit();
}
};
(function(d){
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
Это гарантирует, что как только все будет загружено, функция facebookInit будет доступна и выполнена. Таким образом, вам не нужно дублировать код инициализации каждый раз, когда вы хотите его использовать.
function facebookInit() {
// do what you would like here
}
Эта ошибка также появляется, если вы опускаете точку с запятой после определения fbAsyncInit.
window.fbAsyncInit = function() {
FB.init({
appId: 'YOUR APP ID',
status: true,
cookie: true,
xfbml: true
});
//do stuff
}; //<-- semicolon required!
Без точки с запятой ситуация такая же, как в этом более коротком примере:
var x = function () {
console.log('This is never called. Or is it?');
}
('bar');
Функция вызывается, потому что без точки с запятой часть ('bar') рассматривается как вызов только что определенной функции.
Я тоже столкнулся с этой проблемой, и то, что решило ее, не имеет ничего общего с Facebook, но предыдущий script я включил в плохую форму
<script type="text/javascript" src="js/my_script.js" />
Я изменил его на
<script type="text/javascript" src="js/my_script.js"></script>
И он работает...
Weew... надеюсь, мой опыт может помочь другим застрять в этом, что почти все, но все равно не может заставить его работать...
О, мальчик... ^^
Попробуйте асинхронную загрузку: http://developers.facebook.com/docs/reference/javascript/fb.init/
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : 'YOUR APP ID',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
};
(function() {
var e = document.createElement('script');
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
</script>
У меня была очень грязная копия, которая загружала javascript в facebook через AJAX, и я должен был убедиться, что файл js был полностью загружен до вызова FB.init это, кажется, работает для меня
$jQuery.load( document.location.protocol + '//connect.facebook.net/en_US/all.js',
function (obj) {
FB.init({
appId : 'YOUR APP ID',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
//ANy other FB.related javascript here
});
Этот код использует jquery для загрузки javascript и выполняет обратный вызов функции onLoad javascript. это намного менее беспорядочно, чем создание onLoad eventlistener для блока, который в итоге не очень хорошо работал на IE6, 7 и 8
AdBlock блокирует скрипты facebook JS api, поскольку он связан с подключением к facebook, что часто раздражает.
Не уверен, что у вас все еще есть эта проблема, но у меня была такая же проблема, оказалось, что у меня была работа над расширением, которая блокировала Facebook со всех сайтов, которые не являются Facebook. Отключено, сработало!
Используйте setTimeout, потому что иногда FB.init занимает некоторое время, чтобы объявить
function testAPI() {
console.log('Welcome! Fetching your information.... ');
FB.api('/me', function(response) {
console.log('Good to see you, ' + response.name + '.');
});
}
function login() {
FB.login(function(response) {
if (response.authResponse) {
testAPI();
} else {
// cancelled
}
});
}
setTimeout(function() {
login();
},2000);
Попробуйте загрузить свои скрипты в разделе "Голова".
Более того, будет лучше, если вы определите свои сценарии под некоторым вызовом типа: document.ready
, если вы определили эти сценарии в разделе тела
У меня была та же проблема, и единственным решением, которое я нашел, было помещение всего, что использовало оператор FB внутри init script, я также использовал асинхронную загрузку, поэтому функция обратного вызова после всего, что требуется FB. У меня есть общая страница, динамически загружаемая php, поэтому многим частям нужны разные функции facebook, управляемые php, если заявления, которые делают все немного грязным, но работают!. если я попытаюсь извлечь любую декларацию FB из загрузки script, то firefox отобразит сообщение "FB не определено". Надеюсь, что это поможет во всем.
Чтобы проверить предложения Mattys о том, что FB не закончил, я поставил предупреждение в script. Это вызывает задержку, которую я мог контролировать. Конечно же... это был вопрос времени.
$("document").ready(function () {
// Wait...
alert('Click ok to init');
try {
FB.init({
appId: '###', // App ID
status: true, // check login status
cookie: true, // enable cookies to allow the server to access the session
xfbml: true // parse XFBML
});
}
catch (err) {
txt = "There was an error on this page.\n\n";
txt += "Error description: " + err.message + "\n\n";
txt += "Click OK to continue.\n\n";
alert(txt);
}
FB.Event.subscribe('auth.statusChange', OnLogin);
});
У меня была та же проблема, и я нашел причину.
У меня есть avast! антивирус, установленный на моем компьютере, и попросил меня установить обновление для chrome plugin. Новый avast! plugin for chrome
имеет функции блокировки рекламы и отслеживания, а по умолчанию он блокирует доступ к facebook. Я решил свою проблему, просто разрешив facebook в avast! chrome для сайта, который мне нужен.
Поскольку этот вопрос очень старый, я думаю, что некоторые люди могут иметь ту же причину, что и я, новый avast! хром-плагин.
Есть решение для вас:)
Вы должны запустить script после загрузки окна
если вы используете 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>
У меня была та же проблема. Решения заключались в использовании core.js вместо debug.core.js
Facebook предпочитает, чтобы вы загружали свой SDK асинхронно, чтобы он не блокировал другие сценарии, которые вам нужны для вашей страницы, но из-за iframe
есть вероятность, что консоль пытается вызвать метод на объекте FB до объект FB полностью создан, хотя FB вызывается только в функции fbAsyncInit
.
Попробуйте загрузить javascript синхронно, и вы больше не должны получать ошибку. Для этого вы можете скопировать и вставить код, который предоставляет Facebook, и поместить его во внешний файл .js
, а затем включить этот .js
файл в тег <script>
в <head>
вашей страницы. Если вы должны загрузить их SDK асинхронно, проверьте сначала, чтобы FB был создан, прежде чем вызывать функцию init
.
У меня была аналогичная проблема, и она оказалась Adblocker Pro. Обязательно проверьте, что это или другие блокирующие расширения отключены. Из-за этого я потерял около 1 часа 30 минут. Почувствуйте себя таким noob;)
Установили ли свойство appId ваш текущий идентификатор приложения?
Если вы используете JQuery, попробуйте поставить FB с вызовом Jquery
например.
$(document).ready(function(){
FB.Event.subscribe('auth.login', function(){
alert('logged in!');
});
});
который работал у меня