Сценарии JavaScript в активных страницах Web

Ссылки и метки в документе


Как мы уже рассказывали в 29 томе “Библиотеки системного программиста” с названием “Сервер Web своими руками”, для того чтобы вставить в документ HTML ссылку или локальную метку, необходимо использовать оператор <A>. В общем виде этот оператор представлен ниже:

<A HREF=Адрес URL или локальная метка

   NAME="Имя локальной метки"

   TARGET="Имя окна"

   onClick="Обработчик события: щелчок по ссылке"

   onMouseOver="Обработчик события: курсор над ссылкой">

   Текст ссылки

</A>

Описание параметров оператора <A> мы привели ниже:

Параметр



Описание

HREF

Параметр HREF задает адрес URL или имя локальной метки документа, куда будет сделан переход по ссылке

NAME

Если указан параметр NAME, оператор <A> определяет локальную метку. Значение этого параметра задает имя метки

TARGET

Параметр TARGET задает имя окна, куда будет загружен документ при выполнении ссылки. Это может быть имя существующего окна фрейма, определенного с помощью оператора <FRAMESET>, или одним из следующих зарезервированных имен - _top, _parent, _self, или _blank

onClick

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

onMouseOver

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

Для каждой ссылки, размещенной в документе HTML, создается отдельный объект. Все такие объекты находятся в объекте документа Document как элементы массива links.

Сценарий JavaScript может определить свойства каждой ссылки, расположенной в документе HTML, анализируя элементы объекта links. Вот список этих свойств:

Свойство

Описание

hash

Имя локальной ссылки, если она определена в адресе URL

host

Имя узла и порт, указанные в адресе URL

hostname

Имя узла и доменное имя узла сети. Если доменное имя недоступно, вместо него указывается адрес IP

href

Полный адрес URL

pathname

Путь к объекту, указанный в адресе URL

port

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

protocol

Строка названия протокола передачи данных (включающая символ “двоеточие”), указанного в ссылке

search

Строка запроса, указанная в адресе URL после символа “?”

target

Значение параметра TARGET, заданное в ссылке

length

Количество элементов в массиве links, то есть количество ссылок в текущем документе HTML

<
Рассмотрим пример сценария JavaScript, работающего со ссылками как с элементами массива links.

Мы приведем пример документа, с формой, списком и кнопкой Jump. Сценарий JavaScript заполняет список ссылками, размещенными в документе HTML. Внешний вид этого документа показан на рис. 2.19.



Рис. 2.19. Документ со списком расположенных в нем ссылок

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

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

В нижней части этого же документа HTML, показанного на рис. 2.20, сценарий отображает детальную информацию по каждой ссылке, извлеченную из свойств объектов класса links, соответствующих ссылкам.



Рис. 2.20. Детальная информация о ссылках

Что за информация здесь отображается?

Вначале выводятся свойства перовй ссылки, содержащей адрес главной страницы нашего сервера Web в сети Internet:

 

http://www.glasnet.ru/~frolov/index.html

host: www.glasnet.ru:80

hostname: www.glasnet.ru

href: http://www.glasnet.ru/~frolov/index.html

pathname: ~frolov/index.html

port: 80

protocol: http:

search:

target:

Так как в этой ссылке указан полный адрес URL, включающий путь к файлу документа index.html, то этот путь записывается в свойство с именем pathname.

Хотя порт, с использованием которого устанавливается соединение с сервером Web, не указан, в свойства host и port записывается значение, применяемое для этой цели по умолчанию, а именно 80.

Рассмотрим следующую ссылку:

http://www.auramedia.ru/

host: www.auramedia.ru:80

hostname: www.auramedia.ru

href: http://www.auramedia.ru/

pathname:

port: 80

protocol: http:

search:

target:

Здесь путь к файлу документа HTML не указан, поэтому свойство pathname содержит пустую строку.



В ссылке на сервер Microsoft мы указали путь к каталогу java:

http://www.microsoft.com/java/

host: www.microsoft.com:80

hostname: www.microsoft.com

href: http://www.microsoft.com/java/

pathname: java/

port: 80

protocol: http:

search:

target: newwnd

Этот частичный путь оказался записанным в свойство pathname. Кроме того, для отображения содержимого сервера Microsoft должно быть создано новое окно. Имя этого окна задано как newwnd в параметре TARGET оператора <A>. С помощью этого оператора мы разместили ссылку в документе HTML. Как и следовало ожидать, имя окна оказалось записано в свойство target.

Последняя ссылка - это адрес электронной почты:

mailto:frolov@glas.apc.org

host: glas.apc.org

hostname: glas.apc.org

href: mailto:frolov@glas.apc.org

pathname:

port: 0

protocol: mailto:

search:

target:

В свойстве protocol данной ссылки записана строка “mailto:”.

Рассмотрим теперь исходный текст документа HTML, содержащий сценарий JavaScript, работающий со ссылками (листинг 2.9).

Листинг 2.9. Файл chapter2/LinksList/LinksList.html

<HTML>

  <HEAD>

    <TITLE>Links and Anchors</TITLE>

    <SCRIPT LANGUAGE="JavaScript">

    <!--

    function urlJump()

    {

      var szNewURL="";

      szNewURL =

         document.links[Sel.ListOfLinks.selectedIndex];

      window.location.href=szNewURL;

    }

    // -->

    </SCRIPT>

  </HEAD>

  <BODY BGCOLOR=white>

    <H1>Просмотр ссылок</H1>

    <FORM NAME="Sel">

      <SELECT NAME="ListOfLinks">

      </SELECT>

      <INPUT TYPE="button" VALUE="Jump!" onClick="urlJump();">

    </FORM>

    <P>Посетите эти серверы:

    <P><A HREF="http://www.glasnet.ru/~frolov/index.html">Наша домашняя страница</A>

    <BR><A HREF="http://www.auramedia.ru">Каталог программ Auramedia</A>



    <BR><A HREF="http://www.microsoft.com/java/" TARGET="newwnd">Страница сервера Microsoft про Java</A>

    <P>Пишите нам по адресу: <A HREF="mailto:frolov@glas.apc.org">frolov@glas.apc.org</A>

    <HR>

    <H1>Список ссылок</H1>

    <P> Этот список сформирован динамически сценарием JavaScript</P>

    <SCRIPT LANGUAGE="JavaScript">

    <!--

    elem = new Array();

    for(i=0; i<document.links.length; i++)

    {

      elem[i] = new Option("Elem" + i, i, false, false);

      Sel.ListOfLinks.options[i] = elem[i];

      Sel.ListOfLinks.options[i].text = document.links[i];

      document.write("<HR>");

      var szText=document.links[i] + "<BR>";

      document.write(szText.bold());

      document.write("host: ".italics() + document.links[i].host + "<BR>");

      document.write("hostname: ".italics() + document.links[i].hostname + "<BR>");

      document.write("href: ".italics() + document.links[i].href + "<BR>");

      document.write("pathname: ".italics() + document.links[i].pathname + "<BR>");

      document.write("port: ".italics() + document.links[i].port + "<BR>");

      document.write("protocol: ".italics() + document.links[i].protocol + "<BR>");

      document.write("search: ".italics() + document.links[i].search + "<BR>");

      document.write("target: ".italics() + document.links[i].target + "<BR>");

    }

    Sel.ListOfLinks.selectedIndex=0;

    // -->

    </SCRIPT>

  </BODY>

</HTML>

В секции заголовка документа HTML определена функция urlJump, загружающая в окно браузера объект, соответствующий выбранной в списке ссылке:



function urlJump()

{

  var szNewURL="";

  szNewURL =

     document.links[Sel.ListOfLinks.selectedIndex];

  window.location.href=szNewURL;

}

Список ссылок, а также кнопка Jump, служащая для активизации выбранной ссылки, определена следующим образом:

<FORM NAME="Sel">

  <SELECT NAME="ListOfLinks">

  </SELECT>

  <INPUT TYPE="button" VALUE="Jump!" onClick="urlJump();">

</FORM>

Имя формы, необходимое сценарию JavaScript для доступа к списку и кнопке, определено в параметре NAME оператора <FORM> как Sel.

Список с именем ListOfLinks создается оператором <SELECT>. Первоначально в списке нет ни одного элемента. Все элементы будут добавлены в список сценарием JavaScript.

Кнопка Jump активизирует фукнцию urlJump, для чего в ее определении указан обработчик события onClick.

Обратите внимание на то, как функция urlJump адресуется к выбранному элементу списка:

szNewURL = document.links[Sel.ListOfLinks.selectedIndex];

Здесь мы взяли форму Sel и указали имя списка ListOfLinks как имя одного из свойств формы. Номер выделенного элемента списка находится в свойстве списка с именем selectedIndex.

Наш сценарий заполняет массив ссылок links и список Sel.ListOfLinks таким образом, что первый элемент массива links соответствует первой ссылке в списке, второй элемент массива - второму элементу и так далее. Поэтому выражение Sel.ListOfLinks.selectedIndex является номером ссылки в массиве links, которую необходимо активизировать. Функция urlJump записывает эту ссылку в переменную szNewURL, а затем устанавливает значение свойства window.location.href.

Рассмотрим теперь сценарий JavaScript, определенный в теле документа HTML.

Прежде всего, в этом сценарии мы создаем массив elem:

elem = new Array();

Этот массив предназначен для хранения элементов динамически формируемого списка, определенного пустым в форме Sel.

Далее в сценарии располагается цикл по всем ссылкам, размещенным в документе HTML:



for(i=0; i<document.links.length; i++)

{

  . . .

}

Количество ссылок находится в свойстве length объекта links, поэтому переменная цикла i изменяет свое значение от 0 до document.links.length.

В цикле мы создаем новый элемент списка и записываем в него текст ссылки:

elem[i] = new Option("Elem" + i, i, false, false);

Sel.ListOfLinks.options[i] = elem[i];

Sel.ListOfLinks.options[i].text = document.links[i];

Способ создания элемента списка будет подробно описан в главе, посвященной работе сценариев JavaScript с формами. Здесь мы только отметим, что текстовая строка, соответствующая ссылке, извлекается из массива links как document.links[i].

Далее после записи в документ HTML разделительной линии наш сценарий записывает в него текст ссылки, выделяя его жирным шрифтом:

document.write("<HR>");

var szText=document.links[i] + "<BR>";

document.write(szText.bold());

Вслед за этим в документ HTML записываются все свойства ссылки, извлеченные из текущего элемента массива links. Например, имя узла и номер порта извлекаются и записываются в документ HTML следующим образом:

document.write("host: ".italics() + document.links[i].host + "<BR>");

Последнее, что делает наш сценарий уже после завершения цикла, это выделение первого элемента в списке Sel.ListOfLinks:

Sel.ListOfLinks.selectedIndex=0;

Для этого номер выделяемого элемента (в нашем случае это 0) записывается в свойство списка с именем selectedIndex.


Содержание раздела