2011-01-14 27 views
7

Tôi cần điều chỉnh kích thước canvas sau khi cập nhật nội dung của trang. Tôi có thể làm điều đó một cách rõ ràng bởiCách thay đổi kích thước ứng dụng Facebook Canvas (iFrame) chính xác?

FB.Canvas.setSize({ width: 760, height: 1480 }); 

tuy nhiên, nó không hoạt động mà không có tham số, tức là .setSize().

Ngoài ra, tôi có thể điều chỉnh độ cao bằng

FB.Canvas.setAutoResize(true); 

nhưng chỉ tăng - nó không làm giảm chiều cao khi nội dung là giảm.

Những dòng này không làm việc:

FB.Arbiter.inform("setSize", FB.Canvas._computeContentSize()); 
FB.Canvas.setSize(FB.Canvas._computeContentSize()); 

Làm thế nào người ta có thể làm cho nó làm việc?

Một số bình luận thêm về vấn đề này:

  1. http://developers.facebook.com/blog/post/93
  2. http://developers.facebook.com/docs/reference/javascript/fb.canvas.setautoresize

liên quan:

  1. facebook-api: what's Facebook Connect cross-domain receiver URL?
  2. facebook-app: how can i change the height of a resizeable iframe application?
  3. Document height grows on resize when setting canvas dimensions dynamically

Làm cách nào để bạn kiểm soát kích thước ứng dụng Facebook Canvas?

Trả lời

3

Tôi đã cố gắng làm cho .setSize() làm việc bằng cách trì hoãn thực hiện của nó (như đề xuất trên các diễn đàn khác nhau):

window.setTimeout(function() { 
    FB.Canvas.setSize(); 
}, 250); 

Nếu bạn có XFBLM yếu tố, đặc biệt là fb:comments, sau đó bạn cần phải phân tích trang trước khi thiết lập kích thước của nó

window.setTimeout(function() { 
    FB.XFBML.parse(); 
    FB.Canvas.setSize(); 
}, 250); 

Lưu ý rằng bạn cần chạy tập lệnh này sau khối nội dung, nếu không tăng khoảng thời gian (tính bằng ms) cho phép trình duyệt web và trình duyệt khách tạo nội dung trước khi thay đổi kích cỡ canvas.

Cách tiếp cận này chỉ làm tăng chiều cao của trang của bạn và không giảm nó. Bạn có thể đạt được giảm theo cách thủ công bằng cách kích hoạt dòng sau trước khi mã ở trên

tuy nhiên, có một nhược điểm - trang sẽ nhấp nháy do thay đổi kích thước kép.

Ngoài ra, một trong những gợi ý chạy .setSize trong một số khoảng thời gian để giải thích nội dung chậm:

FB.Array.forEach([300, 600, 1000, 2000], function(delay) { 
    setTimeout(function() { 
    FB.XFBML.parse(); 
    FB.Canvas.setSize(); 
    }, delay) 
}); 

Trong trường hợp này, các trang và các yếu tố XFBML trở nên khá Blinky.

+2

Nếu bạn là làm điều đó đúng, bạn không cần bất kỳ điều này. – Bob

7

Không viết chức năng của riêng bạn cho tự động định lại kích thước theo thời gian.Fb có một:

FB.Canvas.setAutoResize(); 

Nếu bạn biết khi nào bạn cần phải thay đổi kích thước sử dụng

FB.Canvas.setSize() 

Vì vậy, nếu bạn muốn thực hiện được nhỏ hơn khi bạn bấm vào một liên kết, gắn bó nó trong một hàm và sau đó gọi hàm đó sau như sau:

function sizeChangeCallback() { 
    FB.Canvas.setSize(); 
    } 

//start some function or on click event - here i used jquery 
$("#something").click(function() { 
    sizeChangeCallback() 
}); 

Bạn không cần đặt chiều cao rõ ràng nhưng đôi khi bạn có thể gặp sự cố với các yếu tố xfbml động như plugin nhận xét. Hãy thử sử dụng một sự kiện đăng ký callback:

FB.Event.subscribe('xfbml.render', function(response) { 
    FB.Canvas.setAutoResize(); 
    }); 

http://developers.facebook.com/docs/reference/javascript/FB.Canvas.setSize/

http://developers.facebook.com/docs/reference/javascript/FB.Canvas.setAutoResize/

http://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

+1

lặp lại cùng một thông tin không có lợi cho bất cứ ai ở đây, phải không? Cảm ơn bạn đã đăng ký 'FB.Event.subscribe ('xfbml.render', ...'.Các liên kết cuối cùng cũng đáng được đề cập trong trường hợp nếu ai đó sử dụng các chức năng mà không cần đọc tham khảo ... – Andrei

