Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Доступ к контенту внутри iframe из родительского документа (https://javascript.ru/forum/misc/39829-dostup-k-kontentu-vnutri-iframe-iz-roditelskogo-dokumenta.html)

hrundel 13.07.2013 19:51

Доступ к контенту внутри iframe из родительского документа
 
Есть страница со встроенным тегом <iframe>. И страница и подгружаемый контент находятся на одном домене. Использую способ взятый отсюда: http://learn.javascript.ru/iframes

<iframe src="javascript:'тест'" style="height:60px"></iframe>
<script>
  var iframe = document.getElementsByTagName('iframe')[0];
  var iframeDoc = iframe.contentWindow.document;
  iframeDoc.body.style.backgroundColor = 'green';
</script>


Но не получается изменить фон бэкграунда внутри ифрейма. Вот ссылка на наглядный пример: http://www.*****.ru/frame/html.html. Что не так у меня сделано?

danik.js 13.07.2013 21:03

Цитата:

Сообщение от hrundel
Что не так у меня сделано?

А тебе вот это вообще ни о чем не говорит, не?
Цитата:

Object not found!

The requested URL was not found on this server. The link on the referring page seems to be wrong or outdated. Please inform the author of that page about the error.

If you think this is a server error, please contact the webmaster.

Error 404

localhost
07/14/13 03:02:18
Apache

Deff 13.07.2013 21:11

<!DOCTYPE>
<html>
<body>
<div class="with-frame">
	<iframe src="/frame/inside.html" id="myiframe"></iframe>
</div>

<script type="text/javascript">
  var iframe = document.getElementsByTagName('iframe')[0];
  var iframeDoc = iframe.contentWindow.document;
  iframe.onload = function(){iframeDoc.body.style.backgroundColor = 'green'};
</script>


</body>
</html>

Без загрузки фрейма - нет доступа к окну

ruslan_mart 14.07.2013 04:13

Можно просто
body.bgColor = 'green'

hrundel 14.07.2013 09:06

Цитата:

Сообщение от danik.js (Сообщение 262133)
А тебе вот это вообще ни о чем не говорит, не?

Не говорит. Откуда вы взяли это сообщение?

Мне Firebug в Chrome и FF не сообщает ничего подобного. Хотя FF сообщает нечто странное (в консоли сообщает): синтаксическая ошибка на строке 1 в файле html.html.

Какими средствами отладки вы пользуетесь?

hrundel 14.07.2013 09:17

Цитата:

Сообщение от danik.js (Сообщение 262133)
А тебе вот это вообще ни о чем не говорит, не?

Цитата:

Сообщение от Deff (Сообщение 262134)
<!DOCTYPE>
<html>
<body>
<div class="with-frame">
	<iframe src="/frame/inside.html" id="myiframe"></iframe>
</div>

<script type="text/javascript">
  var iframe = document.getElementsByTagName('iframe')[0];
  var iframeDoc = iframe.contentWindow.document;
  iframe.onload = function(){iframeDoc.body.style.backgroundColor = 'green'};
</script>


</body>
</html>

Без загрузки фрейма - нет доступа к окну

Вы хотите сказать, что js-код выполняется раньше, чем во фрейм загружается новый документ?

hrundel 14.07.2013 09:21

Уже исправил, у меня там localhost был. Теперь ссылка нормальная, но все равно цвет фон меняется всеволишь на пол секунды, почему-то, а потом снова становится белым.
Есть ли способ без всяких jquery отсрочить выполнение сценария до того, как все фреймы будут загружены?

danik.js 14.07.2013 10:38

Цитата:

Сообщение от hrundel
Есть ли способ без всяких jquery отсрочить выполнение сценария до того, как все фреймы будут загружены?

Тебе же Deff показал как такое сделать.
Ruslan_xDD, не учи плохому. Если что-то как-то работает, то это не значит что так и нужно делать.

hrundel 14.07.2013 15:10

<script type="text/javascript">
	var iframe = document.getElementsByTagName('iframe')[0];
	var iframeDoc = iframe.contentWindow.document;
	iframe.onload = function(){iframeDoc.body.style.backgroundColor = 'green'};

	</script>

Вот мой код, который вставлен после закрывающего тега <html>. Можете посмотреть на том же самом наглядном примере http://www.*****.ru/frame/html.html, что ничего не работает.

рони 14.07.2013 15:19

hrundel,
попробуйте contentDocument вместо contentWindow

ruslan_mart 14.07.2013 15:24

Цитата:

Сообщение от danik.js
Ruslan_xDD, не учи плохому. Если что-то как-то работает, то это не значит что так и нужно делать.

И чем плох такой вариант? :)

danik.js 14.07.2013 15:25

Странная фигня. На момент навешивания onload iframe.contentDocument имеет readyState = 'complete' но при этом location.href = 'about:blank'
хз, фреймы - гавно. нафиг они тебе вобще вперлись?

danik.js 14.07.2013 15:26

Цитата:

Сообщение от Ruslan_xDD
И чем плох такой вариант?

Сегодня работает - завтра нет. Че ты из себя дурачка то изображаешь.

ruslan_mart 14.07.2013 15:35

danik.js, по моему ты из-за себя дурака изображаешь ;) Всё везде прекрасно работает.

рони 14.07.2013 15:42

:write:
Цитата:

Атрибут bgcolor является устаревшим, но все еще поддерживается во всех ведущих браузерах

hrundel 14.07.2013 16:04

Цитата:

Сообщение от рони (Сообщение 262230)
hrundel,
попробуйте contentDocument вместо contentWindow

Не вышло, смотрите второй вариант:
http://www.******.ru/frame2/html.html

ruslan_mart 14.07.2013 16:16

(function()
{
   var a = document.getElementById('myiframe');
   a.onload = function()
   {
       a = a.contentWindow || a.contentDocument;
       a.document.body.bgColor = 'green';
   }
})();


Или вообще так:
document.getElementById('myiframe').onload = function()
{
   var a = this.contentWindow || this.contentDocument;
   a.document.body.bgColor = 'yellow';
}


Оба варианта работают, проверял в опере и хроме.

рони 14.07.2013 16:21

hrundel,
метод bes a)))

hrundel 14.07.2013 19:17

Ruslan_xDD,
Спасибо. Оба твоих варианта работают.

Deff 15.07.2013 05:49

Цитата:

Сообщение от рони
contentDocument вместо contentWindow

iframe.contentWindow.document == contentDocument
Поэтому если эквивалент - то так:
var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;

hrundel 15.07.2013 16:43

Кстати, а существует ли какой-нибудь стандарт вроде ECMAScript, который регламентирует как браузеры должны действовать со встроенными фреймами и как на javascript осуществлять к ним доступ? Может что-то такое есть в w3c? Откуда разработчики браузеров знают, как в их браузерах надо реализовывать доступ к фрейму на javascript?

danik.js 15.07.2013 18:05

В спецификациях w3c отражаются политики доступа, да.

hrundel 15.07.2013 19:34

Цитата:

Сообщение от danik.js (Сообщение 262448)
В спецификациях w3c отражаются политики доступа, да.

А где эту спецификацию увидеть можно? Может ссылку дадите? Я гуглил фразу 'site:w3.org iframe' и ничего не нашёл полезного.


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