Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Объект <a> в js-скрипте
 
 автор: DmitryBerkut   (13.11.2007 в 01:20)   письмо автору
 
 

Уважаемые знатоки JavaScript и других технологий, которые имеют дело с html-содержимым, помогите в следующем вопросе: возможно ли осуществить следущую процедуру. Имеем ресурс, заходя на который загружается страница. Вследствие выполнения js-скрипта на этой странице происходит изменение/обновление (с некоторой определенной периодичностью во времени) определенных ссылок. Вопрос: возможно ли каким-нибудь образом извлечь содержимое объекта <a>? Причем извлекать необходимо содержимое между тегами <a>этот текст нужно извлечь</a>.

<tr><td class="news" width=225>
<b><input type=hidden value="" 
id="win[0]"><input type=hidden value="1"
 id="a_win_v[0]"><span style="border-bottom: 1px dashed #fff">
<a href="#1" 
style="color:#fff" onClick=" if (document.getElementById('a_win_v[0]').value==0 || 
document.getElementById('click_stopper').value=='on') return false;
else document.getElementById('click_stopper').value='on'; 
getImageGuess(0,0,document.getElementById('win[0]').value);
 document.getElementById('answer_key').value=1;
 this.style.color='#000'; this.blur(); 
return false;" id="a_win[0]">
<span id="win_text[0]"></span></a>
</span></td>
<td class="news" width=225><b><input type=hidden value="" 
id="win[1]"><input type=hidden value="1" 
id="a_win_v[1]"><span 
style="border-bottom: 1px dashed #fff">
<a href="#2" style="color:#fff" 
onClick=" if (document.getElementById('a_win_v[1]').value==0 || 
document.getElementById('click_stopper').value=='on') return false;
 else document.getElementById('click_stopper').value='on'; 
getImageGuess(0,0,document.getElementById('win[1]').value);
 document.getElementById('answer_key').value=1; this.style.color='#000';
 this.blur(); return false;"
 id="a_win[1]"><span id="win_text[1]"></span></a>
</span></td>
    </tr>
    <tr>
<td class="news" width=225><b><input type=hidden value="" 
id="win[2]"><input type=hidden value="1" 
id="a_win_v[2]"><span style="border-bottom: 1px dashed #fff"><a href="#3" 
style="color:#fff" onClick=" if (document.getElementById('a_win_v[2]').value==0 ||
 document.getElementById('click_stopper').value=='on') return false;
 else document.getElementById('click_stopper').value='on'; 
getImageGuess(0,0,document.getElementById('win[2]').value);
 document.getElementById('answer_key').value=1;
 this.style.color='#000';
 this.blur(); return false;"
 id="a_win[2]"><span id="win_text[2]"></span></a>
</span></td>
        <td class="news" width=225><b><input type=hidden value="" 
id="win[3]"><input type=hidden value="1" 
id="a_win_v[3]"><span style="border-bottom: 1px dashed #fff">
<a href="#4" style="color:#fff" onClick=" if (document.getElementById('a_win_v[3]').value==0 || 
document.getElementById('click_stopper').value=='on') return false;
 else document.getElementById('click_stopper').value='on'; 
getImageGuess(0,0,document.getElementById('win[3]').value);
 document.getElementById('answer_key').value=1;
 this.style.color='#000'; this.blur(); 
return false;" id="a_win[3]">
<span id="win_text[3]"></span></a>
</span></td>
    </tr>

   
 
 автор: mefestofel   (13.11.2007 в 02:23)   письмо автору
 
   для: DmitryBerkut   (13.11.2007 в 01:20)
 

Дайте ссылку на сайт посмотреть, откуда все это добро взято....

   
 
 автор: CNT   (13.11.2007 в 12:42)   письмо автору
 
   для: DmitryBerkut   (13.11.2007 в 01:20)
 

содержимое между тегами <a>этот текст нужно извлечь</a> называется свойством innerHTML

1. Если страница - ваша, то проблемы нет.
Для доступа ко ВСЕМ ссылкам страницы существует коллекция links.
Влючаете, например, таймер - методом setTimeout - и через каждые секунду (две, три...) узнаете значения innerHTML для ВСЕХ ссылок (циклом перебирая коллекцию links) или только для избранных ссылок (зная или их номер в коллекции, или ID, или - по иным признакам).

2. Если страница - не ваша (чужая), то и здесь не сложно: необходимо работать тогда в режиме HTA, загружая в IFRAME эту чужую страницу и назначая документу этой страницы (после окончания загрузки) обработчик (описанный в п.1)

   
 
 автор: DmitryBerkut   (13.11.2007 в 16:38)   письмо автору
 
   для: CNT   (13.11.2007 в 12:42)
 

