к переменной, вы можете использовать

Как изменить размеры фреймов, чтобы они соответствовали высоте содержимого фреймов?

Сериализация

Обновление: . Обратите внимание, что контент загружается из других доменов, поэтому политика одного и того же происхождения или используйте более быструю реализацию, используя

У нас возникла проблема такого типа, но немного обратная вашей Ситуация — мы предоставляли контент iframed для сайтов в других доменах, поэтому Мне удалось обойти это ограничение, добавив в запрос пользователя и пароль (например, user: pw@domain.tld). Это работает практически с любым браузером была также проблема. После долгих часов траления в Google мы нашли (несколько ..) работоспособное решение, которое вы сможете адаптировать к вашим потребностям.

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

Существует особенность браузера, которая позволяет нам обходить ту же политику происхождения — javascript может взаимодействовать либо со страницами в своем собственном домене, либо со страницами, на которые он встроен, но никогда со страницами, в которых он создан, например, если у вас есть:

 www.foo.com/home.html, which iframes
 |-> www.bar.net/framed.html, which iframes
     |-> www.foo.com/helper.html

then home.html может общаться с framed.html (iframed) и helper.html, и теперь оно будет работать нормально.

 Communication options for each page:
  ------------------------- ----------- ------------- ------------- 
 |                         | home.html | framed.html | helper.html |
  ------------------------- ----------- ------------- ------------- 
 | www.foo.com/home.html   |    N/A    |     YES     |     YES     |
 | www.bar.net/framed.html |    NO     |     N/A     |     YES     |
 | www.foo.com/helper.html |    YES    |     YES     |     N/A     |
  ------------------------- ----------- ------------- ------------- 

framed.html может отправлять сообщения в helper.html (iframed), но не home.html (дочерний объект не может общаться между доменами с родительским).

jQuery 1.8 helper.html может получать сообщения от framed.html и также может обмениваться данными . Это как окно, которое вы можете открыть с помощью home.html Глядя на вывод

Таким образом, когда framed.html сидит. helper.html Самый простой способ передачи сообщений от home.html, который затем может изменить размер iframe, в котором framed.html Для тех, у кого есть проблемы с использованием приведенного ниже кода, и он продолжает показывать

записи вручную в поток для записи при вводе чего-либо framed.htmlhelper.html был указан в аргументе URL. Для этого framed.html. Когда его src='' здесь есть объяснение onload пожары, он оценивает свою собственную высоту и устанавливает src для iframe в этот моментhelper.html?height=N

того, как Facebook справляется с этим, что может быть немного яснее, чем у меня выше! , следующий javascri требуется pt-код (это может быть случайно загружено из файла .js в любом домене ..):


кодом

закрытии JavaScript внутри циклов — простой практический пример — переполнение стека www.foo.com/home.html window.postMessage ()

<script>
  // Resize iframe to full height
  function resizeIframe(height)
  {
    // " 60" is a general rule of thumb to allow for differences in
    // IE & and FF height reporting, can be adjusted as required..
    document.getElementById('frame_name_here').height = parseInt(height) 60;
  }
</script>
<iframe id='frame_name_here' src='http://www.bar.net/framed.html'></iframe>

закрытии JavaScript внутри циклов — простой практический пример — переполнение стека www.bar.net/framed.html:

<body onload="iframeResizePipe()">
<iframe id="helpframe" src='' height='0' width='0' frameborder='0'></iframe>

<script type="text/javascript">
  function iframeResizePipe()
  {
     // What's the page height?
     var height = document.body.scrollHeight;

     // Going to 'pipe' the data to the parent through the helpframe..
     var pipe = document.getElementById('helpframe');

     // Cachebuster a precaution here to stop browser caching interfering
     pipe.src = 'http://www.foo.com/helper.html?height=' height '&cacheb=' Math.random();

  }
</script>

Содержимое www.foo.com/helper.html:

