2010-05-02 2 views
14

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

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

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

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

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

Любая помощь была бы чрезвычайно оценена.

Благодаря

ответ

10

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

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

+0

Это звучит как определенный вариант. Я буду предлагать это разработчикам на их конце, чтобы посмотреть, рассмотрят ли они этот вариант. Спасибо! –

+2

+1 для предложения того, что я считаю, * единственным решением для моей конкретной проблемы! Благодарю. – Town

+0

Это работает блестяще, хотя и несколько неожиданно, пока вы не подумаете об этом. – Kaganar

2

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

+0

я мог, да, но это работает только в IE8. К сожалению, я должен был упомянуть, что эта функциональность должна работать для IE 6,7 и 8 согласно спецификациям нашего клиента. –

+0

[Бесстыдная реклама] Я сделал микро-фреймворк для облегчения этого, помогая вам не открывать ошибку безопасности на вашем сайте: https://github.com/Okrajs/Okrajs –

3

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

+0

Благодарим вас за фрагмент кода. Я попробую и посмотрю, как это работает. –

0

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

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

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

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

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

+1

Ну, я не пытаюсь «злоупотреблять» политикой SOP, но потребность в этом находится на критическом этапе активности пользователя. Да, мне нужно, чтобы это работало над вышеупомянутыми браузерами. Как ни странно, в настоящее время в их спецификации нет другого браузера. Все же! Пойду посмотрю на эту ссылку и благодарю вас за дополнительную информацию. –

1

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

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

С уважением, Макс Carlson OpenLaszlo.org

+1

Благодарим вас за возможное решение, Макс. Мой коллега и я решили попробовать использовать метод postMessage. Хотя это не работает для IE 6 и 7, мы обнаружили, что нам будет достаточно наших неотложных потребностей, если мы сможем заставить клиента согласиться на использование postMessage. Я с удовольствием рассмотрю ваше предложение, хотя у вас никогда не будет достаточного количества трюков в своем пресловутом рукаве. :) –

Смежные вопросы