Welikeit.Ru | |
|
| |
|
|
Веб-дизайн - Учебники - Сайтостроительсво и веб-дизайн - Глава 18 JavaScript и пользовательский вводГлава 18. JavaScript и пользовательский ввод События Java Script Вы узнаете о том, как обрабатывать введенные в HTML-формы данные, применяя JavaScript, как производить вычисления и возвращать значения. Также мы поговорим о том, как работать с полноценными формами, то есть обрабатывать ошибки, сообщать о неправильно введенных данных до отправки их на обработку CGI-скриптами. Наконец, мы рассмотрим некоторые интересные методы автоматизации работы с сайтом, реализуемые на JavaScript. Среди них автоматическая переадресация, загрузка страниц и работа с фреймами под управлением скриптов. В этой главе вы найдете следующие разделы: что такое события и как они обрабатываются; В главе 17 много слов было сказано об обработке событий. Собственно говоря, одна из важнейших функций JavaScript состоит как раз в реакции на различные действия пользователя, будь то нажатие на кнопку, гиперссылку или просто наведение мышки на какой-либо объект. Все, что пользователь может делать на странице, называется событием, как и все, что автоматически происходит на странице или в браузере (или в системе). Например, загрузка страницы — событие. Выгрузка страницы — это, разумеется, тоже событие. Чтобы научиться обрабатывать эти события, нужно понять, как создаются обработчики событий для конкретных элементов XHTML. В общем случае формат следующий: <element обработчик="код JavaScript или вызов функции">
</element> Элементы <form> имеют множество обработчиков событий. Мы рассмотрим пример, который позволяет по нажатию кнопки подтверждать не форму целиком, а только данные, передаваемые в функцию JavaScript: <Н1>ОбраОотка введенных данных</H1><form> Введите число:
<input type="text" name="userEntry" size="4" /> <br />Результат
обработки: <input <type="text" name="result" size="5" /> <br
/><input type="button" уа!ие="Счет" onclick="result.value =
compute(userEntry)" /></form>
Рис. 18.1. Используя обработчики ошибок и элементы формы, JavaScript может возвращать значения, не заботясь о CGI-скриптах Типы обработчиков ошибок События, относящиеся в значительной степени к формам, представляющие собой атрибуты скриптов, у которых в то же время отсутствуют формальные требования элемента <script>, называются внутренними. Тем не менее они могут работать не только с элементами <form>. Некоторые события бывают связаны с какими-то определенными элементами HTML, а другие — с целым рядом элементов. И те и другие представлены в табл. 18.1. Таблица 18.1. Обработчики событий Обработчик Событие Создание обработчика событий сводится к добавлению атрибутов к тому элементу, с которым эти события могут происходить. Этот атрибут будет носить одно из названий, перечисленных в таблице. После знака равенства в кавычках можно написать либо код скрипта, либо вызов функции. Рассмотрим пример, в котором вызывается встроенная функция: <body onunload="alert('Спасибо за визит! Приходите еще!')"> Итак, одним из способов отреагировать на пользовательский ввод является показ какого-нибудь сообщения. Сообщение типа alert похоже на диалоговое окно, разница состоит только в том, что вместо двух кнопок на нем расположена одна. Это называется «окном предупредительных сообщений». Так вот, это окно являетсяпримером прямого взаимодействия с пользователем, причем часто главное окно браузера блокируется до тех пор, пока оно не будет закрыто. СОВЕТ Если хотите, чтобы в окне сообщений было больше одной строки, используйте спецсимвол перевода каретки (\n). Помимо встроенных функций типа alert() можно, разумеется, вызывать и собственные: <input type="text" name="phoneNumber" onchange="checkPhone
(this.value)" /> Указатель this По сути дела, указатель this заменяет имя текущего объекта. В данном случае того объекта, с которым связан обработчик. Рассмотрим пример, являющийся продолжением предыдущего: <form name="myForm"><input type="text"
name="phoneNumber"onchange="checkPhone (this.value)" /></form> <form name="myForm"><input type="text" name="phoneNumber"
onchange="checkPhone(document.myForm.phoneNumber.value)"
/></form> Объектная модель документа Ключевое слово this является скрытым предвестником целой концепции, которую нужно изучить, прежде чем продолжить разговор об обработке форм. Эта концепция сокращенно называется DOM (Document Object Model) и является своеобразным расширением и продолжением объектно-ориентированного подхода, речь о котором мы вели еще в главе 17. Она касается документов, которые создаются на XHTML и с которыми приходится работать при написании программ на JavaScript. По определению DOM является стандартом консорциума W3C, определяющим приемы управления объектами и изображениями на одной веб-странице. Вы только что рассмотрели пример работы этой модели. В самом последнем примере в качестве обработчика событий элемента <i nput> указывалось следующее: onchange="checkPhone (document.myForm.phoneNumber.value)" Оказывается, DOM позволяет работать с набором свойств и не передавать реальные значения при вызове функции. Листинг 18.1 служит тому примером. Обратите внимание: ни функции, ни ее вызову не требуются никакие параметры. Так как все данные формы хранятся в объектной модели документа, доступ к любому элементу которой можно получить очень просто, нужно лишь использовать корректный синтаксис. Листинг 18.1. Непосредственная работа с объектами веб-документа <!DOCTYPE html PUBLIC "\//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd"><html
xmlns="http://www.w3.org/1999/xhtml
"><head><title> Передача значений по ссылке
</title><meta
http-equiv="Content-Script-Type"content="text/javascript"><script><!--
прячем код скрипта от нерадивых браузеровfunction compute()var myNum =
document.myForm.userEntry.value:myNum = eval(myNum):var myResult = myNum +
100:document.myForm.result.value = myResult:return:/ Закончили прятаться -->
,</script></head><body><h1>Обработка введенных
данныx</hl><form name="myForm">Введите число: <input type="text"
name="userEntry" size="4" /> <br />Результат обработки: <input
type="text" name="result" size="5" /> <br /><input type="button"
name="Calc" vаluе="Счет" onclick="compute()" l></form></body>
</html> 1. Пользователь вводит число в поле ввода userEntry. 2. При нажатии кнопки «Счет» запускается функция compute(). 3. Функция находит по ссылке значение, введенное пользователем, и присваивает его переменной myNum. Затем с помощью встроенной функции eval () превращает myNum в число (поскольку поле текстовое и изначально переменная представляет собой просто набор символов, даже если это цифры). 4. Производятся какие-то арифметические операции, ответ сохраняется в переменной myResult. 5. Значение myResult присваивается свойству value текстового поля result, расположенного на второй строке формы. Ответ появляется в поле автоматически. (В браузере это выглядит точно так же, как на рис. 18.1.) Существует один момент, за которым нужно следить при работе над такого рода скриптами. Он касается того, когда следует использовать свойство value, а когда нет. Обычно если вы хотите присвоить какое-то значение элементу формы, то вам оно просто необходимо. Потому что с поименованным элементом (например, userln-put) связано больше чем просто значение. У него есть, например, type, установленный в элементе <i nput>. Поэтому нельзя просто так взять и написать document. form, user Input = x, поскольку userlnput — это объект, а не свойство. ПРИМЕЧАНИЕ Стандарт DOM был принят консорциумом WWW совсем недавно, поэтому Internet Explorer, Netscape и другие браузеры несколько по-разному реализуют его. В тексте этой главы я буду стараться использовать только кросс-платформенные средства объектной модели документов (ну, по крайней мере те, которые работают и в IE, и в Netscape). Тем не менее в главе 19 будут обсуждаться различные платформозависимые элементы DHTML. Область действия и указатели Один из вопросов, традиционно вызывающих затруднения при использовании DOM, является написание полных путей к объектам. В общем случае нужно начинать, как уже говорилось, с самого общего, что может быть, и затем продвигаться до нужного элемента, не пропуская ничего. Уровни объектов отделяются при этом точками. Но на самом деле мы уже видели пример использования более короткого пути. Объектом самого высокого уровня обычно является окно, window. Поэтому, если бы мы честно использовали самый полный путь, нам следовало бы во всех предыдущих примерах начинать именно с него. Тогда указатели выглядели бы еще длиннее. Например: window. document. myForm. userEntry .value. Но оказывается, что у всех этих путей есть некое общее свойство — они все имеют определенную область действия. Это означает, что, находясь на некотором виртуальном уровне объектов, можно часть пути отбросить, поскольку она в данном «месте» просто не актуальна. Это должно вам напомнить наш старый разговор о полных и сокращенных URL. Поскольку наши скрипты не влияют на окно браузера и мы находимся не на уровне «окон», а на уровне документов, то слово window в наших ссылках мы спокойно опускаем. Окно при этом считается текущим. Вслед за вопросом областей действия возникает вопрос указателей. По определению, указатель — это переменная, содержащая адрес объекта. Указатели значительно упрощают систему доступа к различным переменным: function computed() {var theForm = document.myForm;var Num =
theForm.userEntry.value;Num = eval(Num);var Result = Num +
100;theForm.result.value = Result;return;} Эти присваивания тем не менее не будут встречаться часто. Наоборот, слезует создать ссылку для транзакций между вызовом функции и самой функцией. Для начала приведу пример вызова функции: <form name="myForm">. . .другие элементы. . .«input type="button"
name="Calc" value- ''Счет" onclick="compute(myForm)"
/></form> function compute (theForm) { var Num = theForm.userEntry.value; Num =
eval(Num):var Result = Num + 100: theForm.result.value = Result; return;
} Работа с объектами верхних уровней Мы еще вернемся к объектам формы. А сейчас обратимся к некоторым объектам, входящим в DOM. В частности, поговорим о window, location и чуть более подробно о document. Объект window Даже если вы его не знаете, вы наверняка с ним знакомы. Ну, скажем так, встречали. Мы буквально в этой же главе упоминали функцию erl ert (). Полный путь к ней выглядит следующим образом: window, alert О. Это означает, что данный метод является принадлежностью объекта wi ndow. Однако до тех пор, пока вы не собираетесь вывести окно сообщения в каком-нибудь другом окне браузера, отличном от текущего, этот полный путь вам не нужен. Вы, вероятно, помните, что alent ( ) -выводит окно с сообщением, которое можно убрать, щелкнув на кнопке ОК. Пока окно активно, в главном окне браузера ничего не может происходить. Строка в скобках задает текст сообщения. Как и у любого нормального объекта, у wi ndow есть свойства и методы. По большей части, свойства можно только считывать, а изменять нельзя, поскольку окно уже существует. Среди свойств есть такие как name (это то, что пишется в строке заголовка), 1 ength (число фреймов в окне), sel f (нечто типа указателя на самого себя, то есть на текущее окно) и status. Последнее можно использовать для изменения надписи в строке состояния браузера. Строка состояния обычно представляет собой краткое описание происходящего в данный момент на веб-странице. Вот пример: <а href = "products.html" onmouseover = "status='Пocмотреть полную линейку
продукции'" onmouseout="status=''"> При работе с window можно использовать такие методы, как, например, confirm( ), Делает он все то же самое, что и alert( ), только вместо одной кнопки ОК окно содержит две кнопки: ОК и Cancel (Отмена). Если пользователь щелкает на ОК, возвращается значение true, а если на крестике в верхнем правом углу или на кнопке Cancel, возвращается false. Например: var keepGoing = confirm("Хотите продолжить?"); var numberGuess = prompt("Введите число". 5);var emailAddress =
prompt("Введите e-mail", "vpupkin@fakecorp.com"): window.open("URL") <body onload="window.resizeTo(800.600)"> <а href="" onclick="history.back( )">Haзaд</a> Как уже говорилось, этот объект является частью объекта wi ndow, поэтому полный путь к нему следующий: window, location. Обычно, впрочем, текущая область действия такова, У этого объекта существует немало свойств, document.writeln("Aдрес этой страницы: " + location.href): href. Полный URL. protocol. Протокол (например, http:). hostname. Имя хоста (например, www.fakecorp.com). pathname. Полный путь, включая каталоги, подкаталоги и имя документа. Например, на каждой странице где-нибудь вуглу помещать ее реальный URL. Вспомним, как это делается: document.writeln("Адрес этой страницы: " + location.href): location.href = "http://www.fakecorp.com/newpage.html" Это еще одно детище объекта wi ndow. Однако деточка эта весьма взрослая и самостоятельная. На самом деле при написании скриптов на JavaScript и, в частности, при разработке форм именно document оказывается наиболее часто используемым объектом. Действительно, именно здесь хранятся все объекты и элементы ваших страниц. И уровень document не низок, не высок, а как раз очень удобен. Хочется упомянуть в первую очередь такие свойства данного объекта: domain. Хранит имя домена, на котором расположен документ (например, url. URL текущего документа. referrer. Может использоваться для хранения URL того документа, на котором стояла ссылка на данный (то есть адрес страницы, с которой пользователь сюда попал). lastmodified. Дата внесения последних изменений. title. Хранит заголовок документа (тот самый, который указан в элементе<title>) anchors. Массив. В нем хранятся якоря документов с именами, связанными с ним. images. Еще один массив. Этот хранит все изображения (вернее, ссылки на них). forms. И еще массив. Позволяет получить доступ к разным формам
страницы. alert(document.images[0].src); Нечто в этом духе мы еще будем обсуждать в главе 19, поскольку это считается «приемом из DHTML». А так вроде все довольно просто и понятно: document.images[0].src = "images/new.gif" Разница в том, что первый автоматически вставляет специальный знак перевода
каретки (который, впрочем, все равно не распознается браузером, если только
текст не заключен в теги <рге>), Существует возможность очистить текущую страницу и Затем с помощью document, write О записываем в нее все что нужно. Теперь document. close( ) — и новая страница готова! Рассмотрим листинг 18.2. Листинг 18.2. Персонализация с использованием формы <!DOCTYPE html PUBLIC "\//W3C//DTO XHTML1.0 Transitional//EN""http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional
.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>
Страница персонализации </title><script type =
"text/javascript"><!-- Прячем кодfunction personalizePage О{ var userName
= personal Form.myName.value:document.open( )document.
write("<html><head><title>HoBый
документ</title></head>")document.write("<body><h1>
Приветик. " + userName + "</h1>")document.write("<p>ЭTa страница
созданаспециально для <b>тебя/b>!
:-)</р>")document.write("</body></html>")document. close( ) }
// закончили прятаться
--></script></head><body><h1>Страница персонализации
и авторизации</h1><р>Добрый день! Введите свое имя,затем щелкните на
кнопке "Дальше". Содержимое страницыизменится. <bг /> Обратите вникание на
то,что URL при этом не изменится !</р><form
name="personalForm">Введите свое имя: <input type="text"
name="myName"><input type=" button"name="personalButton" уа!ие="Дальше"
onclick="personalizePage()" /></form></body></html> говорит о том, что мы находимся на соответствующем уровне областей действия, то есть нам не надо никак усложнять путь к объекту personal Form. Если бы изменилось значение location. href), нам пришлось бы немного потрудиться, прежде чем получить доступ к тому же значению. На рисунке 18.2 демонстрируется листинг 18.2 в действии.
Рис. 18.2. Страница до (сверху) и после (снизу) запуска скрипта JavaScript и формы HTML В предыдущем параграфе мы рассмотрели некоторые объекты DOM, которые можно изменять и к которым можно получить доступ с помощью JavaScript. В этом разделе мы будем рассматривать одну из составляющих объекта document под названием form. Объект form Для начала разберемся с тем, как создать несколько форм. Дело в том, что каждая форма будет иметь свое собственное имя (для этого используется значение атрибута name элемента <form>). А значит, получить доступ к элементам формы будет несложно. Итак, сначала даем имя (name="MyForm"), потом получаем доступ к любым элементам: var name = document.myForm.custName.value Но вы также знаете, что у этого объекта есть свойство forms, представляющее собой массив форм, содержащихся в текущем документе. Например, если предположить, что форма myForm из предыдущего примера является первой на странице, то к ней можно получить доступ следующим образом: var name = document.forms[0].custName.value: for (x=0: х<3: х=х+1) {var formName[x] = document.forms[x] name
} Все объекты формы, независимо от того, каким образом осуществляется доступ к ним, имеют свои наборы свойств, как и документ, окно. Свойства объекта form, в частности, следующие: action. URL. В сущности, то же самое, что атрибут acti on элемента <form>. method. To же самое, что атрибут method элемента <form>. name. Имя формы (то же самое, что атрибут name элемента <form>). length. Число элементов input, textaгеа и sel ect в форме. target. Целевое окно или фрейм. elements. Массив, в котором содержатся все элементы input, textarea и
select Обработка ошибок на форме с помощью JavaScript JavaScript и его обработчики событий идеально подходят для проверки данных, вводимых пользователями в формах. Во время набора данных скрипт может незаметно проверять корректность кодировки, числа символов и т. д. Оказывается, можно обработать практически любой элемент формы, хотя, скорее всего, вы займетесь работой над текстовыми полями и полями ввода. Начнем с небольшого примера. В листинге 18.3 закодирована целая страница, позволяющая ее посетителю вводить данные. Скрипт осуществляет проверку правильности ввода почтового индекса. Листинг 18.3. Проверка данных в формах с помощью JavaScript <!DOCTYPE html PUBLIC "\//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title> Страница персонализации </title><meta
http-equiv="Content-Script-Type"content="text/javascript"><script><!--
Прячем кодfunction zipCheckOvar zipStr = custForm.zipCode.value;if (zipStr ==
"") {аlегt("Введите шестизначный индекс, пожалуйста"); return(-1); if
(zipStr.length != 6) {alert("Индекс должен содержать 6
цифр!");return(-l);return();function checkSend ( ) (var passCheck = zipCheck( ):
If (passCheck == -1) { return;} else{custForm.submitO: //Закончили прятаться
--> </schpt></head><body><h1>Пожалуйста, заполните
форму :</h1><form action="cgi-bin/address.pl" method="post"
if (zipStr = "") { if (zipStr.length != 6) { . var passCheck = zipCheck( ): if (passCheck = -1) { return; Если пользователь наконец набрал на клавиатуре шесть цифр, форма подтверждается:
Рис. 18.3. Если введен неправильный индекс, появляется окно с предупреждением В действительности мы проверили индекс только частично. Проверка могла бы
быть сколь угодно сложной. Например, можно запретить использование буквенных
символов в этом поле. Это можно сделать, применив метод charAt( ) объекта
String, который тщательно проверит каждую позицию и установит, Итак, расширенная функция zipCheck( ) может выглядеть следующим образом: function zipCheckOvar zipStr = custForm.zipCode.value:if (zipStr == "")
{аlегt"Введите шестизначный индекс, пожалуйста");return(-l):if (zipStr.length !=
6) {alert("Индекс должен содержать 6 цифр!"): return(-l):for (х = 0: x < 6;
x++) if ((zipStr.charAt(x) < "О") | (zipStr.charAt(x) >
"9")){аleft("Индекс должен состоять только из цифр!"): return(-l); }
return(O); } for (х = 0: х < 6; х++) В цикле находится условное выражение if, — собственно говоря, именно оно и проверяет, являются ли символы цифровыми: if ((zipStr.charAt(x) < "О") || (zipStr.charAt(x) > "9"))
{ То есть если выполняется хотя бы одно из условий, то все выражение принимает значение «истина», и появляется окошко с предупреждением: alert("Индекс должен состоять только из цифр!"): return(-l); JavaScript на клиентской машине Одним из преимуществ JavaScript является то, В некоторых случаях вы с удивлением сможете обнаружить, Листинг 18.4. Форма, обрабатываемая на стороне клиента
Скрипт берет значения, введенные пользователем в первой форме, и помещает их в текстовом виде во вторую форму. Затем можно редактировать данные, например добавлять комментарии (рис. 18.4). Наконец, при нажатии на кнопку SEND IT! (Отправить!) вся накопленная информация отправляется по электронной почте.
Рис. 18.4. Пользователь может отредактировать данные перед отправкой ПРИМЕЧАНИЕ Хотя данные придут в формате «post» (глава 15), однако обрабатывать придется всего лишь одно поле, благодаря предварительному анализу, производящемуся в скрипте. Этот пример показывает, как важно получать корректные значения флажков и переключателей. В листинге 18.4 демонстрируются два способа, которыми это можно сделать. Для начала обратимся к переключателям. Нам нужно опреде лить, какое положение селективной кнопки выбрано, тогда мы сможем работать с соответствующими данными. Значения переключателей хранятся в специальных массивах, а следовательно, мы можем получить доступ к ним с помощью цикла: for (х = 0: х < Forml. where. length; x++){ if (Forml. where[x].
checked){ result_str += Forml. where[x] .value + newline: break:} С каждым экземпляром where можно использовать свойство checked для того, чтобы определить, в каком положении находится реключатель. Когда мы найдем тот объект where, свойство checked которого равно true, это будет означать, что именно его value нам и нужно. Поэтому фактически приведенный ранее цикл занимается определением положения переключателя. Когда он его находит, цикл for завершается (командой break), а со значением производятся определенные действия. В данном случае оно добавляется к строке result_str. Второе, что показано в этом примере, — это работа с наборами флажков. И здесь тоже нужно проверять состояние свойства checked. Но поскольку каждый флажок имеет свое собственное имя (name), то нет необходимости хранить их в каком-то массиве или использовать цикл для их перебора. К каждому флажку требуется индивидуальный подход, у каждого из них лично нужно выяснить, является ли он checked. Если это так, то используется его значение: if (Forml.desktop.checked) result_str +="Настольные компьютеры" +
newline:if(Forml.notebook.checked) result_str += "Портативные компьютеры" +
newline;if(Forml,peripherals.checked) result_str +="Периферия" + newline;
if(Forml.software.checked)result_str += "Программное обеспечение" +
newline; Переадресация, фреймы и JavaScript Теперь вы узнали, как получать доступ и изменять некоторые основные объекты DOM, увидели, как извлекать информацию из форм и использовать JavaScript для изменения данных в них. В этом разделе мы рассмотрим некоторые приемы, позволяющие организовать переадресацию, строить ссылки и применять JavaScript для работы с фреймами. Переадресация браузера Бывает интересно и полезно узнать, какой браузер использует пользователь, чтобы автоматически отправить его на ту или иную страницу. Иногда важно не только узнать название программы, но и определить, имеет ли она поддержку JavaScript и в соответствии с этим принять решение о переадресации на подходящий URL. При переадресации браузера используется объект, С помощью его свойств можно узнать, с какой версией браузера вы имеете дело. Например, в переменной navigator.appName xpaнится полное имя приложения, объект navigator.userAgent сообщит вам общую информацию об уровне совместимости данного ПО (например, Mozi 11 а/4.0 может на поверку оказаться любой Netscape-совместимой программой уровня 4.0). Наконец, navigator.appVersion выдаст номер версии браузера.Итак, первое, что вы может сделать, — это создать документ, в котором будут отражены все свойства браузера, получившего доступ к нему: <script type="text/javascript">document.writeln ("navigator.appName; "
+ navigator.appName + "<br \/>"): document.writeln
("navigator.userAgent: А польза может быть такой: узнать версию брау-зера и в соответствии с ней загрузить ту или иную страницу. Но для этого скрипт должен проанализировать текстовые данные и понять, что из этого набора символов является именем приложения, что — версией, и т. д. Это может быть сделано при помощи серии условных операторов if, как показано в следующем листинге. Листинг 18.5. Переадресация браузера <!DOCTYPE html PUBLIC "\//W3C//DTO XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtmll/OTD/xhtnill-transitional
.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>
Детектор браузеров </title><script><!-- Прячем кодvar
browserAppName = navigator.appName:if (browserAppName == "Netscape")
{window.location = "net_index.html";} else {if (browserAppName == "Microsoft
Internet Explorer"){ window.location = "ie index.html";else {window.location =
"index.html";</script> </head> <body><h1>3дравствуйте. я
ваша тетя-детектор браузеров !</h1><р>Если эта страница не
обновляется, ваш браузер несовместим с JavaScript или поддержка JavaScript
отключена. Пожалуйста, нажмите <а href="index.html">3flecb</a>.
чтобы хотьчто-нибудь увидеть.</р> </body> </html> Хватило бы и такой команды: window, location = "newpage.html" Если страница не обновляется, то можно предположить, что JavaScript и браузер пользователя незнакомы. И тогда можно отправить пользователя по ссылке на ка кую-нибудь часть сайта, на которой отсутствуют скрипты. ПРИМЕЧАНИЕ Иногда требуется узнать несколько больше, чем название фирмы-производителя браузера. В таком случае попробуйте посмотреть, что выдаст свойство .appVersion. В главе 19 вы найдете более подробное описание того, что можно делать при определении браузера. Как написать меню ссылок на JavaScript Говоря об элементах формы в этой главе, мы опустили элемент <select>. Сейчас мы восстановим справедливость и позволяющее пользователям быстро переходить с одной страницы на другую. И для этого мы воспользуемся элементом <select>. Листинг 18.6 показывает это в действии. Листинг 18.6. Меню <select> и JavaScript
С меню <select>, в отличие от других элементов форм, не ассоциировано никакое значение. Вместо этого используется то, что содержится в контейнерах <option>. Этот текст сохраняется в свойстве text объекта. Кроме того, выбранное значение сохраняется в свойстве selected Index. С помощью следующего кода скрипт просто передает значение в selectedlndex. Затем оно используется для получения доступа к тексту выбранного пользователем пункта (для этого существует массив option):
function changePage(theSelect) {var x =
theSelect.selectedlndex:window.location.href =
theSelect.options[x].text: Таким образом и следует извлекать значения из меню <select>. На рисунке 18.5 показана такая страница в действии.
Рис. 18.5. Навигация с помощью меню <select> и JavaScript Необходимо копировать этот скрипт, размещая его на всех страницах сайта, если вы хотите добиться однообразия и единого стилевого решения навигационного меню. Однако есть и другой подход — использовать фреймы. Именно об этом мы и поговорим далее. JavaScript и фреймы Предположим, что имеется браузер, поддерживающий JavaScript. Предлагаю попробовать сделать сайт, основанный на фреймах, с выпадающими меню навигации. Направленность нашего будущего сайта будет такова: веб-архив статей с удобным доступом через меню. Как это всегда бывает при использовании фреймов, нам понадобится целый набор документов, чтобы заставить этот интерфейс работать. Во-первых, документ, содержащий <frameset>. Это та цементирующая основа, которая скрепляет вместе все разрозненные страницы. Во-вторых, страница навигации, включающая в себя меню <select> (подробности в предыдущем параграфе). Всего несколько изменений -и это меню можно применить к фреймам. В дополнении к этим двум понадобится третий документ, загружающийся по умолчанию вместе с набором фреймов. Это может быть страница, поясняющая, как работать с интерфейсом. Ну и конечно, нужен документ, содержащий собственно какую-нибудь полезную информацию по тематике сайта. Рассмотрим листинг 18.7, содержащий <frameset>. Листинг 18.7. Документ, задающий набор фреймов
Она будет расположена вверху страницы и Код документа показан в листинге 18.8, Как вы, вероятно, помните из главы 12, top — это обозначение для окна браузера. То же самое обозначение используется и в объектной модели документа, в которой есть все фреймы. А раз они там есть, значит, им можно присвоить URL. Обратите внимание на то, что в новой версии навигационной страницы пользователь вместо URL видит описание страницы, на которую он собирается переходить. А описания автоматически транслируются в подходящие адреса. Как это делается? Создается массив адресов, обращение к которым происходит по номеру пункта меню. Нужно организовать этот массив таким образом, чтобы записи <option> в <select> соответствовали списку URL. Это немного запутанный способ с точки зрения программирования, но зато с точки зрения пользователя он более понятный. Итак: Листинг 18.8. Страница navigate.html <!DOCTYPE html PUBLIC "\//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd"><html
xmlns="http://www.w3.org/1999/xhtml"><head><title>Страница
навигации</title><script type="text/javascript><!------function
changePage(theSelect) {pageArray = new Array ("default, html", "articlel.html".
"article2.Titml". Листинг 18.9 — это код страницы default.html. Листинг 18.9. Страница default.html
Рис. 18.6. С помощью <frameset> и специального меню <select>
можно сделать интерфейс, Резюме В этой главе вы узнали о дополнительных возможностях JavaScript, которые касаются обработки пользовательского ввода. Мы начали с дискуссии на тему обработчиков событий, их использования в сочетании с функциями JavaScript с целью создания скриптов, взаимодействующих с пользователями. Затем мы обратились к объектной модели документов (DOM), обсудили некоторые объекты, входящие в нее, их свойства и методы. После этого мы (DOM, обработка событий, JavaScript) рассмотрели создание HTML-формы. Вы узнали, как осуществлять проверку вводимых пользователями данных, как создавать формы, целиком обрабатываемые JavaScript (не выходя за пределы пользовательского компьютера), как можно обойти CGI-скрипты. Наконец, последний раздел главы был посвящен автоматическому изменению содержимого веб-страниц. Вы увидели примеры переадресации в зависимости от используемого браузера, создания навигационного меню, построения довольно сложного интерфейса, основанного на интеграции JavaScript во фреймы. В следующей главе мы продолжим свое знакомство с JavaScript и его совместной работе с технологией CSS. Такой подход часто называют Динамическим HTML (DHTML). |
|
Copyright © 2006-09.
| |