<html> 
<!-- 
This page is on the same domain as the parent, so can
communicate with it to order the iframe window resizing
to fit the content 
--> 
  <body onload="parentIframeResize()"> 
    <script> 
      // Tell the parent iframe what height the iframe needs to be
      function parentIframeResize()
      {
         var height = getParam('height');
         // This works as our parent's parent is on our domain..
         parent.parent.resizeIframe(height);
      }

      // Helper function, parse param from request string
      function getParam( name )
      {
        name = name.replace(/[[]/,"\[").replace(/[]]/,"\]");
        var regexS = "[\?&]" name "=([^&#]*)";
        var regex = new RegExp( regexS );
        var results = regex.exec( window.location.href );
        if( results == null )
          return "";
        else
          return results[1];
      }
    </script> 
  </body> 
</html>

Если вам не нужно обрабатывать содержимое iframe из другого домена, попробуйте этот код, это решит проблема полностью и проста:

<script language="JavaScript">
<!--
function autoResize(id){
    var newheight;
    var newwidth;

    if(document.getElementById){
        newheight=document.getElementById(id).contentWindow.document .body.scrollHeight;
        newwidth=document.getElementById(id).contentWindow.document .body.scrollWidth;
    }

    document.getElementById(id).height= (newheight)   "px";
    document.getElementById(id).width= (newwidth)   "px";
}
//-->
</script>

<iframe src="usagelogs/default.aspx" width="100%" height="200px" id="iframe1" marginheight="0" frameborder="0" onLoad="autoResize('iframe1');"></iframe>

https://developer.mozilla.org/en/DOM/window.postMessage

window.postMessage при вызове вызывает отправку MessageEvent в целевую систему окно, когда завершается выполнение любого ожидающего выполнения сценария (например, оставшиеся обработчики событий, если window.postMessage вызывается из обработчика событий, предварительно установленных тайм-аутов ожидания и т. д.). MessageEvent имеет тип сообщения, свойство data, для которого задано строковое значение первого аргумента, предоставленного window.postMessage, свойство origin, соответствующее источнику основного документа в окне, вызывающем window.postMessage во временном окне. Был вызван postMessage и свойство источника, которое является окном, из которого вызывается window.postMessage. (Другие стандартные свойства событий присутствуют с их ожидаемыми значениями.)

window.postMessage — это метод безопасного включения связи между источниками. Как правило, скрипты на разных страницах могут получать доступ друг к другу только тогда и только тогда, когда страницы, которые их выполняли, находятся в местах с одинаковым протоколом (обычно с http), номером порта (по умолчанию для http используется 80) и хостом (по модулю). document.domain устанавливается обеими страницами на одно и то же значение). window.postMessage предоставляет управляемый механизм, позволяющий обойти это ограничение безопасным способом при правильном использовании.

Если все кажется совершенно неясным, лучше всего поиграть с примерами. Читать объяснения гораздо сложнее, чем понимать примеры. Мои объяснения замыканий, стековых фреймов и т. Д. Не являются технически правильными — они представляют собой грубые упрощения, предназначенные для того, чтобы помочь понять. Как только основная идея получена, вы можете подобрать детали позже.

Преобразовать строку в регистр заголовка с помощью JavaScript

Переменная Существует ли простой способ конвертировать строку в регистр заголовка? Например. библиотека использует postMessage для сохранения размера iFrame для своего содержимого вместе с MutationObserver Обратите внимание, что нет точки с запятой: это просто функция

https://github.com/davidjbradshaw/iframe-resizer

jQuery: совершенство междоменных сценариев

http://benalman.com/projects / jquery-postmessage-plugin /

Демонстрация изменения размера окна iframe …

http://benalman.com/code/projects/jquery-postmessage/examples/iframe/

В этой статье показано, как удалить зависимость от jQuery. . Plus имеет много полезной информации и ссылок на другие решения.

Стиль CSS для ваших элементов управления.

http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html # crossDocumentMessages

http://onlineaspect.com/uploads/postmessage/parent.html

, если вы can

Джон Резиг на кресте -Windows Messaging

http://ejohn.org/blog/cross-window-messaging/

Самый простой способ — сначала использовать jQuery:

в вашей строке.

$("iframe")
.attr({"scrolling": "no", "src":"http://www.someotherlink.com/"})
.load(function() {
    $(this).css("height", $(this).contents().height()   "px");
});

Хорошо, я постараюсь сделать это быстро, потому что это ДОЛЖНО быть легко исправить … & # xA ; & # xA ; Я прочитал кучу похожих вопросов, и ответ кажется вполне очевидным. Ничего из того, что мне пришлось бы искать в f … Http://www.phinesolutions.com/use-jquery-to-adjust-the-iframe-height.html отлично работает (использует jQuery):

<script type=”text/javascript”>
  $(document).ready(function() {
    var theFrame = $(”#iFrameToAdjust”, parent.document.body);
    theFrame.height($(document.body).height()   30);
  });
</script>

На всякий случай, если вас волнуют эти слова-наполнители, вы всегда можете просто сказать функции, что не использовать заглавные буквы.

Надеюсь, это поможет вам. : Если у вас уже есть атрибут «height» в вашем iFrame, это просто добавляет style = «height: xxx» , Это может быть не то, что вы хотите.

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

http://jsfiddle.net/EtX6G/

iframe {border:0; overflow:hidden;}

javascript :

$(document).ready(function(){
    $("iframe").load( function () {
        var c = (this.contentWindow || this.contentDocument);
        if (c.document) d = c.document;
        var ih = $(d).outerHeight();
        var iw = $(d).outerWidth();
        $(this).css({
            height: ih,
            width: iw
        });
    });
});

Надеюсь, это кому-нибудь поможет.

Наконец, я нашел другое решение для отправки данных на родительский веб-сайт из iframe с использованием window.postMessage(message, targetOrigin);. Здесь я объясню, как я это сделал.

первая буква каждого слова. Становится очень простым 1 вкладышем: http://foo.com Site B = Кажется, что работает … Протестировано с выше, «быстрый коричневый, лиса? / Прыгает / ^ через ^ ленивый! Собака … «и» C: / программные файлы / некоторые поставщики / их 2-е приложение / file1.txt «.

Если вы хотите, чтобы 2Nd вместо 2, вы можете изменить на

и ее

window.parent.postMessage("Hello From IFrame", "*"); 

или

window.parent.postMessage("Hello From IFrame", "http://foo.com");

Затем siteA имеет следующий код

// Here "addEventListener" is for standards-compliant web browsers and "attachEvent" is for IE Browsers.
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];


var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

// Listen to message from child IFrame window
eventer(messageEvent, function (e) {
   alert(e.data);
   // Do whatever you want to do with the data got from IFrame in Parent form.
}, false); 

Попробуйте это, кратчайший путь: eventer(messageEvent, function (e) {})

if (e.origin == 'http://iframe.example.com') {
    alert(e.data); 
    // Do whatever you want to do with the data got from IFrame in Parent form.
}

для IE

ES 6

 window.parent.postMessage('{"key":"value"}','*');

Вот перенаправление с задержкой. Вы можете установить время задержки по своему усмотрению:

 eventer(messageEvent, function (e) {
   var data = jQuery.parseJSON(e.data);
   doSomething(data.key);
 }, false);

) имеет свойство «конструктор», которое по умолчанию ссылается на метод

http://www.8degrees.co.nz/2010/06/09/dynamically-resize-an-iframe-depending-on-its-content/

Таким образом, поставляемый код iframe будет иметь сопровождающую таблицу стилей, например, так …

<link href="http://your.site/path/to/css?contents_id=1234&dom_id=iframe_widget" rel="stylesheet" type="text/css" />

<iframe id="iframe_widget" src="http://your.site/path/to/content?content_id=1234" frameborder="0" width="100%" scrolling="no"></iframe>

для поддержки диакритических знаков:

Object.create

<!-- 16:9 aspect ratio -->
<div class="embed-responsive embed-responsive-16by9">
  <iframe class="embed-responsive-item" src="http://www.youtube.com/embed/WsFWhL4Y84Y"></iframe>
</div>

jsfiddle: http://getbootstrap.com/components/ # response-embed

y

Я внедряю решение ConroyP для покадровой замены вместо решения, основанного на настройке document.domain, но обнаружил, что довольно сложно определить высоту iframe. содержимое правильно в разных браузерах (тестирование с FF11, Ch17 и IE9 прямо сейчас).

ConroyP использует:

var height = document.body.scrollHeight;

Но это работает только при начальной загрузке страницы. Мой iframe имеет динамическое содержимое, и мне нужно изменить размер iframe для определенных событий.

В итоге я использовал разные свойства JS для разных браузеров.

function getDim () {
    var body = document.body,
        html = document.documentElement;

    var bc = body.clientHeight;
    var bo = body.offsetHeight;
    var bs = body.scrollHeight;
    var hc = html.clientHeight;
    var ho = html.offsetHeight;
    var hs = html.scrollHeight;

    var h = Math.max(bc, bo, bs, hc, hs, ho);

    var bd = getBrowserData();

    // Select height property to use depending on browser
    if (bd.isGecko) {
        // FF 11
        h = hc;
    } else if (bd.isChrome) {
        // CH 17
        h = hc;
    } else if (bd.isIE) {
        // IE 9
        h = bs;
    }

    return h;
}

getBrowserData () — функция обнаружения браузера, «вдохновленная» атрибутом Ext Core http://docs.sencha.com/core/source/Ext.html # method-Ext-apply

Это хорошо работает для FF и IE, но затем возникли проблемы с Chrome. Одной из них была проблема синхронизации, очевидно, что Chrome требуется некоторое время, чтобы установить / определить высоту фрейма. Кроме того, Chrome также никогда не возвращает правильную высоту содержимого в iframe, если iframe был выше содержимого. Это не будет работать с динамическим контентом, когда высота уменьшается.

Чтобы решить эту проблему, я всегда устанавливаю для iframe небольшую высоту, прежде чем определять высоту содержимого, а затем устанавливаю правильную высоту iframe. value.

function resize () {
    // Reset the iframes height to a low value.
    // Otherwise Chrome won't detect the content height of the iframe.
    setIframeHeight(150);

    // Delay getting the dimensions because Chrome needs
    // a few moments to get the correct height.
    setTimeout("getDimAndResize()", 100);
}

Код не оптимизирован, он из моего тестирования на уровне :)

Надеюсь, кто-то найдет это полезным!

<html>
<head>
<script>
function frameSize(id){
var frameHeight;

document.getElementById(id).height=0   "px";
if(document.getElementById){
    newheight=document.getElementById(id).contentWindow.document.body.scrollHeight;    
}

document.getElementById(id).height= (frameHeight)   "px";
}
</script>
</head>

<body>

<iframe id="frame"  src="startframe.html" frameborder="0" marginheight="0" hspace=20     width="100%" 

onload="javascript:frameSize('frame');">

<p>This will work, but you need to host it on an http server, you can do it locally.    </p>
</body>
</html>

гаджеты iGoogle должны активно реализовывать изменение размера, поэтому я предполагаю, что вы можете использовать междоменную модель ‘ сделать это без участия какого-либо удаленного контента. Если ваш контент может отправить сообщение с новым размером на страницу контейнера, используя типичные методы междоменной связи, тогда все остальное просто.

Если вы хотите уменьшить веб-страницу, чтобы она соответствовала размеру iframe:

  1. Вы должны изменить размер Ваши объекты могут иметь любое количество свойств, и вы можете выбрать сортировку по любому желаемому свойству объекта по номеру или строке, если вы поместите объекты в массив. Рассмотрим этот массив: , чтобы дополнить его содержимым
  2. . Затем вы должны уменьшить весь iframe с загруженным содержимым веб-страницы

Вот пример:

<div id="wrap">
   <IFRAME ID="frame" name="Main" src ="http://www.google.com" />
</div>

<style type="text/css">
    #wrap { width: 130px; height: 130px; padding: 0; overflow: hidden; }
    #frame { width: 900px; height: 600px; border: 1px solid black; }
    #frame { zoom:0.15; -moz-transform:scale(0.15);-moz-transform-origin: 0 0; }
</style>

Вот подход jQuery, который добавляет информацию в json через атрибут src iframe. Вот демонстрация, измените размер и прокрутите это окно … Полученный URL с json выглядит следующим образом … http://fiddle.jshell.net/zippyskippy/RJN3G/show/ # {docHeight: 5124, windowHeight: 1019, scrollHeight: 571} #

Вот скрипка исходного кода http://jsfiddle.net/zippyskippy/RJN3G/

function updateLocation(){

    var loc = window.location.href;
    window.location.href = loc.replace(/#{.*}#/,"") 
          "#{docHeight:" $(document).height() 
          ",windowHeight:" $(window).height()
          ",scrollHeight:" $(window).scrollTop()
         "}#";

};

//setInterval(updateLocation,500);

$(window).resize(updateLocation);
$(window).scroll(updateLocation);

получить высоту содержимого iframe, а затем передать ее этому iframe

 var iframes = document.getElementsByTagName("iframe");
 for(var i = 0, len = iframes.length; i<len; i  ){
      window.frames[i].onload = function(_i){
           return function(){
                     iframes[_i].style.height = window.frames[_i].document.body.scrollHeight   "px";
                     }
      }(i);
 }

Для получения дополнительной информации см. Обзор различных способов комбинирования селекторов ниже!

 <iframe src="your_url" marginwidth="0"  marginheight="0" scrolling="No" frameborder="0"  hspace="0" vspace="0" id="containiframe" onload="loaderIframe();" height="100%"  width="100%"></iframe>

function loaderIframe(){
var heightIframe = $('#containiframe').contents().find('body').height();
$('#frame').css("height", heightFrame);
 }  

при изменении размера на отзывчивой странице:

$(window).resize(function(){
if($('#containiframe').length !== 0) {
var heightIframe = $('#containiframe').contents().find('body').height();
 $('#frame').css("height", heightFrame);
}
});

Использование jQuery:

parent.html

<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<style>
iframe {
    width: 100%;
    border: 1px solid black;
}
</style>
<script>
function foo(w, h) {
    $("iframe").css({width: w, height: h});
    return true;  // for debug purposes
}
</script>
<iframe src="child.html"></iframe>
</body>

child.html

<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script>
$(function() {
    var w = $("#container").css("width");
    var h = $("#container").css("height");

    var req = parent.foo(w, h);
    console.log(req); // for debug purposes
});
</script>
<style>
body, html {
    margin: 0;
}
#container {
    width: 500px;
    height: 500px;
    background-color: red;
}
</style>
<div id="container"></div>
</body>

Это немного сложнее, так как вы должны знать, когда страница iframe загрузилась, что трудно, когда вы не контролируете его содержание. Можно добавить обработчик загрузки в iframe, но я пробовал это в прошлом, и в браузерах он ведет себя совершенно по-разному (не думаю, кто самый раздражающий …). Возможно, вам придется добавить на страницу iframe функцию, которая выполняет изменение размера, и внедрить некоторый сценарий в контент, который либо прослушивает события загрузки, либо изменяет размер события, который затем вызывает предыдущую функцию. Я думаю добавить функцию на страницу, так как вы хотите убедиться, что она безопасна, но я понятия не имею, насколько легко это будет сделать.

Что-то на линии этого, я верю, должно работать.

parent.document.getElementById(iFrameID).style.height=framedPage.scrollHeight;

Загрузите его с нагрузкой тела на содержимое iframe.

(Знаки пунктуации):

<a href='#' onClick=" document.getElementById('myform').src='t2.htm';document.getElementById('myform').width='500px'; document.getElementById('myform').height='400px'; return false">500x400</a>