Обнаружение нагрузки на уровне домена iframe

У меня довольно интересная проблема. У меня есть родительская страница, которая создаст модальный диалог jquery с iframe, содержащимся в диалоговом окне. IFrame будет заполнен содержимым из стороннего домена. Моя проблема в том, что мне нужно создать javascript с диалогическим уровнем, который может определить, загружен ли контент iframe и если он не в течение 5 секунд, а затем закрыть диалоговое окно и вернуть пользователя на родительскую страницу.

Я исследовал множество решений, и только два имеют истинное значение.

  • Получить удаленный сайт для включения строки javascript document.domain = 'our-domain.com'.
  • Используйте взломанный фрагмент URL-адреса, но снова мне понадобится запрос, чтобы удаленный сайт может изменить URL-адрес, добавив "#some_value" в конец URL-адреса, и мое диалоговое окно должно было бы опросить URL-адрес, пока он не увидит его или не истечет.

Являются ли эти честные единственные варианты, с которыми мне приходится работать? Не проще ли это обнаружить?

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

Любая помощь будет очень оценена.

Спасибо

Ответ 1

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

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

Ответ 2

У Николаса Закаса есть статья об обнаружении загруженного 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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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