Подтвердить что ты не робот

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

Я поддерживаю приложение, которое выглядит примерно так:

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

Теперь они хотят, чтобы при выборе опции в 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, что-то вроде client.MyCompany/Orders

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

Вы не сможете отслеживать клики в B iframe с родительской страницы A. Это нарушение правил безопасности браузера на нескольких уровнях. (Нажмите захват для одного). Вы не сможете увидеть, когда изменяется B-URL. 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" в script). Затем страница A будет вести себя как одноранговый узел страницы B, и тогда они могут получить доступ к другим данным по мере необходимости, даже если A технически обслуживается из другого домена, чем B. Я написал статью о опускание домена.

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

var orderNo = 2;

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

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

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

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

Wow frames - никогда не думал, что я снова о них подумаю.