Javascript 如何在window.fbAsyninit中调用js函数

Javascript 如何在window.fbAsyninit中调用js函数,javascript,jquery,facebook,facebook-javascript-sdk,Javascript,Jquery,Facebook,Facebook Javascript Sdk,我正在开发一个facebook应用程序。我有下面的代码,如果我像这样运行它,它可以很好地工作 <div id="fb-root"></div> <script> window.fbAsyncInit = function() { FB.init({ appId : '<?php echo $facebook->getAppId(); ?>', sessi

我正在开发一个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>
<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>
并将sendRequest函数更改为sendRequestvariable,以便它可以接受该变量

但是,当我这样做时,每次单击带有onClick触发器的按钮时,它都会给我一个错误:找不到变量sendRequest

我认为这是因为onClick无法看到sendRequest函数

所以我的问题是,如何从onClick调用这个函数。请记住,页面上有多个按钮需要调用函数,并在每个按钮上为函数提供不同的变量值

我当前的代码如下所示:

<a><img src=/images/start.png onClick=sendRequest('1234556');></a>
<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>
如果有人能告诉我如何调用这个函数,我将不胜感激。据我所知,函数需要留在窗口内,fbAsyninit函数才能实际工作


任何帮助都将不胜感激。

我认为问题在于sendRequest方法在函数范围内,因此在dom可以访问它的全局命名空间中不可用。您可以尝试更改:

function sendRequest()...


我还应该提到,几乎没有一个很好的理由像这样将事件直接附加到dom。即使在使用php等模板语言呈现JavaScript变量数据的情况下,最好以关联方式设置变量值,这样就不会将事件耦合到dom,而是可以将数据耦合到元素。

首先,我还没有看过你所有的代码,但我真的认为你应该在格式和逻辑上做更多的努力

无论如何,切中要害: 您可以有一个仅在加载JS-SDK时才会设置为true的标志,并且您可以在设置该标志之前阻止window.fbAsyninit之外的任何进程。比如:

<div id="fb-root"></div>
<script>
var isLoaded = false;
window.fbAsyncInit = function() {
    isLoaded = true;
...
...
}
function myFunc(myVar) {
    if(isLoaded) {
        // Do FB related stuff
    }
}

尝试使用站点格式而不是标记