Пересеките домен iframe обнаружение загрузки содержания

У меня есть довольно интересная проблема. У меня есть родительская страница, которая создаст модальное диалоговое окно jQuery с iframe, содержавшим в диалоговом окне. iframe будет заполнен с содержанием от стороннего домена. Моя проблема - то, что я должен создать некоторый диалоговый уровень JavaScript, который может обнаружить, если содержание iframe загрузилось успешно и если это не имеет в 5 кадрах второго раза, затем чтобы закрыть диалоговое окно и возвратить пользователя родительской странице.

Я исследовал многочисленные решения, и только два имеют любую истинную ценность.

  1. Заставьте удаленный сайт включать строку JavaScript document.domain = 'our-domain.com'.
  2. Используйте взлом Фрагмента URL, но снова мне был бы нужен запрос, что удаленный сайт, который в состоянии изменить URL путем добавления '#some_value' в конец URL и моего диалогового окна, должен будет опросить URL до него или досматривает его или времена до конца.

Это честно единственные опции, с которыми я должен работать? Разве нет ли более простого способа просто обнаружить это?

Я исследовал, если существует способ опросить относительно http ошибок ответа, но это все еще остается ограниченным теми же ограничениями.

Любая справка очень ценилась бы.

Спасибо

15
задан rik_davis 2 May 2010 в 17:36
поделиться

5 ответов

Самый простой способ (если вы можете получить код, добавленный на внешние сайты) - это добавить невидимый iframe, указывающий на специальный html-файл в вашем домене. Затем можно использовать parent.parent.foo() для уведомления исходного окна о событии загрузки.

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

10
ответ дан 1 December 2019 в 04:27
поделиться

В любом случае вам понадобится какое-то содействие со стороны сервера другого домена, поскольку вы пытаетесь злоупотребить политикой одинакового происхождения (SOP)

Первое решение document.domain=... не будет работать, если домены разные. Оно работает только для поддоменов и портов, как описано в ссылке выше.

Единственный вариант, который позволяет осуществлять междоменную связь без опроса - это JSONP или инъекция скрипта с обратным вызовом функции JS. Этот метод доступен во всех API Google и хорошо работает.

Мы объяснили в нашем блоге способ "песочницы" этих вызовов в iframe для их защиты. Хотя postMessage сейчас лучше, хак window.name имеет то преимущество, что работает на старых браузерах.

Как ни странно, SOP не мешает вам POST что-либо на другой домен. Но вы не сможете прочитать ответ.

-1
ответ дан 1 December 2019 в 04:27
поделиться

У Николаса Закаса есть статья об обнаружении загрузки iframe: http://www.nczonline.net/blog/2009/09/15/iframes-onload-and-documentdomain/. В основном у вас есть этот фрагмент кода:

var iframe = document.createElement("iframe");
iframe.src = "simpleinner.htm";

if (iframe.attachEvent){
    iframe.attachEvent("onload", function(){
        alert("Local iframe is now loaded.");
    });
} else {
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
}

document.body.appendChild(iframe);

Я не тестировал его, но я уверен, что jQuery должен быть в состоянии справиться с этим, делая что-то вроде $("#iframe").load(function () { alert("Local iframe is now loaded. "); });

3
ответ дан 1 December 2019 в 04:27
поделиться

Можно попробовать использовать postMessage для связи между фреймами.
Это потребует от удаленного сайта включения определенного JavaScript для отправки сообщения в родительский документ после завершения его загрузки.

2
ответ дан 1 December 2019 в 04:27
поделиться

Это можно сделать с помощью обработчика загрузки в самом iframe. К сожалению (сюрприз!) IE усложняет задачу. Единственный способ заставить это работать - это составить HTML для iframe, а затем добавить его в документ с помощью innerHTML . Затем мне нужно провести опрос, чтобы узнать, когда iframe появляется в DOM, что зависит от того, загружается ли страница. Вот ссылка на источник: http://svn.openlaszlo.org/openlaszlo/trunk/lps/includes/source/iframemanager.js

См. create () , __finishCreate () и gotload () . Не стесняйтесь сделать копию и использовать ее сами!

С уважением, Макс Карлсон OpenLaszlo.org

1
ответ дан 1 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

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