Междоменная связь iframe в Opera

Мне нужно общаться между двумя фреймами одного и того же домена, которые находятся внутри родительской страницы в другом домене, над которым я не контролирую.

Это приложение Facebook, и его базовый макет таков.

apps.facebook.com/myapp
L iframe1 (src='mysite.com/foo')
L iframe2 (src='mysite.com/bar')

Мне нужно, чтобы frame1 общался с frame2, но в Opera я не могу получить доступ к window.parent.frames['frame2'] для выполнения обычных междоменных методов (например, обновление location.hash)

Есть ли альтернативный способ сделать это в Opera?

заранее спасибо за помощь


person Community    schedule 12.02.2010    source источник


Ответы (3)


Пробовали ли вы использовать веб-сообщения HTML5. В настоящее время он довольно хорошо поддерживается последними версиями браузеров.

iframe.contentWindow.postMessage('Your message','http://mysite.com');

Для свойства postMessage потребуется источник http://mysite.com.

person karlcow    schedule 22.02.2012

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

Если родительский документ присвоил вашему фрейму, с которым нужно связаться, уникальный name, с ним возможна ограниченная форма связи, заставляя пользователя щелкнуть ссылку с href="otherurl#message" target="name", которая будет перемещаться по целевому фрейму, изменяя хэш без перезагрузка страницы, если URL-адрес точно совпадает. В Mozilla вы также можете сделать это с помощью form target, что позволит вам запрограммировать его отправку (поскольку щелчок по ссылке не может быть автоматизирован), но не в Opera. Вероятно, не так много пользы ... не знаю, дает ли FB вам цель кадра name в любом случае.

Вы можете создать канал связи между сценариями в одном домене с помощью файлов cookie (*): один сценарий записывает файл cookie сеанса, другой сценарий опрашивает изменения в document.cookie, чтобы найти в нем сообщения. Но это очень уродливо и требует некоторой раздражающей работы, чтобы контролировать, какие сообщения предназначены для кого, когда одновременно открыто несколько документов. И есть дополнительные ограничения для файлов cookie в сторонних фреймах (вам, вероятно, потребуется написать политику P3P, чтобы заставить IE сотрудничать).

(*: или, предположительно, веб-хранилище HTML5, если оно доступно.)

person bobince    schedule 12.02.2010
comment
@miketaylr: если вы не можете получить ссылку на другое окно, вы не можете отправить в него сообщение. - person bobince; 23.02.2012
comment
Вы можете получить ссылку на другое окно, используя window.parent.frames[0] и т. д. Затем вы можете использовать postMessage. - person webinista; 23.02.2012
comment
@webinsta: Вы не всегда можете, в этом весь смысл этого вопроса. - person bobince; 23.02.2012
comment
Я считаю, что этот вопрос касается ошибки в более ранней версии Opera. У Opera действительно была чрезмерно строгая политика безопасности при доступе к междоменному домену window.frames. Это должно быть решено в более поздних версиях. bobince, вы все еще видите эти проблемы? - person hallvors; 28.02.2012

Как уже говорили другие, используйте window.postMessage. Но вместо window.parent.frames['frame2'] попробуйте window.parent.frames[x], где x — это позиция в списке узлов другого iframe.

Вы можете увидеть пример того, как это делается для разных источников, здесь: http://webinista.s3.amazonaws.com/postmessage

person webinista    schedule 22.02.2012