Междоменная связь изменения хеша - PullRequest
4 голосов
/ 08 ноября 2010

Пожалуйста, рассмотрите следующие два домена: domain1.com и domain2.

Из домена 1 я открываю iframe, который указывает на домен 2.

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

Таким образом, хеш в родительском окне (домен1) сработает, если домен2 вызовет parent.location с новым хешем.Кроме того, событие изменения хеша запускается в iframe, если I из родительского элемента изменяет свой атрибут src на новый хеш.

Это прекрасно работает!

Вот проблема:

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

Как я могу общаться с перекрестнымДомен iframe 2-way, не испортив объект истории?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 08 ноября 2010

Используйте easyXDM , это библиотека javascript, которая выполняет всю тяжелую работу за вас, позволяя вам выполнять междоменную связь и RPC во всех браузерах, включая IE6.

Это будетне используйте HashTransport ни для одного из текущих браузеров (даже для IE6), и поэтому не изменит историю.

Вы не найдете ничего лучше ..

Вы можете прочитать о некоторых изего внутренняя работа в этой статье Script Junkie , или перейдите прямо к readme на github

2 голосов
/ 08 ноября 2010

Другой метод междоменной связи - это (ab) использование window.name. Для этого требуется, чтобы изначально в iframe изначально был src с тем же доменом, после чего вы перемещаетесь в другой домен, который задает window.name, а затем возвращаетесь к исходному источнику (шаг назад в истории). Идея состоит в том, что window.name не изменяется, если он не установлен явно, это означает, что вы можете передавать window.name данные в междоменную область.

Этот метод более подробно описан на:
- http://skysanders.net/subtext/archive/2010/10/11/leveraging-window.name-transport-for-secure-and-efficient-cross-domain-communications.aspx
- http://jectbd.com/?p=611

Обязательно выберите реализацию, которая позволяет избежать щелчков в IE.

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

Использование JSON lib, например

// access window.name from parent frame
// note: only when iframe stepped back to same domain.
var data = JSON.parse( iframe.contentWindow.name );

// set child frame name
// note: only when iframe stepped back to same domain.
iframe.contentWindow.name = JSON.stringify( {
    foo : "bar"
} ); // to JSON string

// set own name ( child frame )
window.name = JSON.stringify( {
    foo : "bar"
} ); // to JSON string

Техника cookie также является жизнеспособной, для обеих методик вам необходимо выполнить ajax-запросы в целевом iframe, если вы хотите избежать изменений в истории, но все еще требует HTTP-запроса. так:

  1. Отправка данных в iframe x (с использованием cookie или метода window.name)
  2. Поймать данные с помощью поллера в iframe x
  3. Выполнять ajax-запросы в iframe x.
  4. Отправка данных обратно в iframe y (с использованием cookie или метода window.name)
  5. Поймать данные с помощью опроса в iframe y
  6. Сделай хоккей-поки.

Любое обновление страницы (httprequest) или изменение URL обновит историю (кроме старых или всех версий IE), поэтому, увы, требуется больше кода.

...