Другой метод междоменной связи - это (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-запроса.
так:
- Отправка данных в iframe x (с использованием cookie или метода window.name)
- Поймать данные с помощью поллера в iframe x
- Выполнять ajax-запросы в iframe x.
- Отправка данных обратно в iframe y (с использованием cookie или метода window.name)
- Поймать данные с помощью опроса в iframe y
- Сделай хоккей-поки.
Любое обновление страницы (httprequest) или изменение URL обновит историю (кроме старых или всех версий IE), поэтому, увы, требуется больше кода.