我正在开发一款Facebook应用。我有以下代码,如果我像这样运行它可以正常工作
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $facebook->getAppId(); ?>',
session : <?php echo json_encode($session); ?>,
status : true,
cookie : true,
xfbml : true
);
$('#stgame').click(sendRequest);
function sendRequest() {
document.getElementById('gameSetup').style.display = 'block';
FB.ui({
method: 'apprequests',
message: '<?=$me[name];?> has invited you to a fun game of Towers. To play, just click on accept. Towers is a "3D" tile stacking word game.',
},
function (response) {
if (response && response.request_ids) {
var requests = response.request_ids.join(',');
$.post('handle_requests.php',{uid: <?php echo $uid; ?>, request_ids: requests},function(resp) {
window.location.replace("play.php?" + resp);
});
} else {
document.getElementById('gameSetup').style.display = 'none';
}
});
return false;
}
};
(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>
但是,我需要更改它,以便我可以将变量发送到“sendRequest”并将触发器更改为内联“onClick”
为此,我在页面上创建了一个链接:
<a><img src=/images/start.png onClick=sendRequest('1234556');></a>
并将sendRequest函数更改为sendRequest(变量),以便它可以采用变量
然而,当我这样做时,每次我点击具有onClick触发器的按钮时,它都会给我一个错误“无法找到变量sendRequest”
我认为这是因为onClick无法看到sendRequest函数。
所以我的问题是,如何从onClick调用该函数。请记住,页面上会有多个按钮需要调用该函数,为每个函数赋予一个不同的变量值。
我目前的代码如下:
<a><img src=/images/start.png onClick=sendRequest('123');></a>
<a><img src=/images/start.png onClick=sendRequest('456');></a>
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $facebook->getAppId(); ?>',
session : <?php echo json_encode($session); ?>,
status : true,
cookie : true,
xfbml : true
}
);
function sendRequest(opponent) {
document.getElementById('gameSetup').style.display = 'block';
FB.ui({
method: 'apprequests',
to:opponent,
message: '<?=$me[name];?> has invited you to a fun game" tile stacking word game.',
},
function (response) {
if (response && response.request_ids) {
var requests = response.request_ids.join(',');
$.post('handle_requests.php',{uid: <?php echo $uid; ?>, request_ids: requests},function(resp) {
window.location.replace("play.php?" + resp);
});
} else {
document.getElementById('gameSetup').style.display = 'none';
}
});
return false;
}
};
(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>
如果有人能告诉我如何调用此功能,我将不胜感激。据我所知,该函数需要保留在窗口内,fbAsyncInit函数才能实际工作。
非常感谢任何帮助。
答案 0 :(得分:0)
我认为问题在于sendRequest方法在函数范围内,因此在全局命名空间(dom可以到达它)中不可用。您可以尝试更改:
function sendRequest()...
到
window.sendRequest = function()...
我还应该提到,几乎没有充分的理由将事件直接附加到dom上。即使你在像php这样的模板语言中呈现JavaScript变量数据,最好以关联方式设置变量值,而不是将事件耦合到dom(但可以将数据耦合到元素)。
答案 1 :(得分:0)
首先,我没有看过你的所有代码,但我真的认为你应该对它做更多的努力(格式化和逻辑)。
无论如何,要点:
您可以拥有一个仅在加载JS-SDK时设置为true
的标志,并且您可以“阻止”window.fbAsyncInit
之外的任何进程,直到设置该标志。类似的东西:
<div id="fb-root"></div>
<script>
var isLoaded = false;
window.fbAsyncInit = function() {
isLoaded = true;
...
...
}
function myFunc(myVar) {
if(isLoaded) {
// Do FB related stuff
}
}