Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получение Url страницы загруженной в iframe (https://javascript.ru/forum/misc/13669-poluchenie-url-stranicy-zagruzhennojj-v-iframe.html)

taraba4 08.12.2010 20:06

Получение Url страницы загруженной в iframe
 
Здравствуйте.

Вообщем в чем суть:
Есть хостинг, допустим http://site.ru (PHP, SQL и.т.д. не доступны, по сути там только html ну и js)

Есть домашний сервер с внешним ip, допустим 0.0.0.0

На хосте я подгружаю сайт расположенный на моем сервере через iframe
Вроде бы все супер, да вот при серфе по сайту url в строке адреса http://site.ru/ что логично.

Вот теперь я путем разных исхешрений пытаюсь решить данную проблему...
Задача как я понимаю не тривиальная и информации по теме немного. Поэтому решил спросить помощи.

Я представляю себе это так:
1. Страничкой на хосте, в которой загружен ifreme узнаем url который сейчас загружен внутри iframe.
2. меняем у пользователя в строке адрес.

я пока не нашел информации по тому как получить реальный урл подгружаемого в iframe сайта.

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

Вообщем прошу помощи, потому что задача действительно не тривиальная. Спасибо.

UnderShot 08.12.2010 20:58

Ошибка

taraba4 08.12.2010 21:01

Он и не будет меняться, так реализован iframe, что логично. Я ищу способы чтобы обойти это и выводить адрес.

x-yuri 08.12.2010 21:30

самый главный вопрос: зачем?

taraba4 08.12.2010 21:36

чтобы пользователю отображался адрес страницы на которой он сейчас находится...

Если это можно реализовать как нибудь по другому буду рад выслушать)

monolithed 08.12.2010 21:41

alert(window.location.href);

Kolyaj 08.12.2010 22:13

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

Цитата:

Сообщение от taraba4
чтобы пользователю отображался адрес страницы на которой он сейчас находится...

Так и пусть вводит этот адрес. Прослойка в виде ифрейма зачем?

taraba4 08.12.2010 23:59

На это есть несколько причин:
1. У моего сервера динамический внешний ip со всеми вытекающими последствиями.

2. Гораздо приятние, привычнее и удобнее залезать на сайт по адресу http://site.ru нежели http://0.0.0.0/

taraba4 09.12.2010 00:01

А можно по подробнее насчет всплывающего окна... немного читал о реализации моей задачи как раз этим путем... конкретно там ничего написано не было.

В частности интересует как это окно прятать от юзера... и как из него получить адрес?

Спасибо.

x-yuri 09.12.2010 03:03

какого всплывающего окна?

а почему нельзя выложить сайт на хостинге и не иметь проблем?

Kolyaj 09.12.2010 08:41

Цитата:

Сообщение от taraba4
1. У моего сервера динамический внешний ip со всеми вытекающими последствиями.

http://www.dyndns.com/

Цитата:

Сообщение от taraba4
2. Гораздо приятние, привычнее и удобнее залезать на сайт по адресу http://site.ru нежели http://0.0.0.0/

Именно поэтому придумали домены. Почему site.ru не может сразу на нужный ip-шник "глядеть"?

taraba4 09.12.2010 16:19

Хм... вот что интересно. Я попросил совета и четко описал задачу, а вы пытаетесь уйти от этого.

Я честно говоря человек не самый глупый... и все альтернативные варианты уже рассмотрел...

Почему не сунуть на хост?
Потому мой вариант абсолютно бесплатный, гибкий, быстрый и полностью меня устраивает.

ddns вещь конечно хорошая, но вот бесплатные домены у них убогие...

Kolyaj 09.12.2010 16:34

Цитата:

Сообщение от taraba4
Я попросил совета и четко описал задачу, а вы пытаетесь уйти от этого.

Цитата:

Сообщение от taraba4
Я честно говоря человек не самый глупый...


Цитата:

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум - из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится - тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите - лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ!!!
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю!!! А от вас нормального ответа недождёшся!!!
Прохожий: Самое крепкое дерево - дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно!!!
Ознакомиться со всем списком и найти себя.

x-yuri 09.12.2010 17:07

Цитата:

