Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как выдернуть ссылки из фрейма (https://javascript.ru/forum/misc/1240-kak-vydernut-ssylki-iz-frejjma.html)

Leonline 23.05.2008 11:55

Как выдернуть ссылки из фрейма
 
Помогите разобраться, есть html страница
Код:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>TEST</title>
</head>
<script language="javascript" src="test.js"></script>
</html>

файл тест содержит
Код:

document.write('<frameset frameborder="0" framespacing="0" border="0" rows="100%,*" noresize><frame id="fr" src="http://site.ru/test.php" noresize></frameset>');
какой код нужно добавить в файл test.js чтоб после загрузки фрейма внизу страницы выводились все ссылки каторые присутствуют в фрейме. Пробовал так
Код:

for (var i = 0; i < document.links.length; i++) {
                document.write(document.links[i]+'<br>');
}

работает только если вставить код в тело фрейма а мне оч нужно чтоб код был в файле test.js

Андрей Параничев 24.05.2008 01:52

Внизу какой страницы? Основной, или загруженной во фрейм? Насколько я понимаю, страница с фреймами (не плавающими iframe) не может содержать ничего, кроме этих фреймов. Если дописывать надо во фрейм, то делать надо следующим образом. Нужно "взять" этот фрейм из DOM, собрать элементы <a> из него (обращаясь к документу через contentDocument или contentWindow). Но обратите внимание, что если фрейм будет подгружать страницу с домена, отличного от того, где находится сам файл в фреймом, ничего работать не будет. К сожалению, не могу сейчас проверить код на работоспособность, но ход мысли должен быть понятен:
var frame = document.getElementById("fr");
var frameDoc = frame.contentDocument && frame.contentWindow.document;
var links = frameDoc.getElementsByTagName("a");
for(var i in links)
{
   var link = links[i].getAttribute("src") && links[i].src;
   frameDoc.write(link);
}

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

Leonline 26.05.2008 02:45

IE выдает такую ошибку
frameDoc - есть NULL или не является объектом

ставишь выполнение на событие onLoad элемента <frame>
Код:

function f() {

var frame = document.getElementById("fr");
var frameDoc = frame.contentDocument && frame.contentWindow;
var links = frameDoc.getElementsByTagName("a");

for(var i in links) {

  var link = links[i].getAttribute("src") && links[i].src;
  frameDoc.write(link);
}
}

document.write('<frameset frameborder="0" framespacing="0" border="0" rows="100%,*" noresize><frame onload="f()" name="fr" id="fr" src="http://site.ru/test.php" noresize></frameset>');

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

Андрей Параничев 26.05.2008 12:25

Leonline,
Сайт во фрейме и основной сайт находятся на одном домене?
Попробуйте так, я просто опечатался:
var frameDoc = frame.contentDocument && frame.contentWindow.document;

Я еще ближе к вечеру посмотрю, может пойму в чём проблема.

Leonline 27.05.2008 11:26

Сайт во фрейм загружается с другого домена.

Попробовал так
Код:

var frameDoc = frame.contentDocument && frame.contentWindow.document;
к сожалению таже самая ошибка, IE выдает что объект неподдерживает это свойство или метод

Kolyaj 27.05.2008 11:30

Цитата:

Сообщение от Leonline
Сайт во фрейм загружается с другого домена.

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

Андрей Параничев 27.05.2008 12:46

Leonline,
Я в коде опечатался дважды правильно было бы вот так:
var frameDoc = frame.contentDocument || frame.contentWindow.document;


Но это всё равно не поможет, если ифейм подгружает сайт с другого домена - политика безопасности запрещает документам с разных доменов "общаться" между собой.

tenshi 28.05.2008 10:20

frame.contentDocument - это для кого?

Leonline 31.05.2008 00:30

Цитата:

Сообщение от tenshi (Сообщение 2681)
frame.contentDocument - это для кого?

Андрей Параничев уже написал что если конткнт во фрейм загружается с другого сайта то выдернуть с него ссылки неполучится. Если вы считаете что можно то покажите конкретным примером. Мне нужен массив ссылок и фрейма id="fr", на странице он единственный.
Заранее благодарен.

Андрей Параничев 31.05.2008 01:34

tenshi,
Цитата:

Сообщение от tenshi
frame.contentDocument - это для кого?

Для старых Opera, если я не ошибаюсь.


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