0

我正在开发一个 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(variable) 以便它可以获取变量

但是,当我这样做时,每次单击具有 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 函数才能实际工作。

任何帮助将不胜感激。

4

2 回答 2

0

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

function sendRequest()...

window.sendRequest = function()...

我还应该提到,几乎没有充分的理由将事件直接附加到 dom 上。即使您在像 php 这样的模板语言中呈现 JavaScript 变量数据,最好以不将事件耦合到 dom(但可以将数据耦合到元素)的关联方式设置变量值。

于 2011-05-08T16:23:06.037 回答
0

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

无论如何,直截了当:
您可以设置一个仅true在加载 JS-SDK 时设置为的标志,并且您可以在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
    }
}
于 2011-05-09T08:28:27.380 回答