Сообщение от taraba4
Хм... вот что интересно. Я попросил совета и четко описал задачу, а вы пытаетесь уйти от этого.

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

Цитата:

Сообщение от taraba4
Я честно говоря человек не самый глупый... и все альтернативные варианты уже рассмотрел...

а если не все? В конце концов, может я для себя что-то новое узнаю...

Цитата:

Сообщение от taraba4
Почему не сунуть на хост?
Потому мой вариант абсолютно бесплатный, гибкий, быстрый и полностью меня устраивает.

разместить фрейм на хостинге - бесплатно, а сайт - платно? Это что, отображение сайта в iframe через баннерную сеть? :lol: Или может XSS?

taraba4 09.12.2010 23:33

Вообщем.
Я наверно был не прав когда написал про то что не самый глупый... извиняюсь.

Суть в чем, http://site.ru лежит на бесплатном хосте(нет почти ничего, html, js... вообщем нет языков обробатываемых сервером php в часности). http://0.0.0.0 - мой внешний ip, там полноценный веб сервер

Я гружу сайт из моего сервера в айфрейм на хосте...
но при серфе по сайту в браузере висит постоянный url http://site.ru/ Допустим юзер захотел скинуть ссылку на страницу другу... оп не вышло... (это я для примера)

Вот поэтому и заморачиваюсь...
А помимо бесплатности у меня уже спортивный интерес)))

Вообщем если я еще не вызвал у вас жесткой антипатии... то тема все еще актуальна...

Kolyaj 09.12.2010 23:39

site.ru это купленный домен или тоже бесплатный?

taraba4 09.12.2010 23:41

Пока занимался другим проектом в голову пришла идея...

Пусть страница что грузится в iframe узнает свой url (не особо разбераюсь в js, если выполнить
window.location.href
в нутри iframe какой адрес он возьмет тот что у таницы в iframe или что у верхней??) и записывает его в куки

Потом, верхняя страница, внутри которой лежит iframe забирает это значение... и записывает в переменную...

А вот сейчс самое интересное и на мой взгляд самое сложное: Как отправит заначение этой переменной в строку адреса браузера?

Хотел бы узнать насколько реально все то что я описал?
а также все еще жду ваших предложений... спасибо!)

taraba4 09.12.2010 23:43

site.ru - полностью бесплатен (и домен и хост), поэтому я не могу просто прописать ему адрес сервера

Kolyaj 09.12.2010 23:48

Цитата:

Сообщение от taraba4
в нутри iframe какой адрес он возьмет тот что у таницы в iframe или что у верхней??

Тот, что у iframe.

Цитата:

Сообщение от taraba4
и записывает его в куки

Куки у каждого домена свои.

Цитата:

Сообщение от taraba4
Как отправит заначение этой переменной в строку адреса браузера?

Перезагрузить страницу на другом адресе.

taraba4 09.12.2010 23:56

