Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Подскажите кто может !!!! Динамический кросс доменный iframe под IE6 (https://javascript.ru/forum/events/4418-podskazhite-kto-mozhet-dinamicheskijj-kross-domennyjj-iframe-pod-ie6.html)

dima911 20.07.2009 14:52

Подскажите кто может !!!! Динамический кросс доменный iframe под IE6
 
Помогите кто чем может :help: :help: .Пишу расширение под IE6 . Есть такой код. В IE 7 - 8 и в Firefox все работает отлично, за исключением IE 6 там кросс доменные фреймы запрещены политикой безопасности.
f (!window.parent.inject)
{
if(window == window.top)
{
if(document.body != null)
{
if (!document.location.host.match(/xxxxxx\.xxxxx\.ru$/))
{
var my_div = document.body.firstChild;
htmlend = document.createElement("div");
htmlend.innerHTML ="<iframe src='http://xxxxxxxxx.ru/index.html' id='frId' name='inject' frameborder='no' width='100%' height='100' scrolling='no'></iframe>";
document.body.insertBefore(htmlend, my_div);

}
}
}
}
Решение должно существовать информации мало о подобных эксперементов некоторые говорят что можно у фрейма поменять свойство document.domain или loactionю Но у меня так и не получилось. Пишет "Разрешение отклонено"

B~Vladi 20.07.2009 15:04

Цитата:

Сообщение от dima911
у фрейма поменять свойство document.domain или loaction

Удаляйте ваш айфрейм и создавайте новый.

dima911 20.07.2009 15:18

По подробней? iframe создается динамически когда открывается страница в браузере.

B~Vladi 21.07.2009 10:08

Цитата:

Сообщение от dima911
По подробней?

После того, как вы создали динамический айфрейм, поменять ему src не получится (по крайней мере я не смог). Поэтому вам нужно удалить (removeChild) или заменить (replaseChild) его на новый с новым src.

dima911 21.07.2009 10:20

Цитата:

Сообщение от B~Vladi (Сообщение 24885)
После того, как вы создали динамический айфрейм, поменять ему src не получится (по крайней мере я не смог). Поэтому вам нужно удалить (removeChild) или заменить (replaseChild) его на новый с новым src.

Можите продемонстрировать пример кода? Просто пока не представляю как это будет выглядеть ... Если будет новый src то соответственно и новое содержимое фрейма будет?
Встречал идею прописать document.domain на удаленном хосте и на родительском, тогда вроде кросс доменность прокатывает но пока не реализовал..

B~Vladi 21.07.2009 10:29

Цитата:

Сообщение от dima911
Можите продемонстрировать пример кода?

Могу, когда пойму что вам надо.
Цитата:

Сообщение от dima911
Если будет новый src то соответственно и новое содержимое фрейма будет?

Естессно, а вам не это разве надо?!
Цитата:

Сообщение от dima911
Встречал идею прописать document.domain на удаленном хосте и на родительском, тогда вроде кросс доменность прокатывает но пока не реализовал..

Сам не заморачивался, сказать не могу, но что-то такое слышал.... Нада гуглить.

dima911 21.07.2009 16:46

Цитата:

Сообщение от B~Vladi (Сообщение 24890)
Могу, когда пойму что вам надо.

Естессно, а вам не это разве надо?!

Сам не заморачивался, сказать не могу, но что-то такое слышал.... Нада гуглить.

Идея проста! javascript встраивается в ie в виде расширения, когда отрывается страница в ie создается iframe в который грузится документ.

B~Vladi 21.07.2009 16:50

Цитата:

Сообщение от dima911
Идея проста! javascript встраивается в ie в виде расширения, когда отрывается страница в ie создается iframe в который грузится документ.

Аха, это понятно. Значт нужен функционал, который менял бы адрес фрейма из родительского окна?! Если так, то вам нужно делать так, как предложил я.

ЗЫ: Не вкладки, случайно, для ие6 прикручиваете?!:)

dima911 21.07.2009 16:54

Цитата:

Сообщение от B~Vladi (Сообщение 24936)
Аха, это понятно. Значт нужен функционал, который менял бы адрес фрейма из родительского окна?! Если так, то вам нужно делать так, как предложил я.

ЗЫ: Не вкладки, случайно, для ие6 прикручиваете?!:)

Не делаю расширение для гугла- SEOшное

B~Vladi 21.07.2009 16:58

Цитата:

Сообщение от dima911
Не делаю расширение для гугла- SEOшное

аха. Ну вот. Создаёте фрейм значт:
var iframe=document.createElement('iframe');
iframe.src='domain.com';
// Далее остальные свойства, если надо...
document.appendChild(iframe);

Ну вот... а если надо сменить url фрейма:
//создаём новый фрейм newFrame со своим src
document.removeChild(iframe, newFrame);

Думаю, алгоритм понятен:)

dima911 21.07.2009 17:07

Цитата:

Сообщение от B~Vladi (Сообщение 24940)
аха. Ну вот. Создаёте фрейм значт:
var iframe=document.createElement('iframe');
iframe.src='domain.com';
// Далее остальные свойства, если надо...
document.appendChild(iframe);

