У меня есть довольно интересная проблема. У меня есть родительская страница, которая создаст модальное диалоговое окно jQuery с iframe, содержавшим в диалоговом окне. iframe будет заполнен с содержанием от стороннего домена. Моя проблема - то, что я должен создать некоторый диалоговый уровень JavaScript, который может обнаружить, если содержание iframe загрузилось успешно и если это не имеет в 5 кадрах второго раза, затем чтобы закрыть диалоговое окно и возвратить пользователя родительской странице.
Я исследовал многочисленные решения, и только два имеют любую истинную ценность.
Это честно единственные опции, с которыми я должен работать? Разве нет ли более простого способа просто обнаружить это?
Я исследовал, если существует способ опросить относительно http ошибок ответа, но это все еще остается ограниченным теми же ограничениями.
Любая справка очень ценилась бы.
Спасибо
Самый простой способ (если вы можете получить код, добавленный на внешние сайты) - это добавить невидимый iframe, указывающий на специальный html-файл в вашем домене. Затем можно использовать parent.parent.foo()
для уведомления исходного окна о событии загрузки.
Прослушивание события "load" покажет вам только то, загружено ли окно, а не то, что было загружено или готов ли документ к взаимодействию.
В любом случае вам понадобится какое-то содействие со стороны сервера другого домена, поскольку вы пытаетесь злоупотребить политикой одинакового происхождения (SOP)
Первое решение document.domain=...
не будет работать, если домены разные. Оно работает только для поддоменов и портов, как описано в ссылке выше.
Единственный вариант, который позволяет осуществлять междоменную связь без опроса - это JSONP или инъекция скрипта с обратным вызовом функции JS. Этот метод доступен во всех API Google и хорошо работает.
Мы объяснили в нашем блоге способ "песочницы" этих вызовов в iframe для их защиты. Хотя postMessage
сейчас лучше, хак window.name имеет то преимущество, что работает на старых браузерах.
Как ни странно, SOP не мешает вам POST что-либо на другой домен. Но вы не сможете прочитать ответ.
У Николаса Закаса есть статья об обнаружении загрузки 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. "); });
Можно попробовать использовать postMessage для связи между фреймами.
Это потребует от удаленного сайта включения определенного JavaScript для отправки сообщения в родительский документ после завершения его загрузки.
Это можно сделать с помощью обработчика загрузки в самом iframe. К сожалению (сюрприз!) IE усложняет задачу. Единственный способ заставить это работать - это составить HTML для iframe, а затем добавить его в документ с помощью innerHTML
. Затем мне нужно провести опрос, чтобы узнать, когда iframe появляется в DOM, что зависит от того, загружается ли страница. Вот ссылка на источник: http://svn.openlaszlo.org/openlaszlo/trunk/lps/includes/source/iframemanager.js
См. create ()
, __finishCreate ()
и gotload ()
. Не стесняйтесь сделать копию и использовать ее сами!
С уважением, Макс Карлсон OpenLaszlo.org