точно(( - это я про куки
Цитата:

Сообщение от Kolyaj (Сообщение 83111)
Куки у каждого домена свои.

Перегрузить страницу с другим адресом не вариант. тогда это ни чем не лучше банального редиректа...

Нужно чтобы она как бы изменяла адрес но не перегружало страницу.. о как... чет я чувствую что я приду к тому что мне ответят что такое сделать нельзя((

x-yuri 10.12.2010 11:53

Цитата:

Сообщение от Kolyaj
site.ru это купленный домен или тоже бесплатный?

а что, если купленный?

Цитата:

Сообщение от taraba4
Нужно чтобы она как бы изменяла адрес но не перегружало страницу.. о как... чет я чувствую что я приду к тому что мне ответят что такое сделать нельзя((

ну вообще да. Это крайне не выгодно производителям браузеров. Но отдельные личности были бы щастливы, ага... а без перезагрузки можно менять только хэш (то что после решетки в URL)

taraba4 10.12.2010 17:56

Цитата:

Сообщение от taraba4 (Сообщение 83110)
site.ru - полностью бесплатен (и домен и хост), поэтому я не могу просто прописать ему адрес сервера

Цитата:

Сообщение от x-yuri (Сообщение 83162)
а что, если купленный?

Не понял...

Цитата:

Сообщение от x-yuri (Сообщение 83162)
а без перезагрузки можно менять только хэш

А можно поподробнее, как это сделать?

Спасибо.

x-yuri 10.12.2010 19:20

Цитата:

Сообщение от taraba4
Не понял...

это был вопрос к Kolyaj

Цитата:

Сообщение от taraba4
А можно поподробнее, как это сделать?

видимо
location = 'https://mail.google.com/mail/?shva=1#inbox'

хотя может есть какие-то подводные камни, никогда не пробовал таким заниматься. Можешь в fullajax покопаться...

Kolyaj 10.12.2010 19:27

Цитата:

Сообщение от x-yuri
а что, если купленный?

Подразумевалось, имеется ли доступ к ns-записям.

Цитата:

Сообщение от taraba4
А можно поподробнее, как это сделать?

location.hash = '#newhash'

x-yuri 10.12.2010 20:03

Цитата:

Сообщение от Kolyaj
Подразумевалось, имеется ли доступ к ns-записям.

подразумевалось, что даст доступ к ns-записям?

Kolyaj 10.12.2010 20:19

Цитата:

Сообщение от x-yuri
подразумевалось, что даст доступ к ns-записям?

Мне? Мне не надо :)

taraba4 11.12.2010 02:19

ахаха))

Слушайте, а если сделать на странице которая грузится в iframe невидимы див, в который писать url страницы...

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

или джава получает элемент из скрипта, а не из сформированной страницы??

x-yuri 11.12.2010 09:18

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

taraba4 12.12.2010 02:01

Здравствуйте снова!)

Извините меня за откровенно говоря тупой вопрос... но почему-то никак не могу разобраться

Вот от сюда беру код:
http://javascript.ru/ajax/cross-orig...5:-postmessage

Меняю его под свои домены, все работает! я тут уже с радости чуть ли не до потолка, но...

Никак не могу сделать так, чтобы это все работало автоматически при загрузке страницы....

Собственно в примере когда тычешь на кнопку отправить во фрейм приходит переменная с сообщением... А мне нужно чтобы все это срабатывало во время загрузки страницы (а точнее даже до, но это то я найду как сделать)

Тоесть нужно заменить сообщение обычной переменной, а отправку сделать без нажатия кнопки ОТПРАВИТЬ....

зы: и используется html5, ну там в примерах написано...
Буду очень признателен!
С уважением.

Aetae 12.12.2010 03:51

Вообще проблема бредовая.)

Я так понял что нужна только возможность сохранения ссылки, в таком случае можно не парить мозг и сделать примерно так:

На http://site.ru:
<html>
<head>
	<style type="text/css">html,body,iframe{width:100%;height:100%;border:0;padding:0;margin:0;} html,body{overflow:hidden}</style>
</head>
<body>
	<script type="text/javascript">document.write('<iframe src="http://0.0.0.0'+location.hash.slice(1)+'"></iframe>')</script>
</body>
</html>


В head подгружаемого http://0.0.0.0:
<script type="text/javascript">window.onload=function(){top.location.hash=location.href.replace('http://site.ru','')}</script>

taraba4 12.12.2010 15:41

хм... к сожалению ничего не происходит((

Aetae 12.12.2010 16:38

Всё работает.
<html>
<head>
	<style type="text/css">html,body,iframe{width:100%;height:100%;border:0;padding:0;margin:0;} html,body{overflow:hidden}</style>
</head>
<body>
	<script type="text/javascript">document.write('<iframe src="http://ajitae.no-ip.org/show'+location.hash.slice(1)+'"></iframe>')</script>
</body>
</html>


По крайней мере в ff, мож и есть какие нюансы с браузерами, но лень смотреть.

taraba4 12.12.2010 17:12

Спасибо, сейчас тогда еще раз попробую протестить...

А не мог бы помочь разобраться с этим: http://javascript.ru/forum/83429-post29.html

taraba4 12.12.2010 17:20

Aetae,
Вообщем то да, работает только в ff((

dionis 12.12.2010 17:37

<html>
<script type="text/javascript">
    function MyIframeIsLoaded() {
        alert('is loaded');
    }
    function MyOnLoad() 
    {
        var frameRequest = document.getElementById("myIFrame");
        frameRequest.setAttribute("src", 'http://www.google.com');
    }
</script>
<body id="myBody" onload="MyOnLoad();">
    <iframe id="myIFrame" onload="MyIframeIsLoaded();">
    
    </iframe>
</body>
</html>


по поводу вашего вопроса, то как только загрузилась страница с другого домена, тут же закрывается весь доступ к этой странички через DOM (в целях безопасности), поэтому после загрузки странички страничка должна кинуть postMessage родительскому окну (в качестве параметра можете передать адрес странички), родительское окно должно подписаться на событие получения сообщений, получить это собщение и вывести его на странички. Как мне кажется лучшим вариантом будет менять хеш родительского окна (как и предложил Aetae, только менять хешь не непосредственно а через отправку сообщений) а при загрузке обрабатывать его и открывать соответственную страницу.
пример http://site.ru#mypage1, http://site.ru#mypag2 и тд.

taraba4 12.12.2010 18:18

dionis,
Вообщем то не совсем понял принцып работы, ну сейчас попробую разобраться...

Не могли бы вы все таки помочь вот с этим постом: http://javascript.ru/forum/83429-post29.html

dionis 12.12.2010 19:05

вобщем с тебя быть добрым и отзывчевым :)
код на сайте http://run.local/index.htm
<html>
<script type="text/javascript">
    PostAjax = {};

    PostAjax.receiveMessage = function (event) {
        window.location.hash = event.data;
    };

    PostAjax.AddEvent = function (obj, eventType, fn) {
        var that = this;
        var tempFunction = function (e) { fn.call(that, e); };
        if (obj.addEventListener) {
            obj.addEventListener(eventType, tempFunction, false);
            return true;
        } else if (obj.attachEvent) {
            var r = obj.attachEvent("on" + eventType, tempFunction);
            return r;
        } else {
            return false;
        }
    };

    PostAjax.AddEvent(window, 'message', PostAjax.receiveMessage);

    function MyOnLoad() {
        var frameRequest = document.getElementById("myIFrame");
        frameRequest.setAttribute("src","http://your.local" + window.location.hash.slice(1));
    }
</script>
<body id="myBody" onload="MyOnLoad();">
    <iframe id="myIFrame">
    </iframe>
</body>
</html>


код на сайте http://your.local/page1.htm
<script type='text/javascript'>
    var url = window.location.pathname;
    var parentUrl = "http://run.local";
    window.parent.postMessage(url, parentUrl);
</script>


запускаем: http://run.local/index.htm#/page1.htm

Aetae 12.12.2010 23:38

Цитата:

Сообщение от taraba4 (Сообщение 83498)
Aetae,
Вообщем то да, работает только в ff((

А если top сменить на parent?

taraba4 13.12.2010 04:21

dionis,
Огромное спасибо за ваш код! Он полностью работает в самых известных браузерах. Но он предназначен лишь для одной из функций. То есть теперь пользователь зная ссылку может зайти на определенную страницу моего удаленного сайта(и за это огромное спасибо!)

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

Я думал попробовать соединить ваш скрипт, со кодом Aetae, но проблема в том, что его метод работает лишь для браузера фаерфох...

Если нет способов изменить его скрипт так, чтобы он стал работать во всех браузерах, то единственный, по моему мнению, способ получить ссылки страницы груженной во фрем остается:
http://javascript.ru/forum/83429-post29.html
http://javascript.ru/ajax/cross-orig...5:-postmessage

Но так как мой js сейчас прямо скажем убог, возможно есть и другие способы!)
Спасибо всем кто помогает мне!)

dionis 13.12.2010 06:46

ну блин всё обьяснять приходится:)
код Aetae не подойдёт так как взаимодействовать между доменнами как в ту так и в другую сторону можно только через
postMessage.

а этот код конечно же нужно дабавить на ВСЕ страницы вашего сайта, ну либо в шаблон на сайте или как оно там называется в php.
этот код как раз и меняет хеш родительского сайта.
<script type='text/javascript'>
var url = window.location.pathname;
var parentUrl = "http://run.local";
window.parent.postMessage(url, parentUrl);
</script>

тоесть он должен быть на всех страницах
http://your.local/page1.htm
http://your.local/page2.htm
http://your.local/page3.htm
http://your.local/page4.htm
и тд.


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