Как упомянул Дэвид Дорвард , JSON-P - самый простой и быстрый; Тем не менее, есть еще одна хитрость, в частности, использование двух iframe.
Два обойти эту проблему без использования JSONP, вы можете сделать следующее. Этот метод предполагает, что у вас есть какой-то доступ для разработки к родительской странице.
На двух доменах / сайтах три страницы.
- Родительская страница
- Страница содержания
- Страница междоменной связи (он же "xdcomm")
Страницы родительской страницы и страницы xdcomm размещены в одном домене, страница содержимого - в любом другом домене. Страница содержимого встраивается в качестве iframe в родительскую страницу, а страница xdcomm встраивается в качестве скрытого iframe в страницу содержимого.
Страница xdcomm содержит очень простой сценарий, который определяет параметры GET в строке запроса, анализирует эту строку для переменных method
и args
(где args
- строка в кодировке JSON), а затем выполняет указанный метод с указанными аргументами на родительской странице. Примером может быть здесь (просмотреть исходный код).
Несмотря на то, что политика одинакового происхождения JavaScript ограничивает доступ кода одного домена к домену другого, не имеет значения, вложены ли домены друг в друга (домен A, вложен в домен B, вложен в домен A).
Итак, вкратце, страница содержимого отправляет сообщения на родительскую страницу через страницу xdcomm, изменяя источник iframe на что-то вроде http://domaina.com/xdcomm.html?src=foo&args=[1,2,3,4]
. Это было бы эквивалентно выполнению foo(1,2,3,4)
на родительской странице.
Кроме того, знайте, что уже есть библиотеки, которые помогают вам в этом, такие как easyxdm . То, что я объяснил здесь, является основой одного из методов, которые они используют, и, хотя это может быть не так уж и красиво, это, безусловно, полностью функциональная и легковесная реализация.