Обнаружение загрузки контента между доменами iframe - PullRequest
16 голосов
/ 02 мая 2010

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

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

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

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

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

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

Спасибо

Ответы [ 5 ]

10 голосов
/ 03 мая 2010

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

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

3 голосов
/ 02 мая 2010

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

2 голосов
/ 02 мая 2010

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

1 голос
/ 31 июля 2010

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

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

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

0 голосов
/ 02 мая 2010

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

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

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

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

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

...