Как изменить размер окна 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
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/
ИЗМЕНИТЬ 09-2013 ОБНОВЛЕНИЕ
Все это можно сделать с помощью сокетов HTML5. Но easyXDM - отличный запасной вариант для страниц жалоб, не относящихся к HTML5.
Решение 1 Очень отличное решение!
Использование easyXDM
На вашем сервере вы настраиваете страницу в форме
, а в домене вызывающих абонентов им просто нужно добавить intermiedate_frame html и easyXDM.js в одно и то же место. Как родительская папка - тогда вы можете получить доступ к относительным каталогам или содержащейся в них папке только для вас.
Если вы не хотите добавлять скрипты на все страницы, посмотрите вариант 2!
Тогда они смогут просто добавьте простой скрипт jscript в конец каждой страницы, размер которой необходимо изменить. Нет необходимости включать easyxdm на каждую из этих страниц.
Я изменил параметры, которые он отправляет. Если вы хотите, чтобы ширина работала правильно, тогда страницы в другом домене должны включать ширину страницы в каком-то стиле, который выглядит примерно так:
Это отлично подходит для меня. Если ширина не указана, то фрейм ведет себя немного странно, и kind'of пытается угадать, какой он должен быть ... и не сжимается, если вам это нужно.
Измените промежуточный фрейм на опрос на предмет изменений
Ваш промежуточный фрейм должен выглядеть примерно так ...
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 = $('
Теперь это небольшая библиотека JS для управления изменением размера междоменных iFrames, она по-прежнему требует, чтобы в iFrame был немного JavaScript, однако это всего 2,8 КБ (765 байт в сжатом виде) собственного JS, который не имеет никаких зависимостей и не имеет ' t ничего делать, пока не будет вызвано родительской страницей. Это означает, что это хороший гость в других системах.
Этот код использует mutationObserver для обнаружения изменений DOM, а также отслеживает события изменения размера, чтобы размер iFrame оставался равным содержимому. Работает в IE8 +.