Facebook Canvas应用程序内的滚动事件

时间:2011-12-09 17:36:05

标签: facebook jquery facebook-javascript-sdk facebook-canvas

我希望将LazyLoad技术用于图像,并使用无限滚动将新内容加载到我的页面中。这两件事都利用了Facebook画布应用程序内部不起作用的$(window).scrollTop()函数。我知道我可以使用FB.Canvas.getPageInfo()来获取当前的scrollTop值但是我遇到了一些性能问题,我的代码如下:

var oldScroll = 0;       // current scroll 
var newScroll = null;    // new scroll (fetched from FB.Canvas)

// Override the normal function to work within fb
// !!This seems to kill the browser
$.fn.scrollTop = function() {
    return FB.Canvas.getPageInfo().scrollTop;  
};

// poll to check for any changes in scroll
setInterval(function() {
    newScroll = FB.Canvas.getPageInfo().scrollTop; 

    if(oldScroll != newScroll) {     // have we scrolled at all?
        oldScroll = newScroll;
        $(window).trigger($.Event('scroll'));   // fire a scroll event to keep the rest of the application that is listening
    }
}, 1000);

如果我不覆盖scrollTop函数,但是一旦我的浏览器很快崩溃,似乎没问题。

我是否完全错了?有人已经在FB画布中创建了一种方法吗?欢呼声。

2 个答案:

答案 0 :(得分:2)

我试图解决同样的问题,我的解决方案是Facebook应用程序+ setInterval中的一个额外元素(div#xscroll,pos:abs,L):

function wininfo() {
    FB.Canvas.getPageInfo(
        function(info) {
            $('#xscroll').height(info.clientHeight+info.offsetTop+info.scrollTop).trigger('scroll');
        }
    );
};

现在您可以将此#xscroll用于LazyLoad:

$(".img").lazyload({threshold:400,effect:"fadeIn",skip_invisible:true,container:'#xscroll'});

问题是 - 当FB.Canvas.getPageInfo,我的间隔为2000时CPU使用率很高 - 而且CPU使用率很高。经过一小时的脚本工作 - Safari减速并记忆......

答案 1 :(得分:1)

您是否坚持让scrollTop()功能被覆盖?最初它适用于您通过jQuery选择器提供的任何元素,而您似乎只将其限制为Facebook画布。如果任何其他javascript尝试使用scrollTop(),它将失败,不会吗?

至于解决方案,我已经完成了无限滚动 - setInterval()以查看您是否已达到底部,然后加载内容,然后再次检查滚动,依此类推。但是我没有随时触发窗口的原始滚动事件,因为没有必要 - 至少在我的情况下。