Как я могу вызвать функцию JS в window.fbAsyncInit - PullRequest
0 голосов
/ 08 мая 2011

Я работаю над приложением 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 голосов
/ 09 мая 2011

Прежде всего, я не посмотрел весь ваш код, но я действительно считаю, что вы должны приложить больше усилий (форматирование и логика).

В любом случае, к точке:
У вас может быть флаг, который будет установлен на 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
    }
}
0 голосов
/ 08 мая 2011

Думаю, проблема в том, что метод sendRequest находится внутри области действия функции, поэтому недоступен в глобальном пространстве имен (куда dom мог бы добраться до него).Вы можете попробовать изменить:

function sendRequest()...

на

window.sendRequest = function()...

Я должен также упомянуть, что почти никогда не бывает веской причины прикреплять события непосредственно к этому домену.Даже если вы отображаете данные переменных JavaScript на языке шаблонов, таком как php, гораздо лучше устанавливать значения переменных ассоциативным способом, который не связывает событие с dom (но может связывать данные с элементом).

...