Ну вот... а если надо сменить url фрейма:
//создаём новый фрейм newFrame со своим src
document.removeChild(iframe, newFrame);

Думаю, алгоритм понятен:)

Все равно не понимаю...... что нам ето дает? Удалим мы iframe и заменем его нвым фреймом в который так же будет грузится документ domen.com, опять получается кросс доменный обмен .... который запрещен в ie

B~Vladi 21.07.2009 17:37

Цитата:

Сообщение от dima911
в который так же будет грузится документ domen.com

Читай внимательнее
Цитата:

Сообщение от dima911
//создаём новый фрейм newFrame со своим src


dima911 21.07.2009 17:40

Цитата:

Сообщение от B~Vladi (Сообщение 24943)
Читай внимательнее

Это я понимаю что создается новый фрейм со своим src, только src опять будет на domain.com

B~Vladi 21.07.2009 17:49

Цитата:

Сообщение от dima911
Это я понимаю что создается новый фрейм со своим src, только src опять будет на domain.com

мда... src будет таким, каким установишь его ты сам, понимаешь?! Вот смотри. Есть у тебя iframe на yandex.ru. Например, ты хочешь програмно сменить домен yandex.ru на google.com. Сделать это через iframe.domain у тебя не получится, зато получится создать другой фрейм с src='google.com';. Ты можешь хоть 30 фреймов создать на одной странице, у которых будут разные домены!... Дошло?!

dima911 21.07.2009 17:58

Цитата:

Сообщение от B~Vladi (Сообщение 24945)
мда... src будет таким, каким установишь его ты сам, понимаешь?! Вот смотри. Есть у тебя iframe на yandex.ru. Например, ты хочешь програмно сменить домен yandex.ru на google.com. Сделать это через iframe.domain у тебя не получится, зато получится создать другой фрейм с src='google.com';. Ты можешь хоть 30 фреймов создать на одной странице, у которых будут разные домены!... Дошло?!

Можешь мне в асю стукнуть 423360519 , почемуто твоя аська не находится?

Kolyaj 21.07.2009 17:58

B~Vladi,
доступ к содержимому он хочет получить.

B~Vladi 21.07.2009 18:01

Цитата:

Сообщение от Kolyaj
доступ к содержимому он хочет получить.

:blink: Правда?! Толи лыжи толи я...

HelpeR 21.07.2009 21:27

Цитата:

Сообщение от B~Vladi (Сообщение 24953)
:blink: Правда?! Толи лыжи толи я...

Да нет, ему нужно каждый раз загружать новый фрейм, ты правильно понял. Ему следует собрать в массив все домены, которые он хочет загрузить и прокручивать их поочередности, но никакого доступа он к ним никогда не получит! Проверенно на практике!
var domains = ['yande.com','google.com','mail.ru'];

mrGreed 15.09.2011 05:03

Цитата:

Сообщение от HelpeR (Сообщение 24985)
Да нет, ему нужно каждый раз загружать новый фрейм, ты правильно понял. Ему следует собрать в массив все домены, которые он хочет загрузить и прокручивать их поочередности, но никакого доступа он к ним никогда не получит! Проверенно на практике!
var domains = ['yande.com','google.com','mail.ru'];

то есть на данный момент кроссдоменные запросы, с получением данных возможны только через <script ..> ?

melky 15.09.2011 08:56

и ajax, если ты контролируешь ответ сервера

B~Vladi 15.09.2011 10:44

postMessage

da_ff 15.09.2011 14:55

postMessage отсутсвует в ie6.

B~Vladi 15.09.2011 15:01

Зато присутствует window.opener.

da_ff 15.09.2011 15:02

Цитата:

Зато присутствует window.opener.
Как этим можно эмулировать postMessage?

B~Vladi 15.09.2011 15:19

Цитата:

Сообщение от da_ff
Как этим можно эмулировать postMessage?

Например, так.
Но суть в том, что родительский фрейм может менять это свойство у другого фрейма, даже если последний загружен с другого домена. Соответственно, фрейм может читать свойство своего окна.

В комментариях к приведённому коду говорится о проблемах безопасности, поэтому значением opener является объект VBScript, который из JS изменять нельзя (несоответствие типов).

Пример простейшей реализации такого объекта:
window.someNS.onMessage = function(){}; // Listener
				window.execScript(
					'Private onMessage\n' +
					'Class PostMsg\n' +
						'Public Sub postMessage(data, domain)\n' +
							'Call onMessage(data, domain)\n' +
						'End Sub\n' +
					'End Class\n' +

					'Set onMessage = window.someNS.onMessage\n' +
					'Set window.someNS.onMessage = New PostMsg'
				, 'vbscript');

				var IEWindowOpener = window.someNS.onMessage; // Присваевается для contentWindow.opener
				delete win.someNS.onMessage;

Во фрейме:
(window.opener || window.top).postMessage(msg, '*')


UPD: первый код только для IE, конечно же. Сперва стоит проверять поддержку postMessage через вызов соответствующего события.

da_ff 15.09.2011 15:52

B~Vladi,
Интересно, не встречался прежде с этой библиотекой, спасибо.


Часовой пояс GMT +3, время: 03:37.