Блестяще!!! Только Вы пожалуйста могли бы накидать хотя б набросок кода? Обобщенный эскиз, такскзть!..
И что такое режим режим HTA?

   
 
 автор: DmitryBerkut   (13.11.2007 в 20:26)   письмо автору
 
   для: DmitryBerkut   (13.11.2007 в 16:38)
 

Потому что "include" естественно в php не проканает...)

   
 
 автор: DmitryBerkut   (13.11.2007 в 16:45)   письмо автору
 
   для: CNT   (13.11.2007 в 12:42)
 

А, и еще забыл, мне нужен второй пункт!

   
 
 автор: DmitryBerkut   (13.11.2007 в 19:30)   письмо автору
 
   для: DmitryBerkut   (13.11.2007 в 16:45)
 

*Блестяще!!! Только Вы пожалуйста могли бы накидать хотя б набросок кода? Обобщенный эскиз, такскзть!..*

   
 
 автор: DmitryBerkut   (13.11.2007 в 16:49)   письмо автору
 
   для: CNT   (13.11.2007 в 12:42)
 

Я так понимаю, что НТА - это режим - html-приложение?

   
 
 автор: CNT   (13.11.2007 в 21:17)   письмо автору
 
   для: DmitryBerkut   (13.11.2007 в 16:49)
 

Ну да.
Режим HTA (HTML Application) - в данном случае обычный HTML-файл, сохраненный с расширением .HTA
Отличается от файлов .htm/.html тем, что спокойно можно загружать в ифрейм любые "чужие" файлы и скрипты этих файлов не получат сведений о том, что они загружены не в top окна браузера, а в ифрейм. Соответственно, не будут они знать и о реферрере.

Ну а самое главное - имеется прямой доступ к документу внутри этого ифрейма - т.е. о загруженном документе можно узнать ВСЁ и можно ВСЁ ЧТО УГОДНО в этом документе изменить/проделать.
Например, можно написать файл .HTA, который будет автоматически регистрироваться на каких-то сайтах, т.е. сам вводить логины и пароли и жать на кнопку "Зарегистрировать". Борьба с этим делом - ввод капчи (рисунка с кодом, который надо рассмотреть и ввести нарисованный код) или же скриптовой учет перемещения мыши по странице.

Минус один - файлы с расширением .HTA - они для внутреннего пользования, т.е. эти файлы должны размещаться на компьютере клиента, а не на удаленном сервере. Т.е. если сделали такой файл, то сами вы им можете спокойно пользоваться. А вот если разместите на сервере, то браузер пользователя, получив ссылку на файл с расширением .HTA, обрабатывать его не будет, а предложит его "сохранить" на компьютере.

   
 
 автор: DmitryBerkut   (14.11.2007 в 15:05)   письмо автору
 
   для: CNT   (13.11.2007 в 21:17)
 

а как можно совместить .HTA файл со всеми прелестями php-скрипта, предположим, расположенного на локальном компе, на котором установлен денвер, и лок комп "идет" как сервер apach???

   
 
 автор: DmitryBerkut   (14.11.2007 в 16:06)   письмо автору
 
   для: DmitryBerkut   (14.11.2007 в 15:05)
 

Или возможно, каким-нибудь способом передать php-скрипту данные из *.НТА-файла???

   
 
 автор: CNT   (15.11.2007 в 01:45)   письмо автору
 
   для: DmitryBerkut   (14.11.2007 в 16:06)
 

Начнем сначала.

1. JS-скрипты, включенные в HTML-файл, исполняются браузером и исполняются в пределах документа, в кои они включены (или в дочерних документах, кои созданы родительским JS-скриптом).
Т.е. JS-скрипт, написанный вами в файле http://ваш_сервер.com/ваш_файл.html, сможет обрабатывать ТОЛЬКО содержимое этого самого файла http://ваш_сервер.com/ваш_файл.html, а также прочих дочерних документов - например, новых окон, открытых из файла http://ваш_сервер.com/ваш_файл.html (или ифреймов внутри родительского файла), в которых будут загружены какие-то файлы С ТОГО ЖЕ СЕРВЕРА http://ваш_сервер.com/ или же тупо созданные методом WRITE () или DOM-методами.
Как только в окне/ифрейме загрузится ЧУЖОЙ файл (т.е. с иного сервера, а не с вашего http://ваш_сервер.com/), то НИЧЕГО вы с ним сделать НЕ СМОЖЕТЕ.
Это вам понятно?

2. Используя приложение .HTA, вы СМОЖЕТЕ работать с чужими файлами, загруженными в ифреймы (НО НЕ В НОВЫЕ ОКНА). Но главное условие здесь - и о чем я уже писал ранее - HTA-файл должен быть запущен с локального компьютера вами (вручную, или через планировщик задач)

3. HTA-файл может создавать/изменять любые файлы на вашем локальном компьютере, причем в любом символьном режиме - что в ASCII, что в Unicode. Поэтому, разумеется, вы сможете ПОТОМ любым вашим PHP-файлом прочитать эти созданные/измененные файлы.
Но только ПОТОМ - ибо PHP-файл НЕ В СОСТОЯНИИ запустить на локалке HTA-приложение, дождаться результатов его работы, а потом воспользоваться этими результатами.
А вот HTA-приложение ВПОЛНЕ МОЖЕТ обработать чужие файлы, получить результаты, сохранить их на жестком диске локального компьютера, а потом запустить ваш PHP-файл.
Т.е. сначала - вы (или планировщик задач) запускаете HTA, а тот, отработав, запускает ваш PHP-файл. Иной порядок НЕ ПОЛУЧИТСЯ.
Это понятно?
--------------------------

В принципе, если чужой файл "статичен", то PHP вполне может со всем этим справиться самостоятельно - и прочесть файл, и сохранить результаты и потом ими воспользоваться.

Единственная НЕОБХОДИМОСТЬ в комбинации HTA+PHP есть только в том случае, если изменение текстов ссылок чужого файла (о чем вы писали) происходит с помощью чужого же JS-скрипта, который должен работать в браузере. Здесь - только HTA (ну или WSH, что почти одно и то же).

Если надо, то могу дать пример кода файла test.hta, который, к примеру, откроет какой-то URL (введенный вами), и будет читать там innerHTML всех ссылок на странице через какой-то промежуток времени Т (введенный вами) сколько-то раз N (опять же - по вашему желанию) и по окончании промежутка времени N * T полученные данные запишет в текстовой файл на диск С вашего локального компьютера.

   
 
 автор: DmitryBerkut   (15.11.2007 в 14:06)   письмо автору
 
   для: CNT   (15.11.2007 в 01:45)
 

Это было бы круто!!! А если например я ввожу ссылку в этом Вашем *.НТА файле, и там, на ресурсе мне необходимо авторизироваться, а затем, после авторизации, мне необходимо выполнить чтение innerHTML всех ссылок. Сможет такое *.НТА файл? Или авторизация через html-приложение это гиблое дело?

   
 
 автор: CNT   (15.11.2007 в 15:50)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 14:06)
 

Конечно, сможет, причем без проблем.
Авторизация - это ввод логина/пароля и получение идентификатора сессии от "тамошнего" php-скрипта (или ещё на каком-то серверном языке). Так как вызываемый "чужой" файл (как яуже писал ранее) не будет даже догадываться, что его запустили не прямо в браузере, а в окне IFRAME, то и вести он себя будет, как в обычном окне браузера.

   
 
 автор: DmitryBerkut   (15.11.2007 в 15:30)   письмо автору
 
   для: CNT   (15.11.2007 в 01:45)
 

*Если надо, то могу дать пример кода файла test.hta*
Давайте!!! Давайте!! Давайте!

   
 
 автор: CNT   (15.11.2007 в 16:53)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 15:30)
 

сохраните файл на компьютере с именем test.hta (запускайте двойным кликом мыши):
<html><head>
<meta http-equiv="content-type" content="text/html; charset=win-1251">
<script>
var T, N, R = 1;
function f ()
{
document.all._ifr.src = document.all._url.value;
T = document.all._tim.value * 1000;
N = document.all._num.value * 1;
document.all._txt.value = '';
}
function f2 ()
{
if (R > N)
   {
   if (confirm ('Работа завершена!\nСохранить результаты на жесткий диск?'))
      {
      var fso = new ActiveXObject ('Scripting.FileSystemObject'),
      f = fso.OpenTextFile ('c:\\cnt.txt', 2, true);
      f.Write (document.all._txt.value);
      f.Close ();
      alert ('Смотрите файл C:\\cnt.txt');
      }
   return;
   }
for (var L = document.frames._ifr.document.links, o = [], j = 0; j < L.length; j++)
o [j] = (j + 1) + '. ' + ((L [j].innerText) ? L [j].innerText : '[текста в ссылке нет]');
document.all._txt.value += R++ + '-е сохранение (всего ссылок - ' + L.length + '):\r\n';
document.all._txt.value += o.join ('\r\n') + '\r\n-------\r\n\r\n';
setTimeout (f2, T);
}
onload = function () {document.all._ifr.attachEvent ('onload', f2)}
</script></head>
<body bgcolor="#cecece" style="margin: 0">
<table bgcolor="teal" cellpadding="8" cellspacing="0" width="100%">
<tr><td>URL страницы в сети:
<td><input id="_url" style="width: 100%" value="http://" onclick="this.value=''">
<tr><td>Период:
<td><input id="_tim" style="width: 100%" value="(целое количество секунд от 1 до разумного)" onclick="this.value=''">
<tr><td width="10">Сколько&nbsp;раз&nbsp;сохранять:
<td><input id="_num" style="width: 100%" value="(целое количество раз от 1 до разумного)" onclick="this.value=''">
<tr><td colspan="2" bgcolor="fuchsia"><table cellpadding="5" width="100%">
<tr><th width="50%"><input type="button" style="width: 30%" value="START" onclick="f ()">
<th><input type="button" style="width: 30%" value="REFRESH" onclick="document.location.reload ()">
</table></table><br><br>
<iframe align="center" id="_ifr" style="width: 80%; height: 10%"></iframe><br><br>
<table bgcolor="aqua" cellpadding="8" cellspacing="0" width="100%">
<tr><td><textarea id="_txt" style="width: 100%" rows="10">(результат работы)</textarea>
</table><br><br>
<table align="center" width="80%" border="1" cellspacing="0" cellpadding="20" bgcolor="white">
<tr><td><ol>Защиты "от дурака" не делал: 
<li>Введете, например, в поле "Период" вместо цифр бяку (или ничего не введете) - программу будет клинить.
<li>Зададите 10000 раз "сохранять" - программа "заснет" (или стек переполнится)
<li>Будете внутри ифрейма чего-то нажимать в процессе работы программы - тоже переклинит
</ol></table><br><br>
</body></html>

   
 
 автор: DmitryBerkut   (15.11.2007 в 18:55)   письмо автору
 
   для: CNT   (15.11.2007 в 16:53)
 

Круто спасибо. А можно доделать скрипт таким образом, чтобы он предусматривала авторизацию на сайте. Потому что он все время при попытке авторизироваться выдает "Работа программы завершена. Сохранить результаты на жесткий диск?" ???

   
 
 автор: CNT   (16.11.2007 в 03:48)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 18:55)
 

Вы читать не умеете?
Я же написал: "Будете внутри ифрейма чего-то нажимать в процессе работы программы - тоже переклинит "
Вы, когда авторизуетесь, что-то ведь внутри ифрейма пишете/жмёте?
Если вас предупредили - "туда не ходи, снег башка попадет" - то почему вы удивляетесь, что "он все время при попытке авторизироваться выдает "Работа программы завершена. Сохранить результаты на жесткий диск?" ???"
------------------------------
"А можно доделать скрипт таким образом, чтобы он предусматривала авторизацию на сайте?"
Разумеется, можно, ибо все же очевидно и примитивно.
Неужели вы вовсе не разбираетесь в JS?
В общем, в последний раз - удовлетворять все ваши прихоти мне лень

<html><head>
<meta http-equiv="content-type" content="text/html; charset=win-1251">
<script>
var T, N, R = 1;
function f () {document.all._ifr.src = document.all._url.value}
function f2 ()
{
if (R == 1)
   {
   T = document.all._tim.value * 1000;
   N = document.all._num.value * 1;
   document.all._txt.value = '';
   }
if (R > N)
   {
   if (confirm ('Работа завершена!\nСохранить результаты на жесткий диск?'))
      {
      var fso = new ActiveXObject ('Scripting.FileSystemObject'),
      f = fso.OpenTextFile ('c:\\cnt.txt', 2, true);
      f.Write (document.all._txt.value);
      f.Close ();
      alert ('Смотрите файл C:\\cnt.txt');
      }
   return;
   }
for (var L = document.frames._ifr.document.links, o = [], j = 0; j < L.length; j++)
o [j] = (j + 1) + '. ' + ((L [j].innerText) ? L [j].innerText : '[текста в ссылке нет]');
document.all._txt.value += R++ + '-е сохранение (всего ссылок - ' + L.length + '):\r\n';
document.all._txt.value += o.join ('\r\n') + '\r\n-------\r\n\r\n';
setTimeout (f2, T);
}
</script></head>
<body bgcolor="#cecece" style="margin: 0">
<table bgcolor="yellow" cellpadding="8" cellspacing="0" width="100%">
<tr><td width="20%">Куда&nbsp;идём&nbsp;авторизоваться:
<td width="40%"><input id="_url" style="width: 100%" value="http://" onclick="this.value=''">
<th width="20%"><input type="button" style="width: 40%" value="GO" onclick="f ()">
</table>
<br><br><iframe align="center" id="_ifr" style="width: 80%; height: 10%"></iframe><br><br>
<table bgcolor="aqua" cellpadding="8" cellspacing="0" width="100%">
<tr><th colspan="2">После ручной авторизации и после <b style="color: red">ПОЛНОЙ</b> загрузки нужной страницы заполняем
<tr><td>Период:
<td><input id="_tim" style="width: 100%" value="(целое количество секунд от 1 до разумного)" onclick="this.value=''">
<tr><td width="10">Сколько&nbsp;раз&nbsp;сохранять:
<td><input id="_num" style="width: 100%" value="(целое количество раз от 1 до разумного)" onclick="this.value=''">
<tr><td colspan="2" bgcolor="fuchsia"><table cellpadding="5" width="100%">
<tr><th width="50%"><input type="button" style="width: 30%" value="START" onclick="f2 ()">
<th><input type="button" style="width: 30%" value="REFRESH" onclick="document.location.reload ()">
</table></table><br><br>
<table bgcolor="aqua" cellpadding="8" cellspacing="0" width="100%">
<tr><td><textarea id="_txt" style="width: 100%" rows="10">(результат работы)</textarea>
</table><br><br>
<table align="center" width="80%" border="1" cellspacing="0" cellpadding="20" bgcolor="white">
<tr><td><ol>Защиты "от дурака" не делал: 
<li>Введете, например, в поле "Период" вместо цифр бяку (или ничего не введете) - программу будет клинить.
<li>Зададите 10000 раз "сохранять" - программа "заснет" (или стек переполнится)
<li>Будете внутри ифрейма чего-то нажимать <b style="color: red">после нажатия кнопки START</b> в процессе работы программы - тоже переклинит
</ol></table><br><br>
</body></html>
Разумеется, дожидаться визуально ПОЛНОЙ загрузки - это "не комильфо" - но я не знаю, как именно у вас проходит авторизация (кою тоже можно автоматизировать), потому написал в самом простом виде.

   
 
 автор: DmitryBerkut   (16.11.2007 в 18:54)   письмо автору
 
   для: CNT   (16.11.2007 в 03:48)
 

Не позволяет авторизацию Ваш скрипт на:
http://www.kinopoisk.ru

   
 
 автор: CNT   (16.11.2007 в 19:43)   письмо автору
 
   для: DmitryBerkut   (16.11.2007 в 18:54)
 

Мой скрипт позволяет - только что проверил.
Это настройки вашего MSIE (Эксплорера) не позволяют (а HTA-файлы работают на базе настроек MSIE) .

1. Откройте браузер Эксплорер
2. Зайдите в "Сервис-->Свойства обозревателя"
3. Откройте там вкладку "Конфиденциальность"
4. В верхнее поле ("Адрес веб-узла") пропишите http://www.kinopoisk.ru/
5. Нажмите кнопку "Разрешить" справа от верхнего поля
6. В нижнем поле появится строка "kinopoisk.ru -- Всегда разрешать"
7. Нажмите "ОК" и ещё раз "ОК" (закрыв панель настроек)
8. Закройте браузер Эксплорер

Теперь можете сколько угодно раз запускать файл test.hta и авторизоваться на здоровье.
Соответственно, для других узлов операции 1...8 необходимо будет повторить.

   
 
 автор: RMW   (18.11.2007 в 18:12)   письмо автору
 
   для: CNT   (16.11.2007 в 19:43)
 

Нужно в теге iframe добавить атрибут application="yes" и настройки эксплорера не трогать.
Пердупердю: код загруженный в ифрейм с application="yes" может делать с вашей машиной
что хочет.

   
 
 автор: CNT   (19.11.2007 в 00:25)   письмо автору
 
   для: RMW   (18.11.2007 в 18:12)
 

Это называется - "слышал звон".

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

Да, аттрибут APPLICATION у фреймов/ифреймов иногда используется - http://msdn2.microsoft.com/en-us/library/ms536474.aspx

Но - совсем для иного. И в данном случае этот атрибут совсем не нужен, ибо не поможет.

   
 
 автор: RMW   (19.11.2007 в 21:57)   письмо автору
 
   для: CNT   (19.11.2007 в 00:25)
 

CNT
> И в данном случае этот атрибут совсем не нужен
Согласен, не нужен совершенно. Извините, не разобрался в проблеме.

   
 
 автор: DmitryBerkut   (19.11.2007 в 15:37)   письмо автору
 
   для: CNT   (16.11.2007 в 19:43)
 

Помогло, большое спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования