Междоменная связь изменения хэша
Пожалуйста, рассмотрите следующие две области: domain1.com и домен2.
Из domain1 я открываю iframe, который указывает на domain2.
Теперь я хочу, чтобы эти ребята общались друг с другом, чего я успешно добился, применив прослушиватели событий изменения хэша в обоих доменах.
Таким образом, хэш в Родительском окне (domain1) будет срабатывать, если domain2 вызывает parent.место с новым хэшем. Кроме того, событие изменения хэша срабатывает в iframe, если я от родителя изменяет свой атрибут src на новый хэш.
Это прекрасно работает!
Вот в чем беда:
Обратная и прямая функциональность в браузере портится. Проще говоря, при создании двух экземпляров хэша, кнопка возврата браузера должна быть нажата дважды, чтобы заставить Родительский хэш измениться, так как он должен сначала пройти через хэш iframe.
Как я могу общаться с междоменным iframe 2-way, не испортив объект истории?
Спасибо!
2 ответа:
ИспользуйтеeasyXDM , это библиотека javascript, которая делает всю тяжелую работу за вас, позволяя вам выполнять междоменную коммуникацию и RPC во всех браузерах, включая IE6.
Это не будет использовать HashTransport для любого из текущих браузеров (даже IE6), и поэтому не изменит историю.
Вы не найдете ничего лучше..
Вы можете прочитать о некоторых его внутренних работах в этой статье Script Junkie , или перейти прямо к readme на github
Другой метод для междоменных коммуникаций - (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), поэтому требуется больше кода, увы.