| Часть1 Часть2 Часть3 Часть4 Часть5 Часть6 Часть7 Часть9 Часть10 Часть11 Часть12 |
Часть1 Что такое JavaScript JavaScript - новый язык для составления скриптов, разработанный фирмой Netscape. С помощью JavaScript Вы можете легко создавать интерактивные Web-страницы. В данном руководстве Вы увидите, что можно сделать с помощью JavaScript, и даже более того - увидите, как это сделано. JavaScript - это не Java! Многие люди считают, что JavaScript - это то же самое, что и Java, лишь потому, что эти языки имеют схожие названия. На самом деле это не так. Я считаю, что сейчас будет излишне показывать Вам все различия между этими языками - так что запомните лишь то, что JavaScript - это не Java. Что необходимо сделать, чтобы запускать скрипты, написанные на языке JavaScript? Вам понадобится браузер, способный работать с JavaScript - например Netscape Navigator (начиная с версии 2.0) или Microsoft Internet Explorer (MSIE - начиная с версии 3.0). С тех пор, как оба этих браузера стали широко распространеными, множество людей получили возможность работать со скриптами, написанными на языке JavaScript. Несомненно, это важный аргумент в пользу выбора языка JavaScript, как средства улучшения ваших Web-страниц. Размещение JavaScript на HTML-странице Код скрипта JavaScript размещется непосредственно на HTML-странице. Чтобы увидеть, как это делается, давайте рассмотрим следующий простой пример: С первого взгляда пример напоминает обычный файл HTML. Единственное новшество здесь - конструкция: document.write("А это JavaScript!") </script> Это действительно код JavaScript. Чтобы видеть, как этот скрипт работает, запишите данный пример как обычный файл HTML и загрузите его в браузер, имеющий поддержку языка JavaScript. Это обычный HTML документ. Я должен признать, что данный скрипт не столь полезен - то же самое и более просто можно было бы написать на "чистом" языке HTML. Я всего лишь хотел продемонстрировать Вам тег признака <script>. Все, что стоит между тегами <script> и </script>, интерпретируется как код на языке JavaScript. Здесь Вы также видите пример использования инструкции document.write() - одной из наиболее важных команд, используемых при программировании на языке JavaScript. Команда document.write() используется, когда необходимо что-либо написать в текущем документе (в данном случае таком является наш HTML-документ). Так наша небольшая программа на JavaScript в HTML-документе пишет фразу "А это JavaScript!". Браузеры без поддержки JavaScript А как будет выглядеть наша страница, если браузер не воспринимает JavaScript? Браузеры, не имеющие поддержки JavaScript, "не знают" и тега <script>. Они игнорируют его и печатают все стоящие вслед за ним коды как обычный текст. Иными словами, читатель увидит, как код JavaScript, приведенный в нашей программе, окажется вписан открытым текстом прямо посреди HTML-документа. Разумеется, это не входило в наши намерения. На этот случай имеется специальный способ скрыть исходный код скрипта от старых версий браузеров - мы будем использовать для этого тэг комментария из HTML - <!-- -->. В результате новый вариант нашего исходного кода будет выглядеть как: <html><body> <br> Это обычный HTML документ. <br> <script language="JavaScript"> <!-- hide from old browsers document.write("А это JavaScript!") // --> </script> <br> Вновь документ HTML. </body> </html> В этом случае браузер без поддержки JavaScript будет печатать:
А без HTML-тега комментария браузер без поддержки JavaScript напечатал бы:
Пожалуйста обратите внимание, что Вы не можете полностью скрыть исходный код JavaScript. То, что мы здесь делаете, имеет целью предотвратить распечатку кода скрипта на старых браузерах - однако тем не менее читатель сможет увидеть этом код посредством пункта меню 'View document source'. Не существует также способа скрыть что-либо от просмотра в вашем исходном коде (и увидеть, как выполнен тот или иной трюк). События События и обработчики событий являются очень важной частью для программирования на языке JavaScript. События, главным образом, инициируются теми или иными действиями пользователя. Если он щелкает по некоторой кнопке, происходит событие "Click". Если указатель мыши пересекает какую-либо ссылку гипертекста - происходит событие MouseOver. Существует несколько различных типов событий. <input type="button" value="Click me" onClick="alert('Привет')"> </form> Данный пример имеет несколько новых особенностей - рассмотрим их по порядку. Вы можете здесь видеть, что мы создаем некую форму с кнопкой (как это делать - проблема языка HTML, так что рассматривать это здесь я не буду). Первая новая особенность - onClick="alert('Прмвет')" в теге <input>. Как мы уже говорили, этот атрибут определяет, что происходит, когда нажимают на кнопку. Таким образом, если имеет место событие Click, компьютер должен выполнить вызов alert('Прмвет'). Это и есть пример кода на языке JavaScript (Обратите внимание, что в этом случае мы даже не пользуемся тегом <script>). Вы можете использовать в скрипте множество различных типов функций обработки событий. Сведения о некоторых из них мы получим в данном описании, однако не о всех. Поэтому обращайтесь пожалуйста к соответствующему справочнику, если Вы хотите узнать, какие обработчики событий еще существуют. Итак, если Вы используете браузер Netscape Navigator, то выпадающее окно содержит текст, что был передан функции JavaScript alert. Такое ограничение накладывается по соображениям безопасности. Такое же выпадающее окно Вы можете создать и с помощью метода prompt(). Однако в этом случае окно будет воспроизводить текст, введенный читателем. А потому, скрипт, написанный злоумышленником, может принять вид системного сообщения и попросить читателя ввести некий пароль. А если текст помещается в выпадающее окно, то тем самым читателю дается понять, что данное окно было создано web-браузером, а не вашей операционной системой. И поскольку данное ограничение наложено по соображениям безопасности, Вы не можете взять и просто так удалить появившееся сообщение. Функции В большинстве наших программ на языке JavaScript мы будем пользоваться функциями. Поэтому уже теперь мне необходимо рассказать об этом важном элементе языка. <script language="JavaScript"> <!-- hide document.write("Добро пожаловать на мою страницу!<br>"); document.write("Это JavaScript!<br>"); document.write("Добро пожаловать на мою страницу!<br>"); document.write("Это JavaScript!<br>"); document.write("Добро пожаловать на мою страницу!<br>"); document.write("Это JavaScript!<br>"); // --> </script> </html> И такой скрипт напишет следующий текст
три раза. Если посмотреть на исходный код скрипта, то видно, что для получения необходимого результата определенная часть его кода была повторена три раза. Разве это эффективно? Нет, мы можем решить ту же задачу еще лучше. Как насчет такого скрипта для решения той же самой задачи? <html><script language="JavaScript"> <!-- hide function myFunction() { document.write("Добро пожаловать на мою страницу!<br>"); document.write("Это JavaScript!<br>"); } myFunction(); myFunction(); myFunction(); // --> </script> </html> В этом скрипте мы определили некую функцию, состоящую из следующих строк: function myFunction() {document.write("Добро пожаловать на мою страницу!<br>"); document.write("Это JavaScript!<br>"); } Все команды скрипта, что находятся внутри фигурных скобок - {} - принадлежат функции myFunction(). Это означает, что обе команды document.write() теперь связаны воедино и могут быть выполнены при вызове указанной функции. И действительно, нашем примере есть три вызова этой функции - Можно увидеть, что мы написали строку myFunction() три раза сразу после того, как дали определение самой функции. То естькак раз и сделали три вызова. В свою очередь, это означает, что содержимое этой функции (команды, указанные в фигурных скобках) было выполнено трижды. Функции могут также использоваться в совместно с процедурами обработки событий. Рассмотрим следующий пример: <html><head> <script language="JavaScript"> <!-- hide function calculation() { var x= 12; var y= 5; var result= x + y; alert(result); } // --> </script> </head> <body> <form> <input type="button" value="Calculate" onClick="calculation()"> </form> </body> </html> Проверьте пример Здесь при нажатии на кнопку осуществляется вызов функции calculation(). Как можно заметить, эта функция выполняет некие вычисления, пользуясь переменными x, y и result. Переменную мы можем определить с помощью ключевого слова var. Переменные могут использоваться для хранения различных величин - чисел, строк текста и т.д. Так строка скрипта var result= x + y; сообщает браузеру о том, что необходимо создать переменную result и поместить туда результат выполнения арифметической операции x + y (т.е. 5 + 12). После этого в переменный result будет размещено число 17. В данном случае команда alert(result) выполняет то же самое, что и alert(17). Иными словами, мы получаем выпадающее окно, в котором написано число 17.
Часть2
Иерархия объектов в JavaScript В языке JavaScript все элементы на web-странице выстраиваются в иерархическую структуру. Каждый элемент предстает в виде объекта. И каждый такой объект может иметь определенные свойства и методы. В свою очередь, язык JavaScript позволит Вам легко управлять объектами web-страницы, хотя для этого очень важно понимать иерархию объектов, на которые опирается разметка HTML. Как это все действует, Вы сможете быстро понять на следующем примере. Рассмотрим простую HTML-страницу: <html><head> <title>My homepage </head> <body bgcolor=#ffffff> <center> <img src="home.gif" name="pic1" width=200 height=100> </center> <p> <form name="myForm"> Name: <input type="text" name="name" value=""><br> e-Mail: <input type="text" name="email" value=""><br><br> <input type="button" value="Push me" name="myButton" onClick="alert('Yo')"> </form> <p> <center> <img src="ruler.gif" name="pic4" width=300 height=15> <p> <a href="http://rummelplatz.uni-mannheim.de/~skoch/">My homepage</a> </center> </body> </html>
Итак, мы имеем два рисунка, одну ссылку и некую форму с двумя полями для ввода текста и одной кнопкой. С точки зрения языка JavaScript окно браузера - это некий объект window. Этот объект также содержит в свою очередь некоторые элементы оформления, такие как строка состоятия. Внутри окна мы можем разместить документ HTML (или файл какого-либо другого типа - однако пока мы все же ограничимся файлами HTML). Такая страница является ни чем иным, как объектом document. Это означает, что объект document представляет в языке JavaScript загруженный на настоящий момент документ HTML. Объект document является очень важным объектом в языке JavaScript и Вы будете пользоваться им многократно. К свойствам объекта document относятся, например, цвет фона для web-страницы. Однако для нас гораздо важнее то, что все без исключения объекты HTML являются свойствами объекта document. Примерами объекта HTML являются, к примеру, ссылка или заполняемая форма. Разумеется, мы должны иметь возможность получать информацию о различных объектах в этой иерархии и управлять ею. Для этого мы должны знать, как в языке JavaScript организован доступ к различным объектам. Как видно, каждый объект иерархической структуры имеет свое имя. Следовательно, если Вы хотите узнать, как можно обратиться к первому рисунку на нашей HTML-странице, то обязаны сориентироваться в иерархии объектов. И начать нужно с самой вершины. Первый объект такой структуры называется document. Первый рисунок на странице представлен как объект images[0]. Это означает, что отныне мы можем получать доступ к этому объекту, записав в JavaScript document.images[0]. Полученная строка заносится в переменную name. Следовательно, теперь мы можем работать с этой переменной, как нам необходимо. Например, мы можем создать выпадающее окно, воспользовавшись командой alert("Hi " + name). В результате, если читатель введет в это поле слово 'Stefan', то по команде alert("Hi " + name) будет открыто выпадающее окно с приветствием 'Hi Stefan'. Name: <input type="text" name="name" value=""><br> Эта запись означает, что объект forms[0] получает теперь еще и второе имя - myForm. Точно так же вместо elements[0] Вы можете писать name (последнее было указано в атрибуте name тега <input>). Таким образом, вместо name= document.forms[0].elements[0].value;Вы можете записать name= document.myForm.name.value;Это значительно упрощает программирование на JavaScript, особенно в случае с большими web-страницами, содержащими множество объектов. (Обратите внимание, что при написании имен Вы должны еще следить и за положением регистра - то есть Вы не имеете права написать myform вместо myForm) Пример кода на JavaScript, иллюстрирующего такую возможность - интересующий нас фрагмент записан как свойство onClick второго тэга <input>: <form name="myForm"><input type="text" name="input" value="bla bla bla"> <input type="button" value="Write" onClick="document.myForm.input.value= 'Yo!'; "> Сейчас я не имею возможности описывать каждую деталь данного примера. Намного лучше будет, если Вы попробуете сами понять иерархию объектов в JavaScript, обратившись к справочнику по JavaScript. В заключение я написал небольшой пример. В нем Вы увидите, как используются различные объекты. Рассмотрим сперва следующий пример, чтобы увидеть, как это делается:
Исходный код скрипта: <html><head> <title>Objects</title> <script language="JavaScript"> <!-- hide function first() { // создает выпадающее окно, где размещается // текст, введенный в поле формы alert("The value of the textelement is: " + document.myForm.myText.value); } function second() { // данна\я функци\я провер\яет состо\яние переключателей var myString= "The checkbox is "; // переключатель включен, или нет? if (document.myForm.myCheckbox.checked) myString+= "checked" else myString+= "not checked"; // вывод строки на экран alert(myString); } // --> </script> </head> <body bgcolor=lightblue> <form name="myForm"> <input type="text" name="myText" value="bla bla bla"> <input type="button" name="button1" value="Button 1" onClick="first()"> <br> <input type="checkbox" name="myCheckbox" CHECKED> <input type="button" name="button2" value="Button 2" onClick="second()"> </form> <p><br><br> <script language="JavaScript"> <!-- hide document.write("The background color is: "); document.write(document.bgColor + "<br>"); document.write("The text on the second button is: "); document.write(document.myForm.button2.value); // --> </script> </body> </html> Объект location Кроме объектов window и document в JavaScript имеется еще один важный объект - location. В этом объекте представлен адрес загруженного HTML-документа. Например, если Вы загрузили страницу http://www.xyz.com/page.html, то значение location.href как раз и будет соответствовать этому адресу. <input type=button value="Yahoo" onClick="location.href='http://www.yahoo.com'; "> </form> Часть3 Создание фреймов Один из часто задаваемых вопросов - как фреймы и JavaScript могут работать вместе. Сначала я хотел бы объяснить, что такое фреймы и для чего они могут использоваться. Затем мы рассмотрим, как можно использовать JavaScript совместно с фреймами. <frameset rows="50%,50%"> <frame src="page1.htm" name="frame1"> <frame src="page2.htm" name="frame2"> </frameset> </html> В результате будут созданы два фрейма. Вы можете заметить, что во фрейме <frameset> мы используем свойство rows. Это означает, два наших фрейма будут расположены друг над другом. В верхний фрейм будет загружена HTML-страница page1.htm, а в нижнем фрейме разместится документ page2.htm. Окончательно созданная структура фреймов будет выглядеть следующим образом: Если Вы хотите, чтобы документы располагались не друг над другом, а рядом то, Вам следует в тэге <frameset> писать rows, а cols. Фрагмент "50%,50%" сообщает, насколько велики должны быть оба получившихся окна. Вы имеете также возможность записать "50%,*", если не хотите утруждать себя расчетами, насколько велик должен быть второй фрейм, чтобы в сумме получалась все те же 100%. Вы можете также задать размер фрейма в пикселах, для чего достаточно после числа не ставить символ %. При создании web-страниц Вы можете использовать несколько вложенных тегов <frameset>. Следующий пример я нашел в документации, предоставляемой фирмой Netscape, (и слегка изменил его): <frameset cols="50%,50%"><frameset rows="50%,50%"> <frame src="cell.htm"> <frame src="cell.htm"> </frameset> <frameset rows="33%,33%,33%"> <frame src="cell.htm"> <frame src="cell.htm"> <frame src="cell.htm"> </frameset> </frameset> В результате созданная структура фреймов будет выглядеть следующим образом: Вы можете задать толщину границы между фреймами, воспользовавшись в теге <frameset> параметром border. Запись border=0 означает, что Вы не хотите, чтобы между тегами имелась какая-либо граница (в Netscape 2.x такой механизм не работает). Фреймы и JavaScript А теперь давайте посмотрим, как JavaScript "видит" фреймы, присутствующие в окне браузера. Для этой цели мы создадим два фрейма, как было показано в первом примере этой части описания. В вершине иерархии находится окно браузера (browser window). В данном случае он разбито на два фрейма. Таким образом, окно, как объект, является родоначальником, родителем данной иерархии (parent), а два фрейма - соответственно, его потомки (children). Мы присвоили этим двум фреймам уникальные имена - frame1 и frame2. И с помощью этих имен мы можем обмениваться информацией с двумя указанными фреймами.
С точки зрения объекта "окно" (window) два указанных фрейма называются frame1 и frame2. Как можно видеть на предыдущем рисунке, существует прямая взаимосвязь между родительским окном и каждым фреймом. Так образом, если Вы пишете скрипт для родительского окна - то есть для страницы, создающей эти фреймы - то можете обращаться к этим фреймам, просто называя их по имени. Например, можно написать: frame2.document.write("Это сообщение передано от родительского окна."); В некоторых случаях Вам понадобится, находясь во фрейме, получать доступу к родительскому окну. Например, это бывает необходимо, если Вы хотите при следующем переходе избавиться от фреймов. В таком случае удаление фреймов означает лишь загрузку новой страницы вместо содержавшей фреймы. В нашем случае это загрузка страницы в родительское окно. Сделать это нам поможет доступ к родительскому- parent - окну (или родительскому фрейму) из фреймов, являющихся его потомками. Чтобы загрузить новый документ, мы должны внести в location.href новый адрес URL. Поскольку мы хотим избавиться от фреймов, следует использовать объект location из родительского окна. (Напомним, что в каждый фрейм можно загрузить собственную страницу, то мы имеем для каждого фрейма собственный объект location). Итак, мы можем загрузить новую страницу в родительское окно с помощью команды: parent.location.href= "http://...";И наконец, очень часто Вам придется решать задачу обеспечения доступа с одного фрейма-потомка к другому такому же фрейму-потомку. Итак, как можно, находясь в первом фрейме, записать что-либо во второй - то есть, которой командой следует воспользоваться на HTML-странице page1.htm? Как можно увидеть на нашем рисунке, между двумя этими фреймами нет никакой прямой связи. И потому мы не можем просто так вызвать frame2, находясь в фрейме frame1, который просто ничего не знает о существовании второго фрейма. С точки же зрения родительского окна второй фрейм действительно существует и называется frame2, а к самому родительскому окну можно обратиться из первого фрейма по имени parent. Таким образом, чтобы получить доступ к объекту document, разместившемуся во втором фрейме, мы должны написать следующее,: parent.frame2.document.write("Привет, это вызов из первого фрейма.");Навигационные панели Давайте рассмотрим, как создаются навигационные панели. В одном фрейме мы создаем несколько ссылок. Однако, если посетитель активирует какую-либо из них, соответствующая страница будет помещена не в тот же самый фрейм, а в соседний. Сперва нам необходимо написать скрипт, создающий указанные фреймы. Такой документ выглядит точно так же, как и тот, что мы рассматирвали ранее в этой части описания: frames3.htm <html><frameset rows="80%,20%"> <frame src="start.htm" name="main"> <frame src="menu.htm" name="menu"> </frameset> </html> Здесь start.htm - это та страница, которая первоначально будет показана в главном фрейме (main). У нас нет никаких специальных требований к содержимому этой страницы. Следующая web-страница будет загружена во фрейм "menu": menu.htm <html><head> <script language="JavaScript"> <!-- hide function load(url) { parent.main.location.href= url; } // --> </script> </head> <body> <a href="javascript:load('first.htm')">first</a> <a href="second.htm" target="main">second</a> <a href="third.htm" target="_top">third</a> </body> </html> Здесь Вы можете увидеть несколько способов загрузки новой страницы во фрейм main. В первой ссылке для этой цели используется функция load(). Давайте посмотрим, как это делается: <a href="javascript:load('first.htm')">first</a>Как Вы можете видеть, вместо явной загрузки новой страницы мы предлагаем браузеру выполнить некую команду на языка JavaScript - для этого мы всего лишь должны воспользоваться параметром javascript: вместо обычного href. Далее, внутри скобок можно увидеть 'first.htm'. Эту строка передается в качестве аргумента функции load(). Сама же функция load() определяется следующим образом: function load(url) {parent.main.location.href= url; } Здесь Вы можете увидеть, что внутри скобок написано url. Это означает, что в нашем примере строка 'first1.htm' при вызове функции заносится в переменную url. И эту новую переменную теперь можно использовать при работе внутри функций load(). Позже мы познакомимся с другими примерами использования важной концепции переменных. Итак, который способ Вам следует выбрать? Это зависит от вашего скрипта и от того, что собственно Вы хотите сделать. Параметр target использовать очень просто. Вы можете воспользоваться им, если хотите всего лишь загрузить новую страницу в другой фрейм. Решение на основе языка JavaScript (примером этого служит первая ссылка) обычно используется, если Вы хотите, чтобы при активизации ссылки произошло несколько вещей. Одна из наиболее часто возникающих проблем такого рода состоит в том, чтобы разом загрузить две страницы в два различных фрейма. И хотя Вы могли бы решить эту задачи с помощью параметра target, использование функции JavaScript в этом случае более предпочтительно. Предположим, мы имеем три фрейма с именами frame1, frame2 и frame3.Допустим посетитель активирует ссылку в frame1. И мы хотим, чтобы при этом в два других фрейма загружались две различные web-страницы. В качестве решения этой задачи Вы можете, например, воспользоваться функцией: function loadtwo() {parent.frame1.location.href= "first.htm"; parent.frame2.location.href= "second.htm"; } Если же Вы хотите сделать функцию более гибкой, то можете воспользоваться возможностью передачи переменной в качестве аргумента. Результат будет выглядеть как: function loadtwo(url1, url2) {parent.frame1.location.href= url1; parent.frame2.location.href= url2; } После этого можно организовать вызов функции: loadtwo("first.htm", "second.htm") или loadtwo("third.htm", "forth.htm"). Очевидно, передача аргументов делает Вашу функцию более гибкой. В результате Вы можете использовать ее многократно и в различных контекстах.
Часть4 Создание окон Открытие новых окон в браузере - грандиозная возможность языка JavaScript. Вы можете либо загружать в новое окно новые документы (например, те же документы HTML), либо (динамически) создавать новые материалы. Посмотрим сначала, как можно открыть новое окно, потом как загрузить в это окно HTML-страницу и, наконец, как его закрыть. <head> <script language="JavaScript"> <!-- hide function openWin() { myWin= open("mag.htm"); } // --> </script> </head> <body> <form> <input type="button" value="Открыть новое окно" onClick="openWin()"> </form> </body> </html> В представленном примере в новое окно с помощью метода open() записывается страница mag.htm. Заметим, что Вы имеете возможность управлять самим процессом создания окна. Например, Вы можете указать, должно ли новое окно иметь строку статуса, панель инструментов или меню. Кроме того Вы можете задать размер окна. Например, в следующем скрипте открывается новое окно размером 400x300 пикселов. Оно не имеет ни строки статуса, ни панели инструментов, ни меню. <html><head> <script language="JavaScript"> <!-- hide function openWin2() { myWin= open("bla.htm", "displayWindow", "width=400,height=300,status=no,toolbar=no,menubar=no"); } // --> </script> </head> <body> <form> <input type="button" value="Открыть новое окно" onClick="openWin2()"> </form> </body> </html> Как видите, свойства окна мы формулируем в строке "width=400,height=300,status=no,toolbar=no,menubar=no". Обратите внимание также и на то, что Вам не следует помещать в этой строке символы пробела Список свойств окна, которыми Вы можете управлять:
В версии 1.2 языка JavaScript были добавлены некоторые новые свойства (то есть в Netscape Navigator 4.0). Вам не следует пользоваться этими свойствами, готовя материалы для Netscape 2.x, 3.x или Microsoft Internet Explorer 3.x, поскольку эти браузеры не понимают языка 1.2 JavaScript. Новые свойства окон:
Вы можете найти толкование этих свойств в описании языка JavaScript 1.2. В дальнейшем я для некоторых из них дам разъяснение и примеры использования. Имя окна Как видите, открывая окна, мы должны использовать три аргумента: myWin= open("bla.htm", "displayWindow","width=400,height=300,status=no,toolbar=no,menubar=no"); А для чего нужен второй аргумент? Это имя окна. Ранее мы видели, как оно использовалось в параметре target. Так, если Вы знаете имя окна, то можете загрузить туда новую страницу с помощью записи <a href="bla.html" target="displayWindow">При этом Вам необходимо указать имя соответствующего окна (если же такого окна не существует, то с этим именем будет создано новое). Закрытие окон Вы можете также закрывать окна с помощью языка JavaScript. Чтобы сделать это, Вам понадобится метод close(). Давайте, как было показано ранее, откроем новое окно. И загрузим туда очередную страницу: <html><script language="JavaScript"> <!-- hide function closeIt() { close(); } // --> </script> <center> <form> <input type=button value="Close it" onClick="closeIt()"> </form> </center> </html> Если теперь в новом окне Вы нажмете кнопку, то оно будет закрыто. Динамическое создание документов Теперь мы готовы к рассмотрению такой замечательной возможности JavaScript , как динамическое создание документов. То есть Вы можете разрешить Вашему скрипту на языке JavaScript самому создавать новые HTML-страницы. Более того, Вы можете таким же образом создавать и другие документы Web, такие как VRML-сцены и т.д. Для удобства Вы можете размещать эти документы в отдельном окне или фрейме. <head> <script language="JavaScript"> <!-- hide function openWin3() { myWin= open("", "displayWindow", "width=500,height=400,status=yes,toolbar=yes,menubar=yes"); // открыть объект document для последующей печати myWin.document.open(); // генерировать новый документ myWin.document.write("<html><head><title>On-the-fly"); myWin.document.write("</title></head><body>"); myWin.document.write("<center><font size=+3>"); myWin.document.write("This HTML-document has been created "); myWin.document.write("with the help of JavaScript!"); myWin.document.write("</font></center>"); myWin.document.write("</body></html>"); // закрыть документ - (но не окно!) myWin.document.close(); } // --> </script> </head> <body> <form> <input type=button value="On-the-fly" onClick="openWin3()"> </form> </body> </html> Давайте рассмотрим функцию winOpen3 (). Очевидно, мы сначала открываем новое окно браузера. Поскольку первый аргумент функции open() - пустая строка (""), то это значит, что мы не желаем в данном случае указывать конкретный адрес URL. Браузер должен только не обработать имеющийся документ - JavaScript обязан создать дополнительно новый документ. myWin.document.open(); Здесь мы обращаемся к open() - методу объекта document. Однако это совсем не то же самое, что метод open() объекта window! Эта команда не открывает нового окна - она лишь готовит document к предстоящей печати. Кроме того, мы должны поставить перед document.open() приставку myWin, чтобы получить возможность писать в новом окне. myWin.document.write("<html><head><title>On-the-fly"); myWin.document.write("</title></head><body>"); myWin.document.write("<center><font size=+3>"); myWin.document.write("This HTML-document has been created "); myWin.document.write("with the help of JavaScript!"); myWin.document.write("</font></center>"); myWin.document.write("</body></html>"); Как видно, здесь мы записываем в документ обычные тэги языка HTML. То есть мы фактически генерируем разметку HTML! При этом Вы можете использовать абсолютно любые теги HTML. myWin.document.close(); Как я уже говорил, Вы можете не только динамически создавать документы, но и по своему выбору размещать их в в том или ином фрейме. Например, если Вы получили два фрейма с именами frame1 и frame2, а теперь во frame2 хотите сгенерировать новый документ, то для этого в frame1 Вам достаточно будет написать следующее: parent.frame2.document.open();parent.frame2.document.write("Here goes your HTML-code"); parent.frame2.document.close(); Часть5
Составленные Вами программы на JavaScript могут выполнять запись в строку состояния - прямоугольник в нижней части окна Вашего браузера. Все, что Вам необходимо для этого сделать - всего лишь записать нужную строку в window.status. В следующем примере создаются две кнопки, которые можно использовать, чтобы записывать некий текст в строку состояния и, соответственно, затем его стирать. Данный скрипт выглядит следующим образом: <html><head> <script language="JavaScript"> <!-- hide function statbar(txt) { window.status = txt; } // --> </script> </head> <body> <form> <input type="button" name="look" value="Писать!" onClick="statbar('Привет! Это окно состояния!');"> <input type="button" name="erase" value="Стереть!" onClick="statbar('');"> </form> </body> </html> Итак, мы создаем форму с двумя кнопками. Обе эти кнопки вызывают функцию statbar(). Вызов от клавиши Писать! выглядит следующим образом: statbar('Привет! Это окно состояния!');В скобках мы написали строку: 'Привет! Это окно состояния!'. Это как раз и будет текст, передаваемый функции statbar(). В свою очередь, можно видеть, что функция statbar() определена следующим образом: function statbar(txt) {window.status = txt; } В заголовке функции в скобках мы поместили слово txt. Это означает, что строка, которую мы передали этой функции, помещается в переменную txt. Механизм вывода текста в строку состояния удобно использовать при работе со ссылками. Вместо того, чтобы выводить на экран URL данной ссылки, Вы можете просто на словах объяснять, о чем будет говориться на следующей странице. Так link демонстрирует это - достаточно лишь поместить указатель вашей мыши над этой ссылкой: Исходный код этого примера выглядит следующим образом: <a href="dontclck.htm"onMouseOver="window.status='Don't click me!'; return true;" onMouseOut="window.status='';">link</a> Здесь мы пользуемся процедурами onMouseOver и onMouseOut, чтобы отслеживать моменты, когда указатель мыши проходит над данной ссылкой. Таймеры С помощью функции Timeout (или таймера) Вы можете запрограммировать компьютер на выполнение некоторых команд по истечении некоторого времени. В следующем скрипте демострируется кнопка, которая открывает выпадающее окно не сразу, а по истечении 3 секунд. Скрипт выглядит следующим образом: <script language="JavaScript"><!-- hide function timer() { setTimeout("alert('Врем\я истекло!')", 3000); } // --> </script> ... <form> <input type="button" value="Timer" onClick="timer()"> </form> Здесь setTimeout() - это метод объекта window. Он устанавливает интервал времени - я полагаю, Вы догадываетесь, как это происходит. Первый аргумент при вызове - это код JavaScript, который следует выполнить по истечении указанного времени. В нашем случае это вызов - "alert('Время истекло!')". Обратите пожалуйста внимание, что код на JavaScript должен быть заключен в кавычки. Прокрутка Теперь, когда Вы знаете, как делать записи в строке состояния и как работать с таймерами, мы можем перейти к управлению прокруткой. Вы уже могли видеть, как текст перемещается строке состояния. В Интернет этим приемом пользуются повсеместно. Теперь же мы рассмотрим, как можно запрограммировать прокрутку в основной линейке. Рассмотрим также и всевозможные усовершенствования этой линейки. Эта кнопка откроет окно и покажет образец прокрутки: Итак, исходный код скрипта - я добавил к нему еще некоторые комментарии: <html><head> <script language="JavaScript"> <!-- hide // define the text of the scroller var scrtxt = "Это JavaScript! " + "Это JavaScript! " + "Это JavaScript!"; var len = scrtxt.length; var width = 100; var pos = -(width + 2); function scroll() { // напечатать заданный текст справа и установить таймер // перейти на исходную позицию для следующего шага pos++; // вычленить видимую часть текста var scroller = ""; if (pos == len) { pos = -(width + 2); } // если текст еще не дошел до левой границы, то мы должны // добавить перед ним несколько пробелов. В противном случае мы должны // вырезать начало текста (ту часть, что уже ушла за левую границу if (pos < 0) { for (var i = 1; i <= Math.abs(pos); i++) { scroller = scroller + " ";} scroller = scroller + scrtxt.substring(0, width - i + 1); } else { scroller = scroller + scrtxt.substring(pos, width + pos); } // разместить текст в строке состо\яни\я window.status = scroller; // вызвать эту функцию вновь через 100 миллисекунд setTimeout("scroll()", 100); } // --> </script> </head> <body onLoad="scroll()"> Это пример прокрутки в строке состояния средствами JavaScript. </body> </html> Большая часть функции scroll() нужна для вычленения той части текста, которая будет показана пользователю. Я не буду объяснять этот код подробно - Вам необходимо лишь понять, как вообще осуществляется эта прокрутка.
Часть6 Объект Date В JavaScript Вам разрешено пользоваться некоторыми заранее заданными объектами. Примерами таких объектов могут служить Date, Array или Math. Есть еще несколько таких же объектов - полное описание см. в документации, предоставляемой фирмой Netscape. Здесь создается новый объект Date, с именем today. Если при создании этого нового объекта Date Вы не указали какой-либо определенной даты и времени, то будут предоставлены текущие дата и время. То есть, после выполнения команды today= new Date() вновь созданный объект today будет указывать именно те дату и время, когда данная команда была выполнена. При этом будет создан объект Date, в котором будет зафиксировано первое января 1997 года 17:35 и 23 секунд. Таким образом, Вы выбираете дату и время по следующему шаблону: Date(year, month, day, hours, minutes, seconds)Заметьте, что для обозначения января Вы должны использовать число 0, а не 1, как Вы вероятно думали. Число 1 будет обозначать февраль, ну и так далее. Теперь мы напишем скрипт, печатающий текущие дату и время. Результат будет выглядеть следующим образом: Сам же код выглядит следующим образом: <script language="JavaScript"><!-- hide now=new Date(); document.write("Time:"+now.getHours()+":" +now.getMinutes()+"<br>"); document.write("Date:"+(now.getMonth()+1) +"/"+now.getDate()+"/"+ (now.getYear())); // --> </script> Здесь мы пользуемся такими методами,какgetHours(),чтобы вывести на экран время и дату,указанные
вобъектеDateс именемnow.
Помните также,что мы обязаны увеличивать на единицу значение, получаемое
от методаgetMonth(). Рассмотрим теперь скрипт, создающий на экране изображение работающих часов: Исходный код скрипта: <html><head> <script Language="JavaScript"> <!-- hide var timeStr,dateStr; function clock(){ now=new Date(); // врем\я hours=now.getHours(); minutes=now.getMinutes(); seconds=now.getSeconds(); timeStr=""+hours; timeStr+=((minutes<10)?":0":":")+minutes; timeStr+=((seconds<10)?":0":":")+seconds; document.clock.time.value=timeStr; // дата date=now.getDate(); month=now.getMonth()+1; year=now.getYear(); dateStr=""+month; dateStr+=((date<10)?"/0":"/")+date; dateStr +="/"+year; document.clock.date.value=dateStr; Timer=setTimeout("clock()",1000); } // --> </script> </head> <body onLoad="clock()"> <form name="clock"> Время: <input type="text"name="time"size="8"value=""><br> Дата: <input type="text"name="date"size="8"value=""> </form> </body> </html> Здесь для ежесекундной коррекции времени и даты мы пользуемся методом
setTimeout().Фактически это сводится к кому,
что мы каждую секунду создаем новый объектDate,
занося туда текущее время. Как видим, количество минут заносится в строкуtimeStr.Если у нас менее 10минут, то мы еще должны приписать спереди0. Для Вас эта строка в скрипте может показаться немного странной,и ее можно было бы переписать в более знакомом Вам виде: if(minutes<10)timeStr+=":0"+minuteselse timeStr+=":"+minutes; ОбъектArray Массивы играют в программировании очень важную роль. Подумайте только,
чтобы Вы делали, если бы Ва мпонадобилось хранить 100 различных имен.
Как бы Вы могли это сделать с помощью JavaScript? Хорошо, Вы могли бы
явным образом задать 100 переменных и присвоить им различные имена. Но
согласитесь, это будет весьма утомительно. myArray[1]="Stefan"; myArray[2]="Koch"; Массивы JavaScript обладают большой гибкостью. Например, Вам нет нужды
беспокоиться о размере массива - он устанавливается динамически. Если
Вы напишетеmyArray[99]="xyz",
размер массива будет установлен 100 элементов.( В языке JavaScript размер
массива может только увеличиваться - массив не может "сжиматься ".
Поэтому старайтесь делать Ваши массивы как можно копактнее.) second element third element Исходный код: <script language="JavaScript"><!-- hide myArray=new Array(); myArray[0]="first element"; myArray[1]="second element"; myArray[2]="third element"; for(var i=0;i<3;i++){ document.write(myArray[i]+"<br>"); } // --> </script> Первым делом мы создаем здесь новый массив с именем myArray. Затеммы заносим в него три различных значения. После этого мы запускаем цикл, который трижды выполняет командуdocument.write(myArray[i] +"<br>");.В переменнойiведется отсчет циклов от 0 до 2. Заметим, что в цикле мыпользуемся конструкцией myArray[i]. И поскольку i меняет значения от 0 до 2, то в итоге мы получаем три различных вызова document.write(). Иными словами, мы могли бы расписать этот цикл как: document.write(myArray[0]+"<br>");document.write(myArray[1]+"<br>"); document.write(myArray[2]+"<br>"); МассивывJavaScript 1.0 Поскольку в JavaScript 1.0 (Netscape Navigator 2.x,и Microsoft Internet Explorer 3.x) объекта Array еще не существовало, то мы должны думать и об его альтернативе. Следующий фрагмент кода можно найти в документации фирмыNetscape: function initArray(){this.length=initArray.arguments.length for(var i=0;i<this.length;i++) this[i+1]=initArray.arguments[i] } После этого Вы можете создавать массив одной строкой: myArray=new initArray(17,3,5);Числа в скобках - значения, которыми инициализируется массив (это можно также делать и с объектом Array из JavaScript 1.1). Обратите внимание, что данный тип массива не может включать все элементы, которые являются частью в объекта Array от JavaScript 1.1(например, там имеется метод sort(),который позволяет сортировать все элементы в определенном порядке). Объект Math Если Вам необходимо в скрипте выполнять математические рассчеты, то некоторые
полезные методы для этого Вы найдете в объекте Math.
Например, имеется метод синуса sin(). Полную
информацию об этом объекте В ынайдете в документации фирмы Netscape.
Часть7
Проверка информации, введенной в форму Формы широко используются на Интернет. Информация, введенная в форму, часто посылается обратно на сервер или отправляется по электронной почте на некоторый адрес. Проблема состоит в том, чтобы убедиться, что введеная пользователем в форму информация корректна. Легко проверить ее перед пересылкой в Интернет можно с помощью языка JavaScript. Сначала я бы хотел продемонстрировать, как можно выполнить проверку формы. А затем мы рассмотрим, какие есть возможности для пересылки информации по Интернет. Сперва нам необходимо создать простой скрипт. Допустим, HTML-страница содержит два элемента для ввода текста. В первый из них пользователь должен вписать свое имя, во второй элемент - адрес для электронной почты. Вы можете ввести туда какую-нибудь информацию и нажать клавишу. Попробуйте также нажать клавишу, не введя в форму никакой информации. Что касается информации, введенной в первый элемент, то Вы будете получать сообщение об ошибке, если туда ничего не было введено. Любая представленная в элементе информация будет рассматриваться на предмет корректности. Конечно, это не гарантирует, что пользователь введет не то имя. Браузер даже не будет возражать против чисел. Например, если Вы ввведете '17', то получите приглашение 'Hi 17!'. Так что эта проверка не может быть идеальна. Как скрипт работает с этими двумя элементами формы и как выглядит проверка? Это происходит следующим образом: <html><head> <script language="JavaScript"> <!-- Скрыть function test1(form) { if (form.text1.value == "") alert("Пожалуйста, введите строку!") else { alert("Здравствуйте, "+form.text1.value+"!Форма заполнена корректно!"); } } function test2(form) { if (form.text2.value == "" || form.text2.value.indexOf('@', 0) == -1) alert("Неверно введен адрес e-mail!"); else alert("OK!"); } // --> </script> </head> <body> <form name="first"> Введите Ваше имя:<br> <input type="text" name="text1"> <input type="button" name="button1" value="Проверка" onClick="test1(this.form)"> <P> Введите Ваш адрес e-mail:<br> <input type="text" name="text2"> <input type="button" name="button2" value="Проверка" onClick="test2(this.form)"> </body> </html> Рассмотрим сначала HTML-код в разделе body. Здесь мы создаем лишь два элемента для ввода текста и две кнопки. Кнопки вызывают функции test1(...) или test2(...), в зависимости от того, которая из них была нажата. В качестве аргумента к этим функциям мы передаем комбинацию this.form, что позже позволит нам адресоваться в самой функции именно к тем элементам, которые нам нужны. Проверка на присутствие определенных символов В некоторых случаях Вам понадобится ограничивать информацию, вводимую в форму, лишь некоторым набором символов или чисел. Достаточно вспомнить о телефонных номерах - представленная информация должна содержать лишь цифры (предполагается, что номер телефона, как таковой, не содержит никаких символов). Нам необходимо проверять, являются ли введенные данные числом. Сложность ситуации состоит в том, что большинство людей вставляют в номер телефона еще и разные символы - например: 01234-56789, 01234/56789 или 01234 56789 (с символом пробела внутри). Не следует принуждать пользователя отказываться от таких символов в телефонном номере. А потому мы должны дополнить наш скрипт процедурой проверки цифр и некоторых символов. Исходный код этого скрипта: <html><head> <script language="JavaScript"> <!-- hide function check(input) { var ok = true; for (var i = 0; i < input.length; i++) { var chr = input.charAt(i); var found = false; for (var j = 1; j < arguments.length; j++) { if (chr == arguments[j]) found = true; } if (found) ok = false; } return ok; } function test(input) { if (!check(input, "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "/", "-", " ")) { alert("Input ok."); } else { alert("Input not ok!"); } } // --> </script> </head> <body> <form> Telephone: <input type="text" name="telephone" value=""> <input type="button" value="Check" onClick="test(this.form.telephone.value)"> </form> </body> </html> Функция test() определяет, какие из введенных символов признаются корректными. Предоставление информации, введенной в форму Какие существуют возможности для передачи информации, внесенной в форму? Самый простой способ состоит в передаче данных формы по электронной почте (этот метод мы рассмотрим поподробнее). <form method=post action="mailto:your.address@goes.here" enctype="text/plain"> Нравится ли Вам эта страница? <input name="choice" type="radio" value="1">Вовсе нет.<br> <input name="choice" type="radio" value="2" CHECKED> Напрасная трата времени.<br> <input name="choice" type="radio" value="3">Самый плохой сайт в Сети.<br> <input name="submit" type="submit" value="Send"> </form> Параметр enctype="text/plain" используется для того, чтобы пересылать именно простой текст без каких-либо кодируемых частей. Это значительно упрощает чтение такой почты. Если Вы хотите проверить форму прежде, чем она будет передана в сеть, то для этого можете воспользоваться программой обработки событий onSubmit. Вы должны поместить вызов этой программы в тег <form>. Например: function validate() { // check if input ok // ... if (inputOK) return true else return false; } ... <form ... onSubmit="return validate()"> ... Форма, составленная таким образом, не будет послана в Интернет, если в нее внесены некорректные данные. Выделение определенного элемента формы С помощью метода focus() Вы можете сделать вашу форму более дружественной. Так, Вы можете выбрать, который элемент будет выделен в первую очередь. Либо Вы можете приказать браузеру выделить ту форму, куда были введены неверные данные. То есть, что браузер сам установит курсор на указанный Вами элемент формы, так что пользователю не придется щелкать по форме, прежде чем что-либо занести туда. Сделать это Вы можете с помощью следующего фрагмента скрипта: function setfocus() {document.first.text1.focus(); } Эта запись могла бы выделить первый элемент для ввода текста в скрипте, который я уже показывал. Вы должны указать имя для всей формы - в данном случае она называется first - и имя одного элемента формы - text1. Если Вы хотите, чтобы при загрузке страницы данный элемент выделялся, то для этого Вы можете дополнить Ваш тег <body> атрибутом onLoad. Это будет выглядеть как: <body onLoad="setfocus()">Остается еще дополнить пример следующим образом: function setfocus() {document.first.text1.focus(); document.first.text1.select(); } Попробуйте следующий код: При этом не только будет выделен элемент, но и находящийся в нем текст.
Часть8 Изображения на web-странице Рассмотрим теперь объект Image, который стал доступен, начиная с версии с 1.1 языка JavaScript (то есть с Netscape Navigator 3.0). С помощью объекта Image Вы можете вносить изменения в графические образы, присутствующие на web-странице. В частности, это позволяет нам создавать мультипликацию. то Вы сможете обращаться к нему, написав document.myImage или document.images["myImage"]. Загрузка новых изображений Хотя конечно и хорошо знать, как можно получить размер изображения на web-странице, это не совсем то, чего бы мы хотели. Мы хотим осуществлять смену изображений на web-странице и для этого нам понадобится атрибут src. Как и в случае тега <img>, атрибут src содержит адрес представленного изображения. Теперь - в языке JavaScript 1.1 - Вы имеете возможность назначать новый адрес изображению, уже загруженному в web-страницу. И в результате, изображение будет загружено с этого нового адреса, заменив на web-странице старое. Рассмотрим к примеру запись: img src="img1.gif" name="myImage" width=100 height=100>Здесь загружается изображение img1.gif и получает имя myImage. В следующей строке прежнее изображение img1.gif заменяется уже на новое - img2.gif: document.myImage.src= "img2.jpg";При этом новое изображение всегда получает тот же размер, что был у старого. И Вы уже не можете изменить размер поля, в котором это изображение размещается. Упреждающая загрузка изображения Один из недостатков такого подхода может заключаться в том, что после записи в src нового адреса начинает процесс загрузки соответствующего изображения. И поскольку этого не было сделано заранее, то еще пройдет некоторое время, прежде чем новое изображение будет передано через Интернет и встанет на свое место. В некоторых ситуациях это допустимо, однако часто подобные задержки неприемлемы. И что же мы можем сделать с этим? Конечно, решением проблемы была бы упреждающая загрузка изображения. Для этого мы должны создать новый объект Image. Рассмотрим следующие строки: hiddenImg= new Image();hiddenImg.src= "img3.gif"; В первой строке создается новый объект Image. Во второй строке указывается адрес изображения, которое в дальнейшем будет представлено с помощью объекта hiddenImg. Как мы уже видели, запись нового адреса в атрибуте src заставляет браузер загружать изображение с указанного адреса. Поэтому, когда выполняется вторая строка нашего примера, начинает загружаться изображение img2.gif. Но как подразумевается самим названием hiddenImg ("скрытая картинка"), после того, как браузер закончит загрузку, изображение на экране не появится. Оно будет лишь будет сохранено в памяти компьютера (или точнее в кэше) для последующего использования. Чтобы вызвать изображение на экран, мы можем воспользоваться строкой: document.myImage.src= hiddenImg.src;Но теперь изображение уже немедленно извлекается из кэша и показывается на экране. Таким образом, сейчас мы управляли упреждающей загрузкой изображения. Изменение изображений в связи с событиями, инициируемыми самим читателем Вы можете создать красивые эффекты, используя смену изображений в качестве реакции на определенные события. Например, Вы можете изменять изображения в тот момент, когда курсор мыши попадает на определенную часть страницы. Проверьте, как работает следующий пример, просто поместив курсор мыши на картинку (впрочем, при этом Вы получите сообщение об ошибке, если пользуетесь браузером, поддерживающим лишь JavaScript 1.0 - как этого избежать, мы узнаем чуть позже). Исходный код этого примера выглядит следующим образом: onMouseOver="document.myImage2.src='img2.gif'" onMouseOut="document.myImage2.src='img1.gif'"> <img src="img1.gif" name="myImage2" width=160 height=50 border=0></a Изображения - без сомнения могучее средство уличшения Вашей web-страницы. Объект Image дает Вам возможность создавать действительно сложные эффекты. Однако заметим, что не всякое изображение или программа JavaScript способно улучшить Вашу страницу. Если Вы пройдетесь по Сети, то сможете увидеть множество примеров, где изображения использованы самым ужасным способом. Не количество изображений делает Вашу web-страницу привлекательной, а их качество. Сама загрузка 50 килобайт плохой графики способна вызвать раздражение. При создании специальных эффектов с изображениями с помощью JavaScript помните об этом и ваши посетителями/клиентами будут чаще возвращаться на Ваши страницы.
Часть9 Что такое слои? Слои - это одна из замечательных новых возможностей браузера Netscape Navigator 4.0. Она позволяет выполнять точное позиционирование таких объектов web-страницы, как изображения. Кроме того, теперь Вы можете перемещать объекты по вашей HTML-странице. Вы можете также делать объекты невидимыми. Что такое в действительности слои? Объяснять это очень легко на простом примере: берете несколько листов бумаги. На одном листе пишете текст. На другом - рисуете картинку. На третьем листе берете картинку и вписываете вокруг нее некий текст. И так далее. Теперь кладете эти листы на стол. Допустим, каждый лист - это некий слой. В этом смысле слой представляет собой в некотором роде контейнер. То есть он может включать в себя (содержать) некие объекты - в данном случае это будет текст и изображения. Создание слоев Чтобы создать слой, мы должны использовать либо тег <span> либо <div>. Вы можете воспользоваться следующими параметрами:
Давайте теперь начнем с простого примера. Мы хотим создать два слоя. В первом из них мы помещаем изображение, а во втором - текст. Все, что мы хотим сделать - показать этот текст поверх данного изображения. <html><span ID="pic" STYLE="position:absolute; left:148px; top:226px; z-index:0"> <img src="img.gif" WIDTH=428 HEIGHT=263> </span> <span ID="txt" STYLE="position:absolute; left:193px; top:466px; z-index:1"> <font size=+5>Египетский сфинкс</font> </span> </html> Как видим, с помощью тега <span> мы формируем два слоя. Оба слоя позиционируются через параметры left и top. Все, что находится между тегами <span> и </span> (или тегами <ilayer> и </ilayer>) принадлежит описываемому слою. Слои и JavaScript Рассмотрим теперь, как можно получить доступ к слоям через JavaScript. Начнем же мы с примера, где пользователь получает возможность, нажимая кнопку, прятать или показать некий слой. ... </layer> то в дальнейшем можем получить доступ к нему с помощью конструкции document.layers["myLayer"]. Согласно документации, предоставляемой фирмой Netscape, мы можем также использовать запись document.myLayer - однако в моем браузере это приводит к сбою. Конечно, это всего лишь проблема предварительной версии и в заключительном варианте будет успешно решена (сейчас я пользуюсь Netscape Navigator 4.0 PR3 на WinNT). Однако, по-видимому, нет никаких проблем с конструкцией document.layers["myLayer"] - поэтому мы и будем пользоваться именно такой альтернативой из всех возможных. Слои имеют несколько свойств, которые можно изменять с помощью скрипта на JavaScript. В следующем примере представлена кнопка, которая позволяет Вам скрывать или, наоборот, предоставлять один слой (требуется Netscape Navigator версии 4.0 или выше). Исходный код скрипта выглядит следующим образом: <html><head> <script language="JavaScript"> <!-- hide function showHide() { if (document.all["myLayer"].style.visibility == "visible") document.all["myLayer"].style.visibility= "hidden" else document.all["myLayer"].style.visibility= "visible"; } // --> </script> </head> <body> <div id=myLayer > <font size=+1 color="#0000ff"><i>This text is inside a layer</i></font> </div> <form> <input type="button" value="Show/Hide layer" onClick="showHide()"> </form> </body> </html> Данная кнопка вызывает функцию showHide(). Можно видеть, что в этих функциях реализуется доступ к такому свойству , как видимость. Присвоивая параметру document.all["myLayer"].style.visibility значения "visible" или "hidden", Вы можете показать или скрыть наш слой. Перемещение слоев Свойства left и top определяют задают положение данного слоя. Вы можете менять его, записывая в эти атрибуты новые значения. Например, в следующей строке задается горизонтальное положение слоя в 200 пикселов: document.all["myLayer2"].style.left= 200;Перейдем теперь к программе перемещения слоев - она создает нечто вроде прокрутки внутри окна браузера. Сам скрипт выглядит следующим образом: <html><head> <script language="JavaScript"> <!-- hide var direction; var pos=document.all["myLayer2"].style.posLeft; function move() { if (pos > 0 && pos<200) direction= true; if (direction) pos++ document.all["myLayer2"].left= pos; } // --> </script> </head> <body onLoad="setInterval('move()', 20)"> <div id=myLayer2 style="position:absolute;left:140px;" <font size=+1 color="#0000ff"><i>This text is inside a layer</i></font> </div> </body> </html> Мы создаем слой с именем myLayer2. Можно видеть, что в теге <body>мы пользуемся процедурой onLoad. Нам необходимо начать прокручивание слоя, как только страница будет загружена. В процедуре обработки события onLoad мы пользуемся функцией setInterval(). Это один из новых методов версии 1.2 языка JavaScript (то есть версии JavaScript, реализованной в Netscape Navigator 4.0). Им можно пользоваться, чтобы вызывать некую функцию мвновь и вновь через определенные интервалы времени. В прошлом для этого мы пользовались функцией setTimeout(). Функция setInterval() работает почти так же, однако Вам нужно вызвать ее всего лишь один раз. Часть10 Мы уже обсудили основные понятия новой технологии слоев. В этой же части будут рассмотрены следующие темы:
Вырезка из слоя Можно постулировать, что какая-то (прямоугольная) часть слоя будет нам видима. Все же, что лежит за ее пределами, показано на экране не будет. Такой прием называется вырезанием. Например, в разметке HTML можно задать следующую функцию вырезания: <div style="position:absolute; clip:rect(0 150 150 11);"><img src="img2.jpg" width=510 height=345> </div> Хотя само изображение и имеет размеры 510x345 пикселов, мы можем видеть лишь его малую часть. Данный фрагмент изображения имеет размер 150x139 (пикселов). Первые два значения, указанные в свойстве clip (стиля HTML-тега <div> , указывают верхнее и правое значение вырезаемой части. Следующие два значения указывают нижнее и левое значение. Сказанное можно проиллюстрировать следующим рисунком: Еще более интересных результатов можно добиться, управляя вырезанной частью с помощью языка JavaScript. Точнее, Вы можете изменять значения свойств clipLeft, clipTop, clipRight и clipBottom объекта document.all.div. Достаточно всего лишь занести в одно из этих свойств новое значение, как фрагмент тут же будет кадрирован соответствующим образом . В следующем примере параметры вырезанной части изображения меняются динамически, и в результате у пользователя создается впечатление, будто изображение медленно "растет": Код соответсвующего скрипта: <html><head> <script language="JavaScript"> <!-- hide function show() { var a = document.all.wipe; a.clipBottom=0; a.clipTop=0;a.clipLeft=0; a.clipRight = 0; show1()} function show1() { var a = document.all.wipe; a.clipBottom += 4; a.clipRight += 6; a.style.clip = "rect(" + a.clipTop + " " +a.clipRight + " " + a.clipBottom + " " +a.clipLeft + ")"; if (a.clipBottom<345) setTimeout("show1()", 60);} </script> </head> <body> <div id=wipe style="position:absolute;z-index:-1;clip:rect(0 0 0 0)"> <img name="st" src="img2.jpg" width=510 height=345> </div> <form> <input type=button value="Start" onClick="show()"> </form> </body> </html> Кнопка, представленная в разделе <body>, вызывает функцию show(). В этой функции устанавливаются начальные значения областей вырезки, наличие двух последовательных функций обусловлено циклическим вызовом операций увелечения вырезки, а при одной функции установление начальных значений происходило бы в каждом цикле (происходит зацикливание программы). После этого мы вызываем функцию show1(), которая задает размеры вырезаемой части изображения в зависимости от значений переменных a.clipBottom, a.clipRight . В самом конце процедуры show() мы устанавливаем таймер с помощью вызова setTimeout() - и благодаря этому функция show1() вызывается вновь и вновь. И этот процесс остановится только тогда, когда изображение будет показано целиком. Обратите внимание на синтаксис выражения для установки значений вырезки слою - все четыре значения вводятся одновременно в форме стандартной строки. Вложенные слои Как мы уже видели, слой может содержать несколько различных объектов. Он могут даже включать в себя другие слои. Конечно, может возникнуть вопрос, для чего это нужно. На самом деле есть несколько причин, чтобы пользоваться вложенными слоями. Рассмотрим пример, демонстрирующий применение вложенных слоев. После открытия страницы мы видим две кнопки. Эти кнопки могут запускать и останавливать движение слоев. Также можно видеть, что перемещение слоя parentLayer сопровождается перемещением и другого других слоя, тогда как перемещение слоя layer1 ни на что другое не влияет. Часть11 Новые события Наступило время, рассмотреть модель событий JavaScript 1.2. В JavaScript 1.2 поддерживается обработка следующих событий.
Изучая таблицу, можете увидеть, что была реализована обработка некоторых новых событий. На этом уроке мы и рассмотрим некоторые из них. <head> <script language="JavaScript"> window.onresize= message; function message() { alert("Размер окна изменен!"); } </script> </head> <body> Пожалуйста, измените размер этого окна. </body> </html> В строке window.onresize= message; мы задаем процедуру обработки такого события. Точнее, функция message() будет вызываться всякий раз, как только пользователь изменит размер окна. Возможно, Вы не знакомы с таким способом назначения программ, обрабатывающих события. Однако JavaScript 1.2 ничего нового здесь не привносит. Например, если у Вас есть объект button, то Вы можете определить процедуру обработки события следующим образом: <form name="myForm"><input type="button" name="myButton" onClick="alert ('Click event occured!')"> </form> Однако Вы можете написать это и по-другому: <form name="myForm"><input type="button" name="myButton"> </form> ... <script language="JavaScript> document.myForm.myButton.onclick= message; function message() { alert('Click event occured!'); } </script> Можно подумать, что вторая альтернатива немного сложнее. Однако почему тогда именно ее мы используем в первом скрипте? Причина состоит в том, что объект window нельзя определить через какой-либо определенный тег - поэтому нам и приходится использовать второй вариант. Объект Event В язык JavaScript 1.2 добавлен новый объект Event. Он содержит свойства, описывающие некое событие. Каждый раз, когда происходит какое-либо событие, объект Event передается соответствующей программе обработки. Код скрипта: <div><a href="#" onClick="alert('x: ' + event.x + ' y: ' + event.y); return false;"> <img src="img2.jpg" width=209 height=264 border=3></a> </div> Как видите, в тег <a> мы поместили программу обработки событий onClick, как это мы уже делали в предшествующих версиях JavaScript. Новое здесь заключается в том, что для создания окошка с сообщением мы используем event.x и event.y. А это как раз и есть объект Event, который здесь нам нужен, чтобы узнать координаты мыши. Объект Event получил следующие свойства (их мы рассмотрим в следующих примерах):
(Если не ошибаюсь в Эксплоэре такое понятие как перехват события отсутсвует, во всяком случае нижеследующие примеры не работают, хотя этих эффектов можно достичь используя другой синтаксис DHTML например вместо объекта window используя document. В двух примерах описанный эффект достигается методами работающими в Explorer). Одна из важных особенностей языка - перехват события. Если кто-то, к примеру, щелкает на кнопке, то вызывается программа обработки события onClick, соответствующая этой кнопке. С помощью обработки событий Вы можете добиться того, чтобы объект, соответсвующий вашему окну, документу или слою, перехватывал и обрабатывал событие еще до того, как для этой цели объектом указанной кнопки будет вызван обработчик событий. Точно так же объект вашего окна, документа или слоя может обрабатывать сигнал о событии еще до того, как он достигает своего обычного адресата. <head> <script language="JavaScript"> window.captureEvents(Event.CLICK); window.onclick= handle; function handle(e) { alert("Объект window перехватывает это событие!"); return true; // т.е. проследить ссылку } </script> </head> <body> <a href="test.htm">"Кликните" по этой ссылке.</a> </body> </html> Часть12 Что такое drag & drop? С помощью новой модели событий в языке JavaScript, 1.2 и механизма слоев мы можем реализовать на нашей web-странице схему drag & drop ("перетащил и оставил"). Для этого Вам понадобится по крайней мере Netscape Navigator 4.0, поскольку мы будем пользоваться особенностями языка JavaScript 1.2. Что такое drag & drop? Например, некоторые операционные системы (такие как Win98/NT или MacOS) позволяют Вам стирать файлы, просто перетаскивая их в мусорную карзину. Иными словами, Вы щелкаете клавишей мыши над изображением файла, перетаскиваете его (то есть держите клавишу нажатой и просто двигаете мышь) - drag - в мусорную карзину, а затем отпускаете - drop - его там. Посмотрите пример, который мы будем рассматривать в этой главе. После того, как откроется страница, Вы можете, нажав клавишу мыши, перетаскивать слой в виде желтого прямоугольника (пример достаточно упрощенный он демонстрирует только принцип перетаскивания): Язык JavaScript не поддерживает напрямую механизм drag & drop. Это значит, что у нас нет возможности назначить объекту image свойство dragable (перемещаемый) или что-либо в этом роде. Поэтому мы должны сами писать необходимый для этого код. Впрочем, Вы увидите, что это не так сложно. События при работе с мышью в JavaScript 1.2 Какие события, происходящие при работе с мышью, нам следует использовать? У нас нет такого события, как MouseDrag, однако того же самого мы можем достичь, отслеживая события MouseDown, MouseMove и MouseUp. В версии 1.2 языка JavaScript используется новая модель событий. И без нее мы не смогли бы решить нашу задачу. Я уже говорил об этой новой модели на предыдущем уроке. Однако давайте взглянем на некоторые важные ее части еще раз. Код этого примера: <html><script language="JavaScript"> <!-- document.onclick= displayCoords; function displayCoords() { alert("x: " + event.clientX + " y: " + event.clientY); } // --> </script> "Кликните" клавишей мыши где-нибудь в этом окне. </html> Строка window.onclick= displayCoords;говорит о том, что должно происходить, когда случается событие Click. Конкретнее, здесь сообщается, что в качестве реакции на событие Click браузер должен вызвать процедуру displayCoords() (Заметим, что Вам при этом не следует ставить скобки после слова displayCoords). В свою очередь, displayCoords() - это функция, которая определяется следующим образом: function displayCoords(e) {alert("x: " + e.pageX + " y: " + e.pageY); } Как видите, эта функция имеет аргумент (мы назвали его e). На самом деле это объект Event, который передается на обработку функции displayCoords(). Объект Event имеет свойства pageX и pageY (наряду с другими), из которых моно получить координаты точки, где произошло событие. Окно с сообщением лишь показывает эти значения. MouseDown, MouseMove и MouseUp Как я уже говорил, в языке JavaScript нет события MouseDrag. Поэтому мы должны пользоваться событиями MouseDown, MouseMove и MouseUp, реализуя механизм drag & drop. В следующем примере демонстрируется применение MouseMove - текущие координаты курсора мыши отображаются в окне состояния. Можно видеть, что код скрипта почти такой же, как и в предыдущем примере: <html><script language="JavaScript"> <!-- document.onmousemove= displayCoords; function displayCoords() { status= "x: " + event.clientX + " y: " + event.clientY; } // --> </script> Координаты мыши отображаются в строке состояния. </html> Теперь мы можем объединить оба последних примера. Мы хотим, чтобы были представлены координаты указателя мыши, когда пользователь перемещает мышь, нажав на клавишу. Следующий пример демонстрирует это: Код этого примера выглядит следующим образом: <html><script language="JavaScript"> <!-- document.onmousedown= startDrag; document.onmouseup= endDrag; function startDrag() { document.onmousemove= moveIt; } function moveIt() { // показывать координаты status= "x: " + event.clientX + " y: " + event.clientY; } function St() { status= " " ; } function endDrag(e) { document.onmousemove=St; } // --> </script> Нажмите на клавишу мыши и, не отпуская ее, передвиньте саму мышь. Координаты курсора будут отображаться в строке состояния. </html> function endDrag(e) { Функция moveIt() записывает координаты мыши в окно состояния. Теперь у нс есть все элементы скрипта, необходимые для регистрации событий, связанных с реализацией механизма drag & drop. И мы можем приступить к рисованию на экране наших объектов. Показ движущихся объектов На предыдущих уроках мы видели, как с помощью слоев можно создать перемещающиеся объекты. Все, что мы должны теперь сделать - это определить, по какому именно слою пользователь щелкнул клавишей мыши. И затем этот объект должен двигаться вслед за мышью. Итак, код примера, показанного в начале этого урока: <html> <head> <script language="JavaScript"> <!-- function f() { document.all["dr"].onmousedown= startDrag; document.onmouseup= endDrag;} function startDrag() { document.onmousemove= move; } function St() { status= " " ;} function endDrag() { document.onmousemove=St; } function move() { document.all.dr.style.left=event.clientX; document.all.dr.style.top=event.clientY; } </script> </head> <body onLoad="f()"> <div id=dr style="position: absolute; left:50; top:50; height:100; width:100; background-color:yellow";dragEnabled> </body> </html> |