iframe にはページにコンテンツを追加するページがあり、ユーザーはページ内のコンテンツをその場で更新できます。これらのケースでは、適切なときにコンテンツが縮小されないという同じことが見られました。
FB.Canvas.setSize() は、以下に示す _computeContentSize を呼び出します。
_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};
},
問題のある行は次のとおりです。
bottom = Math.max(
Math.max(body.offsetHeight, body.scrollHeight) +
body.offsetTop,
Math.max(docElement.offsetHeight, docElement.scrollHeight) +
docElement.offsetTop);
iframe 内のコンテンツが縮小しても、body.offsetHeight の値は縮小されません。
これを解決するために、次のように高さについて docElement のみを参照する computeContentSize 関数のカスタム バージョンを作成しました。
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};
}
サイズを変更する必要があり、コンテンツが縮小する可能性があることがわかっている場合はいつでも、カスタム関数を使用してコンテンツを setSize に渡します (例: FB.Canvas.setSize(rfComputeContentSize()))。 ' 標準の FB.Canvas.setSize() 関数を使用します。
setAutoGrow() を使用していたことに注意してください。チェックはしていませんが、同じ関数を使用してサイズを決定していると想定しています。setAutoGrow() の呼び出しを無効にしたため、適切なタイミングで setSize() を呼び出すことに注意する必要があります。
このバグを Facebook に記録しました: https://developers.facebook.com/bugs/228704057203827