Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Тег object - как получить его document (https://javascript.ru/forum/events/28982-teg-object-kak-poluchit-ego-document.html)

neon121 09.06.2012 18:50

Тег object - как получить его document
 
Здравствуйте
Суть задачи в следующем. Есть тег object, в него подгружается веб страница. Необходимо:
1. Из главного документа суметь обратиться к документу, который подгружается в object
2. И обратное - из документа, подгруженного в object, обратиться к документу-родителю

Есть какие-нибудь идеи?

Deff 09.06.2012 19:16

Цитата:

Сообщение от neon121
Из главного документа суметь обратиться к документу, который подгружается в object

1. Документ в object с того же домена ?
2. Вы можете в исходный текст данного дока сунуть свой скрипт на сервере ?

neon121 10.06.2012 20:04

1. Нет
2. Скорее нет. Предполагается, что объект будет использоваться для раздачи контента с центрального сайта на другие (примерно как встраивание роликов Ютуб). Но, теоретически, я могу добавить в генерируемый для вставки код ссылки и скрипт, в виде исходника либо ссылки. А что нам это дает?

Deff 10.06.2012 20:26

neon121,
Гы ... ток -что обсуждал это

А скрипты свои туда пихать можно ? по типу <script type="text/javascript" src="ссылка"></script>
тогда может быть возможно решить задачку

neon121 10.06.2012 21:09

Предположим, что да, можно. То есть, можно генерировать html вида
<object data="адрес_странички_которую_встраиваем"></object>
<script src="http://сайт.ру/крутой_скрипт.js"></script>


Что это нам даст? Ссылку на обсуждение можно, кстати?

devote 10.06.2012 21:13

Цитата:

Сообщение от neon121
Что это нам даст? Ссылку на обсуждение можно, кстати?

вы не поняли тег script нужно засунуть внутрь сайта "адрес_странички_которую_вс траиваем" а не положить рядом с тегом object

Если этого сделать нельзя, тогда вы не сможете получить его document

Deff 10.06.2012 21:18

Цитата:

Сообщение от neon121
Предположим, что да, можно.
<object data="адрес_странички_которую _встраиваем">
</object><script src="http://сайт.ру/крутой_скрипт.js"></script>

neon121,
Нет - не так - непосредственно на страницу, которую запрашиваем в объекте, т.е скрипт должен лежать внутри контента встраеваемой в object страницы, если нет, то доступ возможен только через собственный прокси

neon121 11.06.2012 15:24

А, тогда вообще никаких проблем, содержимым того документа, который внутри object, я руковожу как хочу

Deff 11.06.2012 16:18

neon121,
Должно быть два скрипта по идее - т.е внутри объекта (Скрипт передатчик)
И второй - скрипт приёмника - на текущей странице..

neon121 11.06.2012 16:39

Deff,
Ок, допустим, удалось сделать оба. Содержимым обоих скриптов я руковожу в полной мере. А дальше что? Я ведь именно принцип не могу найти

Deff 11.06.2012 16:54

neon121,
Принцип примерно
1. Делаем IFRAME ( не object) посколь object требует отдельного тестирования не иследовался
2. Скриптом в IFRAME записываем Данные в window.name и переадресуем IFRAME на адрес текущей страницы родителя
3. Скрипт IFRAME с Родительским адресом считывает данные из window.name IFRAME и отдает их родителю
4. Затем этот же скрипт может снова перезаписать свои данные в window.name IFRAME и отдать эти данные, сменив адрес в IFRAME на исходный

devote 11.06.2012 16:58

Deff,
для новых браузеров можно использовать postMessage а для старых да можно юзать window.name

Deff 11.06.2012 17:06

devote,
Лучше делать идентично - смысл в альтернативе ?
после первичной загрузки - и click-klask по History - где за раз можно до 2-х мегов передать через window.name - смысла в альтернативах имхо -нет

И можно реализовать связь не с одним кроссдоменом -а с 10 этим жа одним IFRAME

devote 11.06.2012 17:09

Цитата:

Сообщение от Deff
Лучше делать идентично - смысл в альтернативе ?

смысл в том что postMessage официальное нововведение, которое не вижу смысла не юзать.

Deff 11.06.2012 17:10

devote,
А ограничение по объему есть ? Одна из востребованных задач - передача файлов

devote 11.06.2012 17:12

Цитата:

Сообщение от Deff
devote,
А ограничение по объему есть ?

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

Deff 11.06.2012 17:22

Цитата:

Сообщение от devote
смысл в том что postMessage официальное нововведение, которое не вижу смысла не юзать.

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

devote 11.06.2012 17:50

Цитата:

Сообщение от Deff
актуально когда нет доступа к страницам второго ресурса. Есть идея как цеплять кроссбраузерно- кроссдоменно облачное хранилище яндекса на форум или сайт

для этих целей и window.name не поможет.

А пользоваться postMessage совсем не сложно, на основной странице пишем:
<iframe id="iframe" src="http://somesite.com/"></iframe>
<script type="text/javascript">
    var iframe = document.getElementById( 'iframe' );
    iframe.onload = function() {
        // отправляем сообщение удаленному сайту загруженному в iframe
        iframe.contentWindow.postMessage( "test", "*" ); // отправим test
    }

    window.addEventListener( "message", function( event ) {
        // тут получаем сообщение от удаленного сайта
        alert( event.data );
    }, false);
</script>
на удаленном сайте http://somesite.com/ пишем примерно туже байду:
<script type="text/javascript">
window.addEventListener("message", function( event ) {
    event.source.postMessage( "Привет, ты мне отправил: " + event.data, event.origin );
}, false);
</script>
как видишь ничего сложного, это простой вариант

Deff 11.06.2012 17:55

Цитата:

Сообщение от devote
А пользоваться postMessage совсем не сложно, на основной странице пишем:

СПС
:yes: Cижу в кроссдоменных запросах уже более полгода .. У нас сервис бесплатных форумов без доступа к движку, вдобавок и аякс был кривой до нового года, так что пришлось и так и эдак и еще как.. Делал и postMessage - много народу и с ИЕ и с кривыми браузами со всякими плагинами запрещающих обмен(Причём юзер об них не знает

neon121 11.06.2012 17:55

Как это провернуть с Iframe я знаю, но нужно именно с Object...

devote 11.06.2012 17:57

Цитата:

Сообщение от neon121
Как это провернуть с Iframe я знаю, но нужно именно с Object...

а по какой причине выбран именно <object> ??

devote 11.06.2012 17:58

и да вы не поверите, но оно работает и с тегом object, я только что проверил.
просто заменил:
<iframe id="iframe" src="http://somesite.com/"></iframe>
на это:
<object id="iframe" data="http://somesite.com/"></object>
и все так же работает

devote 11.06.2012 18:09

neon121,
так что юзайте postMessage и не парьтесь, единственное тока не будет это работать в ИЕ7 и ниже, остальные все поддерживают его.

neon121 11.06.2012 18:34

У меня это не заработало, тем не менее. Chrome считает, что у object нет параметра contentWindow
Проверял ПОСЛЕ загрузки обоих документов, если что

Deff 11.06.2012 18:43

neon121,
а свойство window.name - видит ? у object в Хроме ?

*Ксать тоже интригует необходимость использования тега <object>

neon121 11.06.2012 18:44

Вот Firefox, например, с ним не согласен, конечно. Но проблемы это не отменяет. Есть какое-нибудь свойство у Chrome, заменяющее contentWindow?

neon121 11.06.2012 18:45

Deff,
object.window.name , я правильно понял? Если да, то нет, не видит даже window у object

Deff 11.06.2012 18:46

Цитата:

Сообщение от neon121
object.window.name , я правильно понял? Если да, то нет, не видит даже window у object

Неть - просто window.name, такой скрипт
<script>
window.name="Test *"
alert(window.name)
</script>

neon121 11.06.2012 18:52

Deff,
Это работает, да

Deff 11.06.2012 18:57

neon121,
ну теперь осталось ток пробывать сменить адрес
в object типо

window.location='http://javascript.ru/forum/search.php?searchid=1128048';

neon121 11.06.2012 19:02

Deff,
То есть, при каждом моменте, когда нужно из object обратиться к родителю, перегружать его содержимое? Это ж тогда сколько трафика уйдет
Но, в любом случае, не подходит, потому что по условиям задачи документ в object не знает URL родителя

devote 11.06.2012 19:16

neon121,
дык может все же откроете секрет того какова причина юзать именно тег OBJECT ?

Deff 11.06.2012 19:27

Цитата:

Сообщение от neon121
Но, в любом случае, не подходит, потому что по условиям задачи документ в object не знает URL родителя

Загружайте в обjekt Первым страницу родителя - она и передаёт адрес в window.name и выставляет последующую загрузку Вашего адреса
Цитата:

Сообщение от neon121
То есть, при каждом моменте, когда нужно из object обратиться к родителю, перегружать его содержимое? Это ж тогда сколько трафика уйдет

Не юзал в object , но в iframe - достаточно однократной загрузки каждого адреса

Deff 11.06.2012 19:28

Цитата:

Сообщение от devote
дык может все же откроете секрет того какова причина юзать именно тег OBJECT ?

Тож заинтересовало

neon121 11.06.2012 19:39

devote,
Требование заказчика
Deff,
Что ж, спасибо за разъяснение, завтра вероятно попробую протестировать такое решение

neon121 11.06.2012 19:48

Поясню. Требование заказчика связано с тем, что, по некоторым данным, object выгоднее для SEO, чем iframe

devote 11.06.2012 19:57

Цитата:

Сообщение от neon121
Поясню. Требование заказчика связано с тем, что, по некоторым данным, object выгоднее для SEO, чем iframe

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

Странные СЕО'шники посылать таких надо, а проще вообще сказать что через object не возможно сделать того чего они хотят. Как говорится извините но не мы браузеры пишем под сайты а сайты пишут под браузеры. И сделать того чего браузер запрещает можно лишь костылями (либо вообще никак), которые никому не выгодно из-за нагрузки/багов/нестабильности. IFRAME роботами нормально индексируется, да конечно не одним махом, но со временем и он попадает в поисковый запрос.

Но дело конечно ваше, вам мучатся с костылями. ИМХО


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