+1

Lặp lại thông tin nào? Đặt chức năng hết thời gian chờ là hack, không tính đến thời gian hiển thị trang và setAutoResize là một chức năng hết thời gian chờ. – Bob

+0

Cũng đáng chú ý là bạn không cần đặt chiều cao hoặc chiều rộng rõ ràng cho setSize(); làm việc. Bạn chỉ cần bắt đầu ứng dụng với id ứng dụng thích hợp trước. Tôi có xu hướng bao gồm cả hai, như @Andrei đã đề xuất ở trên, sau khối nội dung của tôi. – Bob

0

câu trả lời của Bobby là rất tốt. Chỉ có điều tôi sẽ thêm vào đó là một số người đã thành công nhận được trang để thu nhỏ bằng cách làm như sau:

FB.Canvas.setSize({ width: 760, height: 10 });

Và sau đó làm theo nó với:

FB.Canvas.setAutoResize();

Bạn don không phải sử dụng 10, chỉ cần một cái gì đó nhỏ hơn kích thước tối thiểu của trang của bạn. Sau đó, các FB.Canvas.setAutoResize() nên đi trước và làm cho nó chiều cao thích hợp một lần nữa và tiếp tục cập nhật. Lần duy nhất bạn cần gọi lại số FB.Canvas.setSize({ width: 760, height: 10 }); sẽ là nếu nội dung bị thu hẹp lại.

Nguy cơ thực hiện việc này là nếu FB.Canvas.setAutoResize(); không hoạt động, bạn có thể có nội dung bị cắt.

+0

Cảm ơn sự đóng góp, tuy nhiên, bạn đang lặp lại câu trả lời của tôi (ngoại trừ câu cuối cùng, đó là giá trị đề cập đến thực sự). – Andrei

0

Không có cách nào trong số này phù hợp với tôi. Đảm bảo nhập mã này trước thẻ đóng.

<div id="fb-root"></div> 
<script type="text/javascript"> 
window.fbAsyncInit = function() { 

//Der folgende Code ändert die Grösse des iFrames alle 100ms 
FB.Canvas.setAutoResize(100); 

}; 
(function() { 
var e = document.createElement('script'); 
e.async = true; 
e.src = document.location.protocol + 
'//connect.facebook.net/en_US/all.js'; 
document.getElementById('fb-root').appendChild(e); 
}()); 

</script>  
0

Tôi đã cố gắng sử dụng FB.Canvas.setSize(e); để đổi kích thước ứng dụng của mình nhưng không đổi kích thước.

Tôi đã xem qua Javascript của Facebook và phát hiện ra, rằng FB.Canvas.setSize gọi hàm FB.Arbiter.inform('setSize',e).

Nếu tôi gọi hàm FB.Arbiter.inform('setSize',{ width: 760, height: 1480 }) ngay từ mã của tôi, canvas sẽ định lại kích thước chính xác.

0

này đã làm việc cho tôi:

<script type='text/javascript'> 
window.onload=function() { 
    FB.Canvas.setSize({width:760,height:document.body.offsetHeight}); 
} 
</script> 

Lưu ý rằng bạn không cần FB.init trừ khi bạn đang sử dụng nó vì những lý do khác.

2

Chúng tôi có các trang trong iframe của chúng tôi gắn thêm nội dung vào trang và sau đó cho phép người dùng làm mới nội dung trong trang tại chỗ. Trong những trường hợp này, chúng tôi đã thấy điều tương tự, nơi nội dung sẽ không co lại khi thích hợp.

FB.Canvas.setSize() gọi _computeContentSize, được trình bày dưới đây:

_computeContentSize: function() { 
    var body = document.body, 
     docElement = document.documentElement, 
     right = 0, 
     bottom = Math.max(
     Math.max(body.offsetHeight, body.scrollHeight) + 
      body.offsetTop, 
     Math.max(docElement.offsetHeight, docElement.scrollHeight) + 
      docElement.offsetTop); 

    if (body.offsetWidth < body.scrollWidth) { 
    right = body.scrollWidth + body.offsetLeft; 
    } else { 
    FB.Array.forEach(body.childNodes, function(child) { 
     var childRight = child.offsetWidth + child.offsetLeft; 
     if (childRight > right) { 
     right = childRight; 
     } 
    }); 
    } 
    if (docElement.clientLeft > 0) { 
    right += (docElement.clientLeft * 2); 
    } 
    if (docElement.clientTop > 0) { 
    bottom += (docElement.clientTop * 2); 
    } 

    return {height: bottom, width: right}; 
}, 

