facebook: FB.Canvas.setSize не работает - PullRequest
9 голосов
/ 14 июня 2011

Я создал приложение facebook, которое будет отображаться на странице фанатов моей компании в виде вкладки.Приложение визуализируется с 951px, поэтому оно не помещается в стандартную высоту вкладки фан-страницы.Я прочитал ужасную документацию Facebook для их js sdk и перепробовал так много разных вариантов - все они не работают вообще.Вот моя текущая попытка изменить размер вкладки фан-страницы, чтобы она подходила для моего приложения ...

<head>
    <!-- css / js / meta info here -->
    <script type="text/javascript">
        window.fbAsyncInit = function() {
            FB.Canvas.setSize();
        }
        function sizeChangeCallback() {
            FB.Canvas.setSize();
        }
    </script>
</head>
<body>
    <!-- content goes here -->
    <div id="fb-root">
        <script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
        <script type="text/javascript">
            FB.init({
                appId:'xxxxxxxxxx',
                status:true,
                cookie:true,
                xfbml:true,
            });
        </script>
    </div>

</body>

Я также попытался выполнить асинхронную инициализацию и использование setAutoResize () безуспешно.

Спасибо за любые предложения ... B

Ответы [ 10 ]

16 голосов
/ 17 июля 2011
<head>
<script type="text/javascript">
window.fbAsyncInit = function()
{
    FB.Canvas.setSize();
}
</script>
</head>

.
.
.
.

    <div id="fb-root"></div>
    <script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script> 
    <script type="text/javascript">

    FB.init({
        appId: 'xxxxxxxx', 
        status: true, 
        cookie: true, 
        xfbml: true
    });

    /* Init fb Resize window */

    /* Completly removed now in JS SDK*/
    /* FB.Canvas.setAutoResize(7); */

    /* As of Jan 2012 you need to use */
    FB.Canvas.setAutoGrow(7);

    </script>
</body>
</html>
7 голосов
/ 23 апреля 2012

Я потратил больше часа, пытаясь исправить это в своем приложении, и я хотел бы упомянуть пару основных моментов, которым нужно следовать , чтобы это сработало.

  • Вы должны включить div с идентификатором fb-root, прежде чем включать файл all.js и перед любым кодом JS, использующим объект FB.
  • Файл all.js должен быть включен ниже div fb-root и выше любого фактического кода JS, использующего объект FB
  • Наконец, любой код JS, использующий объект FB, должен быть ниже div fb-root, а all.js включает

В моем коде не было ошибок, но он отказывался работать, потому что я включал all.js и мой JS-код в элемент , а мой div fb-root был в . Вот что мне пришлось изменить:

...
<head>
<!-- include jQuery so we can use window.load below -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" ></script>
...
</head>
<body>
    <!-- the div has to come first which forces the JS include and code to be put below it -->
    <div id="fb-root"></div>
    <!-- then we have to include the all.js file -->
    <script src="https://connect.facebook.net/en_US/all.js" type="text/javascript"></script>
    <!-- and finally we can use the FB JS SDK and it will actually work :) -->
    <script type="text/javascript" charset="utf-8">
        FB.init({
            appId: '...', 
            status: true, 
            cookie: true, 
            xfbml: true
        });

        jQuery(window).load(function(){
            //resize our tab app canvas after our content has finished loading
            FB.Canvas.setSize();
        });
    </script>
...

Очевидно, что 3 элемента, которые я упомянул, не обязательно должны быть расположены друг за другом, но они должны отображаться в указанном порядке в вашем исходном коде. Это действительно заставило меня задуматься, так что, надеюсь, это сэкономит кому-то время и разочарование :)

2 голосов
/ 01 февраля 2013

Обычно это работает, если Facebook может рассчитать высоту вашей страницы. Однако, если у вас есть адаптивный дизайн, это невозможно. Я использую хак, который выполняет работу, используя jQuery, чтобы вычислить высоту div-оболочки, а затем явно установить ее:

FB.Canvas.setDoneLoading( function(result) {
    FB.Canvas.setSize({height: $('#wrapper').height() });
});

Это должно быть в вашем методе FB.init ().

0 голосов
/ 20 мая 2013

Вот как я инициализирую свои приложения на Facebook:

<div id="fb-root"></div>
<script type="text/javascript" charset="utf-8">
  window.fbAsyncInit = function() {
    FB.init({
      appId  : appId,
      status : true,
      cookie : true, 
      xfbml  : true  
    });
    // Additional initialization code such as adding Event Listeners goes here
    FB.Canvas.setSize({ width: 810, height: 620 }); // ******* THIS WORKS.
  };
  (function(d) {
    var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    d.getElementsByTagName('head')[0].appendChild(js);
  }(document));
</script>
0 голосов
/ 17 мая 2013

Нашел решение снова уменьшить высоту, если контентные сайты вашего приложения имеют разную высоту. Обычно высота увеличивается легко, но не уменьшается до меньшего размера.

<head>

<script type="text/javascript">
    window.fbAsyncInit = function()
    {
        FB.Canvas.setSize({ width: 810, height: 920 });  
        /*{ set here the needed site height }*/
    }
</script>
</head>

<body>

<div id="fb-root"></div>
   <script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script> 
   <script type="text/javascript">

   FB.init({
       appId: 'App ID', /*{ set here your App ID }*/
       status: true, 
       cookie: true, 
       xfbml: true
   });

  /* Init fb Resize window */

   /* Completly removed now in JS SDK*/
   FB.Canvas.setAutoResize(7); 

   /* As of Jan 2012 you need to use */
   FB.Canvas.setAutoGrow(7);

</script>
</body>
0 голосов
/ 14 ноября 2012

Возможно, вам придется дождаться загрузки изображений. В противном случае FB.Canvas.setSize(); может сработать слишком рано и не включать размеры изображения.

С использованием jQuery:

$(window).load(function(){
  FB.Canvas.setSize();
});
0 голосов
/ 22 января 2012

Я нашел решение для исправления проблем при использовании jQuery и FB.setSize () - если вы устанавливаете определение vars до $ (function () {}) (jQuery DOM ready) - setSize не работает. Если все определения переменных расположены внутри $ (function () {все переменные ЗДЕСЬ}) - setSize начинает работать!

0 голосов
/ 06 января 2012

Я также заметил, что вызов setSize не выполняется, если пользовательский параметр «Безопасный просмотр» отключен.Это может не быть проблемой для большинства, так как настройка включена по умолчанию, но если вы столкнулись с этой проблемой и теперь у вас почти лысая голова (как у меня), проверьте эту настройку в тестируемой учетной записис.

0 голосов
/ 07 августа 2011

если по какой-то причине для window.name установлено, то FB.setAutoSize не будет работать, http://bugs.developers.facebook.net/show_bug.cgi?id=19720 в моем случае оно каким-то образом связано с jquery $ .data

    window.fbAsyncInit=function(){

        FB.Canvas.setSize = function(b) { 
            if (typeof b!="object") 
                b={};
            b=b||{};
            if (b.width==null||b.height==null)
                b=FB.copy(b,FB.Canvas._computeContentSize());
            b=FB.copy(b,{frame:'iframe_canvas'});
            if (FB.Canvas._lastSize[b.frame]) {
                var a=FB.Canvas._lastSize[b.frame].height;
                if(FB.Canvas._lastSize[b.frame].width==b.width&&(b.height<=a&&(Math.abs(a-b.height)<=16)))
                    return false;
            }
            FB.Canvas._lastSize[b.frame]=b;FB.Arbiter.inform('setSize',b);
            return true;
        }

        FB.init({
            appId:APP_ID, //your app id (Numeric)
            status:true,
            cookie:true,
            xfbml:true
        });

        FB.Canvas.setAutoResize()
    };
0 голосов
/ 14 июня 2011

вот что я использую:

<head>
    ...
    <script type="text/javascript">
        function facebookInit(appId) {
            FB.init({
                appId  : appId,
                status : true,
                cookie : true,
                xfbml  : true
            });
        }

        function increaseIframeSize(w,h) {
            var obj = new Object;
            obj.width=w;
            obj.height=h;
            FB.Canvas.setSize(obj);
        }
    </script>
    <script type="text/javascript" src="http://connect.facebook.net/de_DE/all.js"></script>
</head>

<body>
    <script>
        increaseIframeSize(720,800);
        facebookInit(appId);
    </script>
    ...
</body>
...