В нашем 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 не уменьшится.
Чтобы решить эту проблему, мы создали специальную версию функции computeContentSize, которая обращается только к docElement для высоты, например:
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