изменение размера iframe между доменами

Как изменить размер окна iframe из другого домена

-Edit

Прокрутите вниз, чтобы найти некоторые решения .. или прочитайте, как НЕ делать этого: D

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

Чтобы сэкономить ваше время, даже не идите по этому пути, просто используйте sendMessages для междоменного взаимодействия. Я использую плагины для HTML


Последние несколько дней я пытался интегрировать iframe в сайт. Это краткосрочное решение, пока другая сторона разрабатывает API (может занять месяцы ...) D

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

Чтобы сэкономить ваше время, даже не идите по этому пути, просто используйте sendMessages для междоменного взаимодействия. Я использую плагины для HTML


Последние несколько дней я пытался интегрировать iframe в сайт. Это краткосрочное решение, пока другая сторона разрабатывает API (может занять месяцы ...) D

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

Чтобы сэкономить ваше время, даже не идите по этому пути, просто используйте sendMessages для междоменного взаимодействия. Я использую плагины для HTML


Последние несколько дней я пытался интегрировать iframe в сайт. Это краткосрочное решение, пока другая сторона разрабатывает API (может занять месяцы ...) 5, которые я использую - перейдите к концу, чтобы увидеть хороший пример :)


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


В последние несколько дней я пытался интегрировать iframe в сайт. Это краткосрочное решение, пока другая сторона разрабатывает API (может занять месяцы ...) And because this is as short term solution we done want to use easyXDM- I have access to the other domain but its difficult enough asking them to add p3p header as it is.....

3 iframes

The closest solution I found was the 3 iframes- but it goes mental of chrome and safari so I cannot use that.

open in chrome

http://css-tricks.com/examples/iFrameResize/crossdomain.php#frameId=frame-one&height=1179

Measure the scrollbars

I found a another post on how to use the scrollheight to try and resize the form.. in theory it works well but I could not apply it properly using the iframes scroll height..

document.body.scrollHeight

That obvoisly uses the bodies height (cannot access these properties 100% is based on the clients display canvaz and not the x-domains document height)

I tried using jquery to get the iframes height

$('#frameId').Height()

$('#frameId').clientHeight

$('#frameId').scrollHeight

return values different in chrome and ie - or just don't make sense at all. The problem is that everything inside the frame is denied- even the scrollbar...

Computed Styles

But if I inspect and element in chrome of the iframe it bladdy shows me the documents dimensions inside the iframe (using jquery x-domain to get iframe.heigh - access denied) There is nothing in the computed CSS enter image description here

Now how does chrome calculate that? (edit- browser re-renders the page using its build in rendering engine to calcualte all these settings - but are not attached anywhere to prevent cross-domain fraud.. so..)

HTML4

I read specification of HTML4.x and it says there that there should be read-only values exposed via document.element but it's access denied via jquery

Proxy Frame

I went down the route of proxying the site back and calculating which is OK.. until a user logs in through the iframe and the proxy gets a login page instead of the actual content. Also to some calling the page twice is not acceptable

http://www.codeproject.com/KB/aspnet/asproxy.aspx

http://www.johnchapman.name/aspnet-proxy-page-cross-domain-requests-from-ajax-and-javascript/

Re-Render the page

I did not go this far but there are jscript engines out there that will look at the source and re-render the page based on the source file . but it would require hacking those jscripts.. and thats not an ideal situation for commercial entities... и некоторые инволюционные апплеты на чистом Java или рендеринг на стороне сервера

http://en.wikipedia.org/wiki/Server-side_JavaScript

http://htmlunit.sourceforge.net/

http://maxq.tigris.org/


ИЗМЕНИТЬ 09-2013 ОБНОВЛЕНИЕ

Все это можно сделать с помощью сокетов HTML5. Но easyXDM - отличный запасной вариант для страниц жалоб, не относящихся к HTML5.

Решение 1 Очень отличное решение!

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

На вашем сервере вы настраиваете страницу в форме









    

, а в домене вызывающих абонентов им просто нужно добавить intermiedate_frame html и easyXDM.js в одно и то же место. Как родительская папка - тогда вы можете получить доступ к относительным каталогам или содержащейся в них папке только для вас.

ВАРИАНТ 1

Если вы не хотите добавлять скрипты на все страницы, посмотрите вариант 2!

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

 

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


Это отлично подходит для меня. Если ширина не указана, то фрейм ведет себя немного странно, и kind'of пытается угадать, какой он должен быть ... и не сжимается, если вам это нужно.

ВАРИАНТ 2

Измените промежуточный фрейм на опрос на предмет изменений

Ваш промежуточный фрейм должен выглядеть примерно так ...

    

    

        Frame
        
        
        
    
    

    

Интервал можно было бы сделать более эффективным для проверки, если размер изменился, и отправки только в случае изменения размеров вместо отправки сообщений каждые 500 мс. Если вы реализуете эту проверку, вы можете изменить опрос всего на 50 мс! получайте удовольствие


Работайте в разных браузерах, это быстро. Отличные возможности отладки !!

Excellent Work to  Sean Kinsey  who made the script!!!

Решение 2 (Работает, но не очень хорошо)

Итак, если у вас есть взаимное соглашение с другим доменом, вы можете добавить библиотеку для обработки sendmessage. Если у вас нет доступа к другому домену ... Продолжайте искать другие взломы - потому что я не смог найти или полностью обосновать их, которые я нашел.

Таким образом, другой домен будет включать их в свой тег Head




In club.js - это просто несколько пользовательских вызовов, которые я сделал для вызовов изменения размера, и он содержит ..

 $(document).ready(function () {   
    var parent_url = decodeURIComponent( document.location.hash.replace( /^#/, '' ) ),link;
//Add source url hash to each url to authorise callback when navigating inside the frame.Without this clicking any links will break the communication and no messages will be received
$('a[href]').each(function(){ 
     this.href = this.href + document.location.hash ;
});
//Get the dimensions and send back to calling page.
var h1 = document.body.scrollHeight;
var w1 = document.body.scrollWidth;
$.postMessage({ if_height: h1, if_width: w1 }, parent_url, parent );
  });

А ваша страница сделает всю тяжелую работу и имеет хороший сценарий ...

  //This is almost like request.querystring used to get the iframe data
  function querySt(param, e) {
         gy = e.split("&");
         for (i = 0; i < gy.length; i++) {
             ft = gy[i].split("=");
             if (ft[0] == param) {
                 return ft[1];
             }
         }
     }


     $(function () {
         // Keep track of the iframe dimensions.
         var if_height;
         var if_width;
         // Pass the parent page URL into the Iframe in a meaningful way (this URL could be
         // passed via query string or hard coded into the child page, it depends on your needs).
         src = 'http://www.OTHERDOAMIN.co.uk/OTHERSTARTPAGE.htm' + '#' + encodeURIComponent(document.location.href),
         // Append the Iframe into the DOM.
         iframe = $('