2013-04-14 4 views
0

Это задавали много раз, но я спрашиваю, потому что никакое решение не сработало для меня, и я не нашел много подходящих решений. Я хочу статическую ширину, но динамическая высота основывается на внутреннем контенте.iframe не будет динамически изменять размер

Я размещаю блог на субдомене и вставляю его через iframe на страницу в моем основном домене. Я мог бы установить статическую высоту и прокрутку, чтобы пользователи могли использовать блог, но мне нужно что-то, что выглядит лучше. Когда я делаю новые сообщения или пользователь нажимает на раздел комментария, я хочу, чтобы iframe мог автоматически настраивать размер, чтобы он мог отображать весь контент без полосы прокрутки.

До сих пор я не нашел решений, которые работают, главным образом потому, что многие из них связаны с страницами, которые находятся в одном домене.

+1

Вы уверены, что не хотите статической ширины и динамической высоты? – icktoofay

+0

Возможно, это возможно для страниц в одном домене, но в разных доменах/поддоменах я очень сомневаюсь в этом. – dev

+0

@vletech: Я думаю, что есть некоторая «обложка window.name», которая может сделать это кросс-домен, но это довольно уродливо. – icktoofay

ответ

2

Поскольку у вас есть контроль над содержимым в iframe, вы можете попробовать окно message событий.

Добавьте это к содержанию кадра:

// post a message to the top window with information about the height 
window.onload = function(){ 
    top.postMessage(document.body.scrollHeight, '*'); 
} 

И это на страницу, содержащую IFRAME:

// listen for the message and set the iframe height when it arrives 
window.addEventListener("message", function(event){ 
    document.getElementById('test').style.height = event.data+'px'; 
}, false); 

<iframe id="test" src="test.html"/> 

В ответ на ваш комментарий. Ниже приведены некоторые способы обновления высоты iframe при изменении содержимого iframe.

1.Mutation Events

// listen to all descendants of the body and if there are any modifications, post an update to the top window 
document.body.addEventListener("DOMSubtreeModified", function(){ 
    top.postMessage(document.body.scrollHeight, '*'); 
}, false); 

Такой подход был амортизируется. Это замена, но он еще не полностью поддерживается:

2.Mutation Observers

// create a MutationObserver to listen for modification to the body and post an update to the top window 
var observer = new MutationObserver(function(){ 
    top.postMessage(document.body.scrollHeight, '*'); 
}); 
observer.observe(document.body, {childList: true, subtree: true}); 

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

+0

Это работает, чтобы сначала установить iframe, но есть одна проблема. Скажем, пользователь загружает страницу, видит все сообщения и нажимает на них. Что произойдет, если сообщение больше, чем исходная высота iframe, iframe не будет автоматически изменять размер, чтобы разместить новую длину. Я не знаю достаточно, чтобы исправить это ... – mateikav

+0

Я добавил несколько вариантов, которые вам помогут. – louisbros

+0

На этот раз вместо увеличения фактической высоты iframe он добавляет полосу прокрутки и сохраняет статическую высоту iframe равной тому, что она была установлена ​​при первой загрузке страницы. Конечно, я мог бы помещать этот новый код в неправильное место. Я попробовал как страницу содержания iframe, так и страницу, содержащую iframe. – mateikav

0

Просто думал, что я добавьте это offsetHeight надежнее чем scrollHeight для разработки размера iFrame. Пока размер тела равен 0. Проблема заключается в том, что ScrollHeight будет только увеличивать размер страницы, а не уменьшать ее. Маржа выпуска can be overcome, но много кода, если вы заботитесь о IE8.

MutationEvents мертвые, используйте MutationObserver. Хотя это не работает в IE10 и ниже, поэтому вам нужно вернуться к setInterval, который вы должны использовать с таймером , если вы не хотите, чтобы пользователь видел мерцание экрана. RequestAnimationFrame также полезен для устранения мерцания экрана.

Возможно, вам будет интересно ознакомиться с https://github.com/davidjbradshaw/iframe-resizer, в котором рассматриваются все эти проблемы.

Смежные вопросы