我如何在window.fbAsyncInit中调用js函数

时间:2011-05-08 16:07:13

标签: javascript jquery facebook facebook-javascript-sdk

我正在开发一款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函数才能实际工作。

非常感谢任何帮助。

2 个答案:

答案 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
    }
}