Как связаться между кадрами?

Я поддерживаю приложение, которое идет вид подобных это:

Существует Страница A с Кадром, который показывает Страницу B. Страница B Now является частью совершенно другого продукта в отдельном домене.

Теперь, они хотят это, когда опция в B нажата, страница WHOLE перенаправляется к другой странице в A. Проблема состоит в том, что URL A - что-то как www.client.A.com/Order/Details/123, и то, когда мы нажимаем в быть этим, должно перенаправить к чему-то как www.client.A.com/Order/Edit/123 но B ничего не знает о A. Это не знает, какой порядок # в настоящее время выбирается или что-либо о A. Страница A, у кого есть кадр B, действительно знает это.

На данный момент мое решение состояло в том, чтобы просто перенаправить к AllOrders так что-то как клиент. MyCompany/Orders

но так как B не знает который client называет его (многопользовательское приложение), я добавлю его в webconfig. (таким образом, у каждого клиента есть его собственный webconfig с различным значением).

Я не нахожу это решение оптимальным, но я не могу думать ни о чем больше! Я уже попытался поместить необходимый URL в страницу A в скрытом Отделении (так как A действительно знает всю информацию), и затем пытающийся считать целый DOM страницы от B для нахождения его...., к сожалению, я могу только заставить доступ Структурировать DOM B... (Я попробовал jQuery).

Я знаю, что кадры являются злыми, но это - то, как это записано... какие-либо идеи?

Спасибо!

17
задан Francisco Noriega 11 June 2014 в 17:30
поделиться

3 ответа

Если родительская страница A и страница iframe B находятся в разных доменах, вы не сможете получить доступ к методам или полям через родительское свойство B. скрипт в A сможет проникнуть в контент B, и вы не сможете совместно использовать глобальные переменные между A и B.Эта граница, расположенная между страницей A и страницей B, является ключевой частью модели безопасности браузера. Это то, что мешает evil.com обернуть вашу веб-страницу онлайн-банка и украсть информацию о вашей учетной записи, просто прочитав внутренние переменные javascript веб-страницы банка.

Если вы можете позволить себе роскошь требовать браузеров последнего поколения, вы можете использовать технику пост-сообщений, упомянутую в одном из других ответов здесь. Если вам нужна поддержка старых браузеров, вы можете передавать небольшие объемы информации с помощью междоменных клиентских сценариев в браузере. Одним из примеров этого является использование окон iframe для передачи информации между внешней страницей A и внутренней страницей B. Это непросто и требует много шагов, но это можно сделать. Некоторое время назад я написал статью по этому поводу.

Вы не сможете отслеживать клики в iframe B с родительской страницы A. Это нарушение политик безопасности браузера на нескольких уровнях. (Например, захват кликов). Вы не сможете увидеть, когда изменится URL-адрес B - A может записать в свойство iframe.src, чтобы изменить URL-адрес, но как только iframe.src указывает на другой домен, чем домен A, A больше не может читать свойство iframe.src.

Если A и B находятся в разных поддоменах одного корневого домена, у вас может быть возможность «понизить» домен до общего корня. Например, если внешняя страница A размещена в субдомене A.foo.bar.com, а B - в субдомене foo.bar.com, то вы можете понизить домен на странице A до foo.bar.com (назначив window.domain = "foo.bar.com" в скрипте A).Страница A затем будет вести себя как одноранговый узел страницы B, и они могут получить доступ к данным друг друга по мере необходимости, даже если технически A обслуживается из другого домена, чем B. Я написал статью о понижении домена , тоже.

Понижение уровня домена может только отслаивать самые внутренние поддомены для работы в контексте корневого домена. Вы не можете изменить A.foo.bar.com на abc.com.

Существует также небольшой риск понижения уровня доменов до общего корневого домена. Когда вы управляете своей страницей в ее собственном субдомене, ваш HTML и скрипт отделяются от других субдоменов за пределами общего корневого домена. Если сервер в одном из других поддоменов скомпрометирован, это не повлияет на вашу html-страницу.

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

25
ответ дан 30 November 2019 в 12:07
поделиться

в случае, если страница и фрейм находятся в разных доменах, вам придется использовать postmessage в качестве политики того же домена запрещает нормальную связь javascript между страницами / фреймами разных доменов из-за проблем безопасности.

postmessage является частью html5 и работает во всех современных браузерах (включая IE8) . если вам нужна поддержка старых браузеров (в частности, IE6 / 7), вы можете использовать плагин jQuery postmessage (который прозрачно возвращается к некоторым красивым хитростям с хэш-тегами для старых браузеров).

и в качестве примечания: не уверен, что фреймы являются злом, с ними связаны некоторые проблемы (юзабилити, SEO, ...), но я провел небольшое исследование и большинство из них можно решить думаю.

7
ответ дан 30 November 2019 в 12:07
поделиться

Если вы хотите общаться между фреймами в javascript, вы можете использовать 'parent':

Если фрейм A имеет значение переменной, например:

var orderNo = 2;

Для фрейма B, чтобы прочитать его, он будет ссылаться на

var frameA_orderNo = parent.frames[0].orderNo;

(предполагая, что фрейм A - первый объявленный фрейм)

Таким образом, вы можете установить глобальные переменные в каждом фрейме, которые другой фрейм может прочитать, и поэтому вы можете получить порядок # в старомодном javascript (никогда не пробовал это в jquery).

Ничего себе фреймы - никогда не думал, что буду думать о них снова.

2
ответ дан 30 November 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: