Изменение размера фрейма в зависимости от содержимого

INSERT IGNORE INTO `mytable`
SET `field0` = '2',
`field1` = 12345,
`field2` = 12678;

Здесь запрос mysql, который вставляет записи, если не существует, и будет игнорировать существующие аналогичные записи.

----Untested----
491
задан robsch 30 March 2016 в 12:10
поделиться

8 ответов

У нас была подобная проблема, но немного обратная вашей ситуации - мы предоставляли iframed-контент сайтам на других доменах, поэтому политика одинакового происхождения также была проблемой. После многих часов, проведенных в google, мы в конце концов нашли (немного...) работоспособное решение, которое вы, возможно, сможете адаптировать к своим потребностям.

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

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

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

то home.html может общаться с framed.html (подставлен) и 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 (ребенок не может общаться с родителем через домены).

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

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

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

Здесь есть объяснение того, как facebook обрабатывает это, которое может быть немного понятнее, чем мое выше!


Код

В www.foo.com/home.html требуется следующий код javascript (его можно загрузить из файла .js на любом домене, кстати...):

<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>

В 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>
581
ответ дан TMS 30 March 2016 в 12:10
поделиться

Что-то на строках этого я живо должен работать.

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

Загрузка это с Вашим телом onload на iframe содержании.

-2
ответ дан Ólafur Waage 30 March 2016 в 12:10
поделиться

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

-2
ответ дан roryf 30 March 2016 в 12:10
поделиться

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

0
ответ дан Joeri Sebrechts 30 March 2016 в 12:10
поделиться

Решение на 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>

я не знаю, что необходимо добавить 30 к длине... 1 работал на меня.

к вашему сведению : Если у Вас уже есть атрибут "высоты" на Вашем iFrame, это просто добавляет стиль = "высота: xxx". Это не могло бы быть тем, что Вы хотите.

6
ответ дан robsch 30 March 2016 в 12:10
поделиться

Если Вы не должны будете обрабатывать 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>
81
ответ дан 22 November 2019 в 22:39
поделиться

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

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

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

​​Для этого требуется, чтобы логика на стороне сервера могла вычислять размеры отображаемого содержимого iframe.

2
ответ дан 22 November 2019 в 22:39
поделиться

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

window.postMessage ()

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

Сводка

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

Библиотека iFrame-Resizer использует postMessage для сохранения размера iFrame в соответствии с его содержимым, а также MutationObserver для обнаружения изменяет содержимое и не зависит от jQuery.

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 содержит много полезной информации и ссылок на другие решения.

http://www.onlineaspect.com/2010/01/15/backwards-compatible-postmessage/

Пример Barebones ...

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

Рабочий черновик HTML 5 для window.postMessage

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

Джон Ресиг о кросс- Обмен сообщениями в окне

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

40
ответ дан 22 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: