#javascript #jquery #facebook #facebook-graph-api #jquery-mobile
#javascript #jquery #Facebook #facebook-graph-api #jquery-мобильный
Вопрос:
Я пытаюсь реализовать основные функции Facebook, такие как обновление профиля facebook, а также facebook login с использованием фреймворка jquerymobile. Используя эту ссылку http://thinkdiff.net/facebook/graph-api-javascript-base-facebook-connect-tutorial
Он отлично работает с форматом HTML 5. Но когда я интегрируюсь с jQueryMobile, я получаю сообщение об ошибке, в котором говорится о неперехваченном исключении: не удается вызвать метод appendChild .
Я вставлю код сюда: пожалуйста, посмотрите и дайте мне знать, в чем проблема.
<body>
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.init({appId: 'xxxxxxxxxxxxxx', status: true, cookie: true, xfbml: true});
/* All the events registered */
FB.Event.subscribe('auth.login', function(response) {
// do something with response
login();
});
FB.Event.subscribe('auth.logout', function(response) {
// do something with response
logout();
});
FB.getLoginStatus(function(response) {
if (response.session) {
// logged in and connected user, someone you know
login();
}
});
};
(function() {
var e = document.createElement('script');
e.type = 'text/javascript';
e.src = document.location.protocol
'//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e); //i am getting error in the is line
});
function login(){
FB.api('/me', function(response) {
document.getElementById('login').style.display = "block";
document.getElementById('login').innerHTML = response.name " succsessfully logged in!";
});
}
function logout(){
document.getElementById('login').style.display = "none";
}
//stream publish method
function streamPublish(name, description, hrefTitle, hrefLink, userPrompt){
FB.ui(
{
method: 'stream.publish',
message: '',
attachment: {
name: name,
caption: '',
description: (description),
href: hrefLink
},
action_links: [
{ text: hrefTitle, href: hrefLink }
],
user_prompt_message: userPrompt
},
function(response) {
});
}
function showStream(){
FB.api('/me', function(response) {
//console.log(response.id);
streamPublish(response.name, 'Something ', 'hrefTitle', 'http://www.ffff.com', "Share www.ffffff.com");
});
}
function share(){
var share = {
method: 'stream.share',
u: 'http://www.fffffff.com'
};
FB.ui(share, function(response) { console.log(response); });
}
function graphStreamPublish(){
var body = 'hsdfkjasdkjfadkjf;adlfj';
FB.api('/me/feed', 'post', { message: body }, function(response) {
if (!response || response.error) {
alert('Error occured');
} else {
alert('Post ID: ' response.id);
}
});
}
function fqlQuery(){
FB.api('/me', function(response) {
var query = FB.Data.query('select name, hometown_location, sex, pic_square from user where uid={0}', response.id);
query.wait(function(rows) {
document.getElementById('name').innerHTML =
'Your name: ' rows[0].name "<br />"
'<img src="' rows[0].pic_square '" alt="" />' "<br />";
});
});
}
function setStatus(){
status1 = document.getElementById('status').value;
FB.api(
{
method: 'status.set',
status: status1
},
function(response) {
if (response == 0){
alert('Your facebook status not updated. Give Status Update Permission.');
}
else{
alert('Your facebook status updated');
}
}
);
}
</script>
<div data-role="page">
<div data-role="header">
<h1>Foofys-Facebook Page</h1>
</div><!-- /header -->
<div data-role="content">
<p>you are using foofys facebook app</p>
<div id="fb-root"></div>
<fb:login-button autologoutlink="true" perms="email,user_birthday,status_update,publish_stream"> </fb:login-button>
<p>
<a href="#" onclick="showStream(); return false;">Publish Wall Post</a> |
<!-- <a href="#" onclick="share(); return false;">Share With Your Friends</a> | -->
<a href="#" onclick="graphStreamPublish(); return false;">Publish Stream</a> |
<!-- <a href="#" onclick="fqlQuery(); return false;">FQL Query Example</a> -->
</p>
<textarea id="status" cols="50" rows="5">Write your status here'</textarea>
<br />
<!-- <a href="#" onclick="setStatus(); return false;">Status Set Using Legacy Api Call</a> -->
<br /><br /><br />
<div id="login" style ="display:none"></div>
<div id="name"></div>
</div><!-- /content -->
<div data-role="footer">
<h4>Page Footer</h4>
</div><!-- /footer -->
</div><!-- /page -->
</body>
я не могу понять, что происходит в коде, кстати, я только что указал, где именно я получаю ошибку.
Комментарии:
1. Можете ли вы убедиться, что
document.getElementById('fb-root')
действительно получает элемент. Не знаю, почему бы и нет…2. Нет, это не получается, так как я не могу получить кнопку Facebook login
3. Попробуйте двигаться
<div id="fb-root"></div>
вверх и использовать его в качестве первого дочернего элемента вашего тега body.4. помимо перемещения div после тега <body> мне также пришлось добавить () в строку после комментария «// я получаю ошибку в строке is». Итак, в основном я изменил строку «});» на «}());».
Ответ №1:
Хитрость с JQM и FB api заключается в использовании graph API. То есть НЕ используйте простые оболочки javascript FB, поскольку они нестабильны при обработке страниц JQM — вместо этого просто используйте новый graph / rest API, проверяйте и избегайте множественных инициализаций ядра FB и вашего набора. Например
function updateUserInfo(uid, accessToken) {
var uri = "https://graph.facebook.com/" uid;
console.log("About to call FP.api with URI " uri);
$.ajax({
type: "GET",
url: "https://graph.facebook.com/" uid,
dataType: "json",
success:
(function (response) {
console.log("About to call check profile ...");
$("#p_name").val(response.name);
$("#email").val(response.email);
$("#fb_id").val(response.id);
$.ajax({
type: "POST",
url: "/check_profile",
cache: false,
data: {fb_id: response.id},
success: onCheckSuccess,
error: onError
});
console.log("FB id: " response.id);
}),
error: onError
});