Dòng vấn đề là ở đây:

bottom = Math.max(
     Math.max(body.offsetHeight, body.scrollHeight) + 
     body.offsetTop, 
     Math.max(docElement.offsetHeight, docElement.scrollHeight) + 
     docElement.offsetTop); 

Ngay cả khi nội dung bên trong iframe của bạn đã bị thu hẹp, giá trị của body.offsetHeight sẽ không co lại .

Để giải quyết việc này, chúng tôi thực hiện một phiên bản tùy chỉnh của hàm computeContentSize mà chỉ tư vấn các docElement cho chiều cao, như vậy:

function rfComputeContentSize() { 
    var body = document.body, 
     docElement = document.documentElement, 
     right = 0, 
     bottom = Math.max(docElement.offsetHeight, docElement.scrollHeight) + docElement.offsetTop; 

    if (body.offsetWidth < body.scrollWidth) { 
    right = body.scrollWidth + body.offsetLeft; 
    } else { 
    FB.Array.forEach(body.childNodes, function(child) { 
     var childRight = child.offsetWidth + child.offsetLeft; 
     if (childRight > right) { 
     right = childRight; 
     } 
    }); 
    } 
    if (docElement.clientLeft > 0) { 
    right += (docElement.clientLeft * 2); 
    } 
    if (docElement.clientTop > 0) { 
    bottom += (docElement.clientTop * 2); 
    } 

    return {height: bottom, width: right}; 
} 

Bất cứ lúc nào chúng tôi muốn thay đổi kích thước và biết rằng nội dung có thể thu nhỏ chúng tôi sẽ sử dụng hàm tùy chỉnh để chuyển nội dung tới setSize (ví dụ FB.Canvas.setSize (rfComputeContentSize())), và bất cứ khi nào chúng ta biết rằng nội dung sẽ chỉ phát triển, chúng ta sẽ sử dụng hàm FB.Canvas.setSize() tiêu chuẩn.

Lưu ý rằng chúng tôi đã sử dụng setAutoGrow() và tôi đã không kiểm tra, nhưng tôi giả định rằng nó sử dụng cùng một chức năng để xác định kích thước. Chúng tôi đã tắt cuộc gọi của chúng tôi để setAutoGrow() và sẽ phải cảnh giác về việc gọi setSize() tại thời điểm approrpriate.

Logged lỗi này với Facebook: https://developers.facebook.com/bugs/228704057203827

1

Chúng tôi đã gặp một vấn đề mà FB.Canvas chức năng của họ đã không làm việc, mặc dù tất cả mọi thứ đã được khởi tạo đúng cách, bởi vì họ đang sử dụng 'IFRAME' thay vì khung nội tuyến trong chéo của họ thiết lập miền JS, do đó không có khả năng tương thích XHTML.

Chúng tôi đã sửa lỗi này bằng cách tạo mẫu hàm createElement của riêng chúng ta và ghi đè lên chúng. Chỉ cần đặt quyền này sau khi bạn bao gồm Facebooks all.js:

document.__createElement = document.createElement; 
document.createElement = function(tagName) { 
      return document.__createElement(tagName.toLowerCase()); 
} 
0

Khi thay đổi kích thước với chiều cao tối thiểu đừng quên để làm cho nó một chút lớn hơn đó là, để giải thích cho thanh cuộn ngang và một số điểm ảnh phụ mà một số trình duyệt thêm vào, nếu không bạn sẽ kết thúc với cuộn dọc.

Ngoài ra tôi không khuyên bạn nên sử dụng body để đếm chiều cao.

này đã làm việc cho tôi:

window.fbAsyncInit = function() 
{FB.Canvas.setSize({height:document.getElementById('m_table').offsetHeight+40});} 

nơi m_table là bảng ID với tất cả các nội dung của tôi (bạn có thể sử dụng thay vì div).

1

chút chức năng dư thừa, nhưng bài viết này giải thích tại sao bạn không thể làm điều đó tự động và cung cấp các giải pháp đơn giản nhất ... http://www.twistermc.com/36764/shrink-facebook-tabs/ Câu trả lời rất đơn giản: Shrink nó thực sự nhỏ, sau đó sau một autogrow sử dụng tạm dừng để làm cho nó đúng kích cỡ ... Alice in Wonderland phong cách.

  • tôi nói đơn giản nhất vì từ một dev và người sử dụng quan điểm này làm chậm xuống khoảng 1/4 giây, và người sử dụng được một đèn flash nhỏ của thanh cuộn ...
Các vấn đề liên quan