Если рассматривать программирование на JavaScript в исторической перспективе, то первыми объектами, для которых были разработаны методы и свойства, стали поля форм. Обычно контейнер FORM и поля форм именованы:
<FORM NAME=fname METHOD=get> <INPUT NAME=iname SIZE=30 MAXLENGTH=30> </FORM>
Поэтому в программах на JavaScript к ним обращаются по имени:
document.fname.iname.value="Текст";
Того же эффекта можно достичь, используя
document.forms[0].elements[0].value="Текст"; document.forms['fname'].elements['iname'].value="Текст";
Рассмотрим подробнее объект Form, который соответствует контейнеру FORM. Его свойства, методы и события используются для задания реакции на действия пользователя, например, изменения значений полей или нажатие кнопок.
| Свойства | Методы | События |
|---|---|---|
length action method target encoding elements[] |
reset() submit() |
Reset Submit |
Свойство отвечает за вызов javascript:, например:
<FORM METHOD=post ACTION="javascript: alert('Работает!');">
<INPUT TYPE=submit VALUE="Продемонстрировать JavaScript в ACTION">
</FORM>
Обратите внимание на тот факт, что в контейнере ?". Дело в том, что
alert('Строка');?
провоцирует ошибку JavaScript. Метод ?" не добавляется к URL, и ошибка не генерируется. При этом применение void(0) отменяет перезагрузку документа, и браузер не генерирует событие , т.е. не обращается к серверу при нажатии на кнопку, как это было бы при стандартной обработке формы.
Свойство определяет GET и .
JavaScript-программа может изменить значение этого свойства. В предыдущем разделе
<FORM NAME=f ACTION="javascript: alert('Работает!');">
<SCRIPT>
document.write('По умолчанию установлен метод: '+document.f.method+'.<BR>');
</SCRIPT>
<INPUT TYPE=button onClick="document.f.method='post'" VALUE="Сменить метод на POST">
<INPUT TYPE=button onClick="document.f.method='get'" VALUE="Сменить метод на GET"><BR>
<INPUT TYPE=submit VALUE="JavaScript в ACTION">
</FORM>
По умолчанию установлен метод GET.
В данном примере стоит обратить внимание на два момента:
Submit .SCRIPT встроен JavaScript-код, который сообщает FORM. Ставить его перед контейнером FORM нельзя, так как в момент получения FORM не будет создан, и, следовательно, работать с его свойствами не представляется возможным.Никаких других особенностей свойство не имеет. В данном свойстве можно указать и другие GET и , но это требует дополнительной настройки сервера.
Свойство определяет и свойства окна opener, top и . Кроме того, для загрузки window.open(). Все эти варианты будут продемонстрированы в разделе "Передача данных во
Свойство объекта Form (а также атрибут enctype контейнера FORM ) задает, каким образом данные из формы должны быть закодированы перед их отправкой на сервер. Возможные значения:
| Значение | Описание |
|---|---|
application/x-www-form-urlencoded |
Это значение по умолчанию. Означает, что в данных, передаваемых на сервер, пробелы заменяются на "+", а Щ заменяется на %D0%A9. |
text/plain |
Пробелы заменяются на "+", но |
multipart/form-data |
Никакие символы не кодируются (они передаются как есть). Данное значение необходимо указывать, если в форме имеются элементы отправки файлов: <INPUT TYPE=file>. |
При генерации встроенного в документ объекта Form браузер создает и связанный с ним массив ( . Обычно к полям обращаются по имени, но можно обращаться и по
<FORM NAME=f> <INPUT NAME=e SIZE=40> <BR><INPUT TYPE=button VALUE="Ввести текст по имени элемента" onClick="document.f.e.value='Текст введен по имени элемента';"> <BR><INPUT TYPE=button VALUE="Ввести текст по индексу элемента" onClick="document.f.elements[0].value='Текст введен по индексу элемента';"> <BR><INPUT TYPE=reset VALUE="Очистить"> </FORM>
Индексирование полей в массиве начинается с нуля. Общее число полей в форме f доступно двумя способами: как свойство массива document.f. и как свойство объекта формы: document.f..
Метод позволяет проинициировать передачу введенных в форму данных на сервер:
<FORM NAME=f ACTION="http://www.intuit.ru/rating_students/"> Ваше имя пользователя на intuit:<INPUT NAME=query> </FORM> <A HREF="javascript:document.f.submit();">Посмотреть рейтинг</A>
Как видите, кнопки отправки ( ) у формы нет, но нажав на ссылку, мы выполняем имеет отличия от нажатия пользователем кнопки INPUT типа TYPE= ; их мы рассмотрим в конце лекции.
Метод (не путать с обработчиком события onReset, рассматриваемым ниже) позволяет восстановить значения полей формы, заданные по умолчанию. Другими словами, равносилен нажатию на кнопку INPUT типа TYPE=, но при этом саму эту кнопку создавать не требуется.
<FORM NAME=f>
<INPUT VALUE="Значение по умолчанию" SIZE=30>
<INPUT TYPE=button VALUE="Изменим текст в поле ввода"
onClick="document.f.elements[0].value='Изменили текст';">
</FORM>
<A HREF="javascript:document.f.reset();void(0);">
Установили значение по умолчанию</A>
В данном примере если кликнуть по гипертекстовой ссылке, то в форме происходит восстановление значений полей по умолчанию.
Событие возникает (и соответствующий обработчик события onSubmit вызывается) при нажатии пользователем на кнопку типа или при выполнении метода . Действие по умолчанию, которое выполняет браузер при возникновении этого события - отправка введенных в поля формы данных на сервер, указанный в атрибуте , с помощью метода, указанного в атрибуте , с использованием способа кодирования, указанного в атрибуте ENCTYPE, и с указанием того, что результаты работы .
Фукцию обработки этого события можно переопределить и даже вовсе отменить. Для этой цели введен атрибут onSubmit="код_программы" у контейнера <FORM>. В нем можно указать действия (JavaScript-код), какие должны выполняться при возникновении этого события. Порядок выполнения этих действий и действий браузера, а также использование оператора return false для отмены последних, полностью аналогичны тем, что описаны ниже для onReset. Пример:
<SCRIPT>
function TestBeforeSend()
{
if(document.f.query.value=='')
{
alert('Пустую строку не принимаем!');
return false;
}
else return true;
}
</SCRIPT>
<FORM NAME=f METHOD=post onSubmit="return TestBeforeSend();"
ACTION="http://www.intuit.ru/rating_students/">
Ваше имя пользователя на intuit:<INPUT NAME=query>
<INPUT TYPE=submit VALUE="Посмотреть рейтинг">
</FORM>
В этом примере следует обратить внимание на конструкцию return TestBeforeSend(). Сама функция TestBeforeSend() возвращает значения true или false. Соответственно, данные либо отправляются на сервер, либо нет.
Событие возникает (и соответствующий обработчик события onReset вызывается) при нажатии пользователем на кнопку типа или при выполнении метода . Действие по умолчанию, которое выполняет браузер при возникновении этого события - восстановление значений по умолчанию в полях формы. Однако функцию обработки этого события можно переопределить и даже вовсе отменить. Для этой цели введен атрибут onReset="код_программы" у контейнера <FORM>. В нем можно указать действия (JavaScript-код), какие должны выполняться при возникновении этого события. Браузер сначала выполняет эти действия, а затем - свое действие по умолчанию. Но если последним оператором в обработчике onReset будет return false, то действие браузера по умолчанию выполняться не будет. Этот прием называется
<FORM onReset="javascript: alert('Не дадим восстановить!');return false;">
<INPUT VALUE="Измените этот текст" SIZE=30>
<INPUT TYPE=reset VALUE="Восстановить">
</FORM>
Здесь команда return false предотвратила восстановление значения поля. Команда return true, равно как и отсутствие оператора return, позволило бы браузеру продолжить
Как было сказано ранее, контейнеру <FORM> соответствует объект (назовем его f ) класса Form ; он является свойством объекта document. В свою очередь, элементы формы, вложенные в контейнер <FORM>, например, <INPUT> различных типов, тоже соответствуют объектам различных классов, причем эти объекты являются f.
У всех объектов, отвечающих полям формы, есть несколько стандартных свойств, доступных только для чтения: name (имя элемента, заданное в атрибуте NAME ), type (тип элемента, например, для контейнеров <INPUT TYPE="..."> он совпадает со значением атрибута TYPE ), form (указывает на форму f, в которой данный элемент содержится).
При программировании форм часто требуется писать обработчики событий для форм или их элементов, при этом нужно ссылаться на свойства данного элемента, других элементов и формы в целом. Стандартная схема именования по именам либо по индексам обсуждалась выше:
document.форма.элемент.свойство // точечная нотация document.форма.элемент["свойство"] // скобочная нотация document.forms["имя_формы"].elements["имя_элемента"].свойство document.forms[индекс_формы].elements[индекс_элемента].свойство
Однако получающиеся выражения - довольно громоздкие. Поэтому было введено следующее соглашение: в обработчике события формы или элемента формы имя текущего элемента можно опускать (вместе со всей предшествующей "приставкой"). Кроме того, ссылаться на сам текущий элемент можно с помощью ключевого слова this. Последнее может потребоваться, например, когда нужно передать в функцию не какое-то
Например, предположим, что у нас есть форма:
<FORM NAME=f> <INPUT TYPE=text NAME=e value="Текст" onFocus=""> <INPUT TYPE=button NAME=b value="Кнопка" onClick=""> </FORM>
Тогда вместо полной записи:
<INPUT TYPE=text NAME=e value="Текст" onFocus="alert(document.f.e.value)">
мы можем использовать краткую, опустив приставку " document.f.e ", указывающую на текущий элемент:
<INPUT TYPE=text NAME=e value="Текст" onFocus="alert(value)">
Более того, в этом контексте эквивалентны следующие записи:
value // короче не бывает!
this.value // здесь this ссылается на элемент "e"
form.e.value // form есть свойство объекта "e" (равное "f")
this.form.e.value // комбинируем оба способа
document.f.e.value // почти полная запись
window.document.f.e.value // это самая полная запись
document.f.e.form.e.value // можно итерировать "form.e."
Например, здесь в 3-й строчке form есть свойство (текущего!) элемента document.f.e - напомним, что это свойство ссылается на объект document.f. Аналогично, в обработчик элемента b мы можем поместить скрипт form.e.value=50 (краткое обращение к свойству другого элемента формы: document.f.e.value ) или (краткое обращение к свойству самой формы document.f. ) или даже TestForBugs(this) (в TestForBugs() будет передан (по ссылке) объект document.f.b ).
Как видим, это соглашение не только дает некоторую экономию кода, но также позволяет ссылаться на текущий элемент или на форму, не зная его имени или номера. Это предоставляет дополнительную гибкость при программировании форм; например, можно переименовать форму, ничего не меняя во всех скриптах. Далее мы рассмотрим объекты JavaScript, соответствующие полям различных типов в name, type и form есть у объектов всех элементов формы, то мы не будем их указывать особо.
INPUT типа TYPE=text ) являются одним из наиболее популярных объектов программирования на JavaScript. Это объясняется тем, что, помимо использования по прямому назначению, их применяют и в целях отладки программ, выводя в эти поля промежуточные значения переменных и свойств объектов.
<A HREF="http://site.com/">ссылка 1</A>
<FORM>Число гипертекстовых ссылок к данному моменту:
<SCRIPT>
document.write('<INPUT NAME=t VALUE='+document.links.length+'>');
</SCRIPT>
<BR><INPUT TYPE=button
VALUE="Число ссылок по окончании загрузки страницы"
onClick="form.t.value=document.links.length;">
<BR><INPUT TYPE=reset>
</FORM>
<A HREF="http://rite.com/">ссылка 2</A>
В данном примере первое поле формы - это
С каждым текстовым полем ввода <INPUT TYPE=text> связан свой объект класса Text, который является свойством той формы, в которой он был описан. Этот объект, в свою очередь, характеризуется следующими свойствами, методами и событиями:
| Свойства | Методы | Обработчики событий | |
|---|---|---|---|
defaultValue value size maxLength disabled readOnly |
focus() blur() select() |
onChange onSelect onFocus onBlur onClick onDblClick |
onMouseOver onMouseOut onMouseDown onMouseUp onKeyPress onKeyDown onKeyUp |
Все перечисленные value (текущее значение defaultValue (значение size (число умещающихся в поле символов, т.е. видимых) maxLength (максимальное число символов, которое можно присвоить значению данного поля) (может ли пользователь менять значение поля) (может ли пользователь установить фокус на этом поле).
Опишем вкратце - устанавливает фокус на данном поле, - убирает фокус с данного поля, select() - выделяет весь введенный текст (чтобы, например, его можно было скопировать в буфер, либо удалить, нажав клавишу Delete).
Смысл вызывается, когда пользователь (но не скрипт) изменил значение в onSelect - когда пользователь начинает выделять текст, расположенный в поле; onFocus и onBlur - когда поле получает и теряет фокус, соответственно; и - когда пользователь совершил одинарный или двойной щелчок мышью на поле, соответственно. Вторая колонка событий - стандартна для большинства элементов HTML-страницы. Нужно лишь иметь в виду, что обработчики событий onMouseDown, onMouseUp, onKeyPress, onKeyDown, onKeyUp срабатывают у того элемента формы, который в данный момент находится в фокусе.
Одним из важных элементов интерфейса пользователя являются списки вариантов. В <SELECT>, который вмещает в себя контейнеры <OPTION>. При этом список может "выпадать" либо прокручиваться внутри окна. В зависимости от наличия атрибута у контейнера <SELECT> список может быть либо с возможностью выбора только одного варианта, либо нескольких вариантов.
С каждым контейнером <SELECT> ассоциирован объект класса Select, а с каждым дочерним контейнером <OPTION> - объект класса Option, являющийся свойством данного объекта класса Select. Кроме того, Select является также коллекция options[], объединяющая все его дочерние объекты Option. Перечислим основные свойства, методы и события, характеризующие эти объекты.
| Свойства | Методы | Обработчики событий |
|---|---|---|
options[] size length multiple selectedIndex |
focus() blur() add() remove() |
onBlur onChange onFocus |
| Свойства | Методы | События |
|---|---|---|
defaultSelected selected index text value |
нет | нет |
Мы не будем описывать все свойства, методы и события этих двух объектов. Остановимся только на типичных способах применения их комбинаций.
Объект класса Option интересен тем, что в отличие от многих других встроенных в Option:
opt = new Option([ text, [ value, [ defaultSelected, [ selected ]]]]);
где аргументы соответствуют свойствам обычных объектов класса Option:
text - строка текста, которая размещается в контейнере <OPTION> (например: <OPTION> текст </OPTION> );value - значение, которое передается серверу при выборе альтернативы, связанной с объектом Option ;defaultSelected - выбрана ли эта альтернатива по умолчанию ( true / false );selected - альтернатива была выбрана пользователем ( true / false ).На первый взгляд не очень понятно, для чего может понадобиться программисту такой объект, ведь создать объект класса Select нельзя и, следовательно, нельзя приписать ему новый объект Option. Все объясняется, когда речь заходит об изменении списка альтернатив у имеющегося в документе объекта Select. Делать это можно, при этом изменение списка альтернатив Select не приводит к переформатированию документа. Изменение списка альтернатив позволяет решить проблему создания вложенных меню, которых нет в options[] ).
При программировании альтернатив следует обратить внимание на то, что у объектов класса Option нет свойства name, в виду того, что у контейнера <OPTION> нет атрибута NAME. Таким образом, к встроенным в документ объектам класса Option можно обращаться только как к элементам коллекции options[].
Встроенный массив ( options[] - это одно из свойств объекта Select. Элементы этого массива являются полноценными объектами класса Option. Они создаются по мере загрузки страницы браузером. Количество объектов Option, содержащихся в объекте document.f.s класса Select, можно узнать с помощью стандартного свойства массива: document.f.s.options.. Кроме того, у самого объекта Select есть такое же свойство: document.f.s. - оно полностью идентично предыдущему.
Программист имеет возможность не только создавать новые объекты Option, но и удалять уже созданные браузером объекты:
<FORM>
<SELECT NAME=s>
<OPTION>Первый вариант</OPTION>
<OPTION>Второй вариант</OPTION>
<OPTION>Третий вариант</OPTION>
</SELECT>
<INPUT TYPE=button VALUE="Удалить последний вариант"
onClick="form.s.options[form.s.length-1]=null;">
<INPUT TYPE=reset VALUE="Сбросить">
</FORM>
В данном примере при загрузке страницы с сервера у нас имеются три альтернативы. Их можно просматривать как ниспадающий список вариантов. После нажатия на кнопку " Удалить последний вариант " в форме остается только две альтернативы. Если еще раз нажать на эту кнопку, останется только одна альтернатива. В конечном счете, вариантов не останется вовсе, т.е. пользователь лишится возможности выбора. При нажатии кнопки сброса ( ) варианты не восстанавливаются - альтернативы утеряны бесследно.
Теперь, используя конструктор Option, сделаем процесс обратимым:
<SCRIPT>
function RestoreOptions()
{
document.f.s.options[0] = new Option('Вариант один','',true,true);
document.f.s.options[1] = new Option('Вариант два');
document.f.s.options[2] = new Option('Вариант три');
return false;
}
</SCRIPT>
<FORM NAME=f onReset="RestoreOptions();">
<SELECT NAME=s>
<OPTION>Первый вариант</OPTION>
<OPTION>Второй вариант</OPTION>
<OPTION>Третий вариант</OPTION>
</SELECT>
<INPUT TYPE=button VALUE="Удалить последний вариант"
onClick="form.s.options[form.s.length-1]=null;">
<INPUT TYPE=reset VALUE=Reset>
</FORM>
Восстановление альтернатив мы поместили в обработчик события onReset контейнера FORM. Создаваемые объекты класса Option мы присваиваем объекту document.f.s класса Select. При этом первая альтернатива должна быть выбранной по умолчанию (аргументу defaultSelected задано значение true ), чтобы смоделировать поведение при начальной загрузке страницы.
Свойство text представляет собой отображаемый в меню текст, который соответствует альтернативе. В HTML-коде он расположен между тэгами <OPTION> и </OPTION>. Свойство value содержит значение атрибута VALUE тэга <OPTION>. Например, пусть один из вариантов в списке был описан как:
<OPTION VALUE="n1">Вариант первый</OPTION>
Тогда значение свойства text у соответствующего объекта будет равно " Вариант первый ", а значение свойства value равно " n1 ".
Возникает вопрос, зачем нужны два свойства? Дело в том, что на сервер передается значение value выбранного варианта. В случае же, когда атрибут VALUE у контейнера <OPTION> отсутствует, на сервер передается значение text.
Свойство selectedIndex объекта Select возвращает номер выбранного варианта (
<FORM> Вариант: <SELECT onChange="form.e.value=selectedIndex;"> <OPTION>Один</OPTION> <OPTION>Два</OPTION> </SELECT> Выбрали индекс: <INPUT NAME=e> </FORM>
Обратите внимание, что в обработчике события мы ссылаемся на второй элемент формы. На данный момент он не определен, но событие произойдет только тогда, когда мы будем выбирать вариант - к этому моменту поле уже будет определено.
Если список вариантов задан как <SELECT , т.е. с возможностью выбора нескольких опций одновременно, то свойство selectedIndex возвратит индекс первой выбранной опции. На этот случай имеется альтернатива: свойство selected у каждого объекта Option. Оно равно true, если данная опция выбрана, и false в противном случае. Пример будет приведен ниже.
Событие наступает в тот момент, когда пользователь меняет свой выбор вариантов. Если поле является полем выбора единственного варианта, то все просто - см. предыдущий пример. Посмотрим, что происходит, когда мы имеем дело с полем выбора множественных вариантов:
<FORM>
Фрукты: <SELECT MULTIPLE
onChange="form.e.value='';
for(i=0; i<length; i++)
if(options[i].selected)
form.e.value += options[i].text+', ';">
<OPTION>яблоко</OPTION>
<OPTION>банан</OPTION>
<OPTION>киви</OPTION>
<OPTION>персик</OPTION>
</SELECT><BR>
Выбраны позиции: <INPUT READONLY SIZE=70 NAME=e>
</FORM>
Обратите внимание на то, что событие происходит тогда, когда пользователь выбирает или отменяет какой-либо вариант. Исключение составляет тот случай, когда варианты при выборе последовательно отмечаются (нажатие кнопки мыши на одном элементе, ведение мыши до конечного элемента, отпускание кнопки мыши). В этом случае событие происходит в тот момент, когда пользователь отпускает кнопку мыши, и все отмеченные альтернативы становятся выбранными.
В
<FORM> <INPUT TYPE=button VALUE="Кнопка типа button"> <INPUT TYPE=submit VALUE="Кнопка отправки"> <INPUT TYPE=reset VALUE="Кнопка сброса"> <INPUT TYPE=image SRC=a.gif> <!-- графическая кнопка --> </FORM>
В атрибуте кнопки можно задать обработчик события , а в атрибуте формы - обработчики событий onSubmit и onReset. Кроме того, кнопкам и форме соответствуют объекты . Объект, отвечающий форме, имеет методы и . С точки зрения программирования важен вопрос о взаимодействии этих методов друг с другом и с соответствующими обработчиками событий.
В каком случае при вызове метода (из любого места JavaScript-программы) будет автоматически вызван и соответствующий обработчик события, заданный пользователем в атрибуте кнопки или формы? Ответ здесь следующий:
click () кнопки вызывается и обработчик события onClick этой формы;submit () формы не вызывается обработчик события onSubmit формы;reset () формы вызывается и обработчик события onReset формы.Ниже мы на примерах рассмотрим, что это означает на практике. Таким образом, при программном вызове метода нужно позаботиться о дополнительном вызове обработчика события onSubmit, чтобы, например, данные не были отправлены на сервер без предварительной проверки. Как это сделать - мы расскажем ниже. Особое внимание мы уделим также возможности перехвата и генерирования события
Кнопка типа button вводится в форму главным образом для того, чтобы можно было выполнить какие-либо действия либо при ее нажатии пользователем, либо при вызове метода .
<FORM NAME=f>
<INPUT TYPE=button NAME=b VALUE="Кнопка" onClick="alert('5+7='+(5+7))">
</FORM>
<A HREF="javascript:document.f.b.click();void(0);">Вызвать метод click()</A>
у кнопки равносилен нажатию кнопки, что и демонстрирует приведенный пример. Как мы увидим ниже, это же справедливо для любых типов кнопок.
) позволяет отправить данные, введенные в форму, на сервер<FORM> атрибутов (его значением по умолчанию является адрес текущей страницы), (его значением по умолчанию является GET ) и (его значением по умолчанию является _self ) - стандартным действием браузера при
<FORM> <INPUT TYPE=submit> </FORM>
Для имитации ответа сервера заготовим следующий простой HTML-файл :
<HTML><BODY>Данные приняты!</BODY></HTML>
Теперь усложним наш пример: добавим обработчики событий (у кнопки отправки) и onSubmit (у формы), и посмотрим на поведение браузера при нажатии кнопки отправки:
<FORM NAME=f ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у кнопки отправки')"
TYPE=submit VALUE="Кнопка отправки" NAME=s>
</FORM>
Убедитесь, что нажатие кнопки отправки приводит к следующей последовательности действий браузера:
onClick у данной кнопки;onSubmit у формы;Соответственно, для выполнения дополнительных действий перед return false, мы сможем предотвратить
кнопки отправки равносилен нажатию этой кнопки - произойдут все три вышеперечисленных действия:
<FORM NAME=f ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у кнопки отправки')"
TYPE=submit VALUE="Кнопка отправки" NAME=s></FORM>
<A HREF="javascript: document.f.s.click();void(0);"
>Вызвать метод <B>click()</B> кнопки отправки</A>
формы не равносилен нажатию кнопки отправки. При вызове этого метода будет выполнено только третье из вышеперечисленных трех действий - кнопки отправки, вполне понятно - ведь мы пытаемся отправить данные в обход кнопки отправки (которой, кстати, может и не быть вовсе). Но и обработчик события onSubmit у формы тоже не вызывается - это является для многих неожиданным. Не будем судить, насколько это логично (и почему это поведение отличается от поведения метода , см. ниже), а просто проиллюстрируем этот эффект, введя в предыдущий пример ссылку, вызывающую метод :
<FORM NAME=f ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у кнопки отправки')"
TYPE=submit VALUE="Кнопка отправки" NAME=s></FORM>
<A HREF="javascript: document.f.submit();void(0);"
>Вызвать метод <B>submit()</B> формы</A>
Тем самым данные могут уйти на сервер без предварительной проверки JavaScript-скриптом. Каким же образом заставить браузер вызвать обработчик onSubmit? Для этого существует возможность обратиться к этому обработчику напрямую: document.f.onsubmit(). Остается предусмотреть, что после этого метод должен вызываться не всегда, а только если onSubmit либо не возвратил никакого значения, либо возвратил true, иными словами, если он не возвратил false. Окончательно мы получаем:
<FORM NAME=f ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у кнопки отправки')"
TYPE=submit VALUE="Кнопка отправки" NAME=s></FORM>
<A HREF="javascript:
if(document.f.onsubmit() != false)
document.f.submit(); void(0);"
>Вызвать <B>submit()</B> с преварительной проверкой onSubmit</A>
Есть еще один способ инициировать <INPUT TYPE=text> формы и пользователь нажмет клавишу Enter, то (в большинстве браузеров) произойдет вызов обработчика события onSubmit формы и
Введите текст и нажмите Enter:<BR>
<FORM ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT TYPE=text VALUE="Текст вводить здесь:" SIZE=50>
</FORM>
Этот способ работает логичнее, чем метод , т.к. отправляемые на сервер данные не избегают предварительной проверки обработчиком onSubmit.
) позволяет вернуть все поля формы в первоначальное состояние, которое они имели при загрузке страницы
onClick у данной кнопки;onReset у формы; у кнопки сброса равносилен нажатию этой кнопки, т.е. приводит к тем же трем действиям:
<FORM NAME=f
onReset="return confirm('Вы хотите очистить форму?')">
<INPUT TYPE=text VALUE="Измените этот текст">
<INPUT TYPE=reset VALUE="Кнопка сброса" NAME=s
onClick="alert('Вызван обработчик onClick у кнопки сброса')">
</FORM>
<A HREF="javascript: document.f.s.click();void(0);"
>Вызвать метод <B>click()</B> кнопки сброса</A>
Есть способы сбросить форму в исходное состояние в обход кнопки сброса (которой, кстати, у формы может и не быть). Во-первых, это у формы. Во-вторых, если фокус находится на любом поле или кнопке формы, то можно нажать клавишу Esc. Пример:
Измените текст, а затем нажмите Esc (либо ссылку).<BR>
<FORM NAME=f
onReset="return confirm('Вы хотите очистить форму?')">
<INPUT TYPE=text VALUE="Измените этот текст">
</FORM>
<A HREF="javascript: document.f.reset();void(0);"
>Вызвать метод <B>reset()</B> формы</A>
Как можно видеть, оба способа не просто сбрасывают форму, но и вызывают обработчик события onReset формы. Таким образом, метод ведет себя более логично и .
<FORM ACTION="receive.htm"> <INPUT TYPE=image SRC="pic.gif"> </FORM>
Кроме того, когда пользователь <MAP>.
Графические кнопки имеют ряд странностей. Например, являясь одновременно и кнопкой, и изображением, они почему-то отсутствуют как в коллекции document.f., так и в коллекции document.images[] (IE 7, Mozilla Firefox). Как следствие, они не учитываются ни в общем количестве элементов формы ( document.f. ), ни в общем количестве изображений документа ( document.images. ).
Как же обратиться к такой кнопке? Это можно сделать, например, задав атрибут ID:
<INPUT TYPE=image SRC="pic.gif" ID="d1">
и затем в программе написав: var knopka = document.. После этого мы можем обращаться к свойствам этой кнопки, например knopka.src, а также к методу knopka.. Следующий пример показывает, что графической кнопки "почти" равносилен нажатию этой кнопки, т.е. последовательно вызывает обработчики кнопки, onSubmit формы и передает данные на сервер (но что при этом передается в качестве координат курсора мыши?):
<FORM ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у графической кнопки')"
TYPE="image" SRC="pic.gif" id="d1">
</FORM>
<A HREF="javascript:
var knopka = document.getElementById('d1');
knopka.click(); void(0);"
>Вызвать метод <B>click()</B> графической кнопки</A>
Поскольку графические кнопки используются довольно редко, на этом мы остановимся в их обсуждении.
Если рассматривать программирование на JavaScript в исторической перспективе, то первыми объектами, для которых были разработаны методы и свойства, стали поля форм. Обычно контейнер FORM и поля форм именованы:
<FORM NAME=fname METHOD=get> <INPUT NAME=iname SIZE=30 MAXLENGTH=30> </FORM>
Поэтому в программах на JavaScript к ним обращаются по имени:
document.fname.iname.value="Текст";
Того же эффекта можно достичь, используя
document.forms[0].elements[0].value="Текст"; document.forms['fname'].elements['iname'].value="Текст";
Рассмотрим подробнее объект Form, который соответствует контейнеру FORM. Его свойства, методы и события используются для задания реакции на действия пользователя, например, изменения значений полей или нажатие кнопок.
| Свойства | Методы | События |
|---|---|---|
length action method target encoding elements[] |
reset() submit() |
Reset Submit |
Свойство отвечает за вызов javascript:, например:
<FORM METHOD=post ACTION="javascript: alert('Работает!');">
<INPUT TYPE=submit VALUE="Продемонстрировать JavaScript в ACTION">
</FORM>
Обратите внимание на тот факт, что в контейнере ?". Дело в том, что
alert('Строка');?
провоцирует ошибку JavaScript. Метод ?" не добавляется к URL, и ошибка не генерируется. При этом применение void(0) отменяет перезагрузку документа, и браузер не генерирует событие , т.е. не обращается к серверу при нажатии на кнопку, как это было бы при стандартной обработке формы.
Свойство определяет GET и .
JavaScript-программа может изменить значение этого свойства. В предыдущем разделе
<FORM NAME=f ACTION="javascript: alert('Работает!');">
<SCRIPT>
document.write('По умолчанию установлен метод: '+document.f.method+'.<BR>');
</SCRIPT>
<INPUT TYPE=button onClick="document.f.method='post'" VALUE="Сменить метод на POST">
<INPUT TYPE=button onClick="document.f.method='get'" VALUE="Сменить метод на GET"><BR>
<INPUT TYPE=submit VALUE="JavaScript в ACTION">
</FORM>
По умолчанию установлен метод GET.
В данном примере стоит обратить внимание на два момента:
Submit .SCRIPT встроен JavaScript-код, который сообщает FORM. Ставить его перед контейнером FORM нельзя, так как в момент получения FORM не будет создан, и, следовательно, работать с его свойствами не представляется возможным.Никаких других особенностей свойство не имеет. В данном свойстве можно указать и другие GET и , но это требует дополнительной настройки сервера.
Свойство определяет и свойства окна opener, top и . Кроме того, для загрузки window.open(). Все эти варианты будут продемонстрированы в разделе "Передача данных во
Свойство объекта Form (а также атрибут enctype контейнера FORM ) задает, каким образом данные из формы должны быть закодированы перед их отправкой на сервер. Возможные значения:
| Значение | Описание |
|---|---|
application/x-www-form-urlencoded |
Это значение по умолчанию. Означает, что в данных, передаваемых на сервер, пробелы заменяются на "+", а Щ заменяется на %D0%A9. |
text/plain |
Пробелы заменяются на "+", но |
multipart/form-data |
Никакие символы не кодируются (они передаются как есть). Данное значение необходимо указывать, если в форме имеются элементы отправки файлов: <INPUT TYPE=file>. |
При генерации встроенного в документ объекта Form браузер создает и связанный с ним массив ( . Обычно к полям обращаются по имени, но можно обращаться и по
<FORM NAME=f> <INPUT NAME=e SIZE=40> <BR><INPUT TYPE=button VALUE="Ввести текст по имени элемента" onClick="document.f.e.value='Текст введен по имени элемента';"> <BR><INPUT TYPE=button VALUE="Ввести текст по индексу элемента" onClick="document.f.elements[0].value='Текст введен по индексу элемента';"> <BR><INPUT TYPE=reset VALUE="Очистить"> </FORM>
Индексирование полей в массиве начинается с нуля. Общее число полей в форме f доступно двумя способами: как свойство массива document.f. и как свойство объекта формы: document.f..
Метод позволяет проинициировать передачу введенных в форму данных на сервер:
<FORM NAME=f ACTION="http://www.intuit.ru/rating_students/"> Ваше имя пользователя на intuit:<INPUT NAME=query> </FORM> <A HREF="javascript:document.f.submit();">Посмотреть рейтинг</A>
Как видите, кнопки отправки ( ) у формы нет, но нажав на ссылку, мы выполняем имеет отличия от нажатия пользователем кнопки INPUT типа TYPE= ; их мы рассмотрим в конце лекции.
Метод (не путать с обработчиком события onReset, рассматриваемым ниже) позволяет восстановить значения полей формы, заданные по умолчанию. Другими словами, равносилен нажатию на кнопку INPUT типа TYPE=, но при этом саму эту кнопку создавать не требуется.
<FORM NAME=f>
<INPUT VALUE="Значение по умолчанию" SIZE=30>
<INPUT TYPE=button VALUE="Изменим текст в поле ввода"
onClick="document.f.elements[0].value='Изменили текст';">
</FORM>
<A HREF="javascript:document.f.reset();void(0);">
Установили значение по умолчанию</A>
В данном примере если кликнуть по гипертекстовой ссылке, то в форме происходит восстановление значений полей по умолчанию.
Событие возникает (и соответствующий обработчик события onSubmit вызывается) при нажатии пользователем на кнопку типа или при выполнении метода . Действие по умолчанию, которое выполняет браузер при возникновении этого события - отправка введенных в поля формы данных на сервер, указанный в атрибуте , с помощью метода, указанного в атрибуте , с использованием способа кодирования, указанного в атрибуте ENCTYPE, и с указанием того, что результаты работы .
Фукцию обработки этого события можно переопределить и даже вовсе отменить. Для этой цели введен атрибут onSubmit="код_программы" у контейнера <FORM>. В нем можно указать действия (JavaScript-код), какие должны выполняться при возникновении этого события. Порядок выполнения этих действий и действий браузера, а также использование оператора return false для отмены последних, полностью аналогичны тем, что описаны ниже для onReset. Пример:
<SCRIPT>
function TestBeforeSend()
{
if(document.f.query.value=='')
{
alert('Пустую строку не принимаем!');
return false;
}
else return true;
}
</SCRIPT>
<FORM NAME=f METHOD=post onSubmit="return TestBeforeSend();"
ACTION="http://www.intuit.ru/rating_students/">
Ваше имя пользователя на intuit:<INPUT NAME=query>
<INPUT TYPE=submit VALUE="Посмотреть рейтинг">
</FORM>
В этом примере следует обратить внимание на конструкцию return TestBeforeSend(). Сама функция TestBeforeSend() возвращает значения true или false. Соответственно, данные либо отправляются на сервер, либо нет.
Событие возникает (и соответствующий обработчик события onReset вызывается) при нажатии пользователем на кнопку типа или при выполнении метода . Действие по умолчанию, которое выполняет браузер при возникновении этого события - восстановление значений по умолчанию в полях формы. Однако функцию обработки этого события можно переопределить и даже вовсе отменить. Для этой цели введен атрибут onReset="код_программы" у контейнера <FORM>. В нем можно указать действия (JavaScript-код), какие должны выполняться при возникновении этого события. Браузер сначала выполняет эти действия, а затем - свое действие по умолчанию. Но если последним оператором в обработчике onReset будет return false, то действие браузера по умолчанию выполняться не будет. Этот прием называется
<FORM onReset="javascript: alert('Не дадим восстановить!');return false;">
<INPUT VALUE="Измените этот текст" SIZE=30>
<INPUT TYPE=reset VALUE="Восстановить">
</FORM>
Здесь команда return false предотвратила восстановление значения поля. Команда return true, равно как и отсутствие оператора return, позволило бы браузеру продолжить
Как было сказано ранее, контейнеру <FORM> соответствует объект (назовем его f ) класса Form ; он является свойством объекта document. В свою очередь, элементы формы, вложенные в контейнер <FORM>, например, <INPUT> различных типов, тоже соответствуют объектам различных классов, причем эти объекты являются f.
У всех объектов, отвечающих полям формы, есть несколько стандартных свойств, доступных только для чтения: name (имя элемента, заданное в атрибуте NAME ), type (тип элемента, например, для контейнеров <INPUT TYPE="..."> он совпадает со значением атрибута TYPE ), form (указывает на форму f, в которой данный элемент содержится).
При программировании форм часто требуется писать обработчики событий для форм или их элементов, при этом нужно ссылаться на свойства данного элемента, других элементов и формы в целом. Стандартная схема именования по именам либо по индексам обсуждалась выше:
document.форма.элемент.свойство // точечная нотация document.форма.элемент["свойство"] // скобочная нотация document.forms["имя_формы"].elements["имя_элемента"].свойство document.forms[индекс_формы].elements[индекс_элемента].свойство
Однако получающиеся выражения - довольно громоздкие. Поэтому было введено следующее соглашение: в обработчике события формы или элемента формы имя текущего элемента можно опускать (вместе со всей предшествующей "приставкой"). Кроме того, ссылаться на сам текущий элемент можно с помощью ключевого слова this. Последнее может потребоваться, например, когда нужно передать в функцию не какое-то
Например, предположим, что у нас есть форма:
<FORM NAME=f> <INPUT TYPE=text NAME=e value="Текст" onFocus=""> <INPUT TYPE=button NAME=b value="Кнопка" onClick=""> </FORM>
Тогда вместо полной записи:
<INPUT TYPE=text NAME=e value="Текст" onFocus="alert(document.f.e.value)">
мы можем использовать краткую, опустив приставку " document.f.e ", указывающую на текущий элемент:
<INPUT TYPE=text NAME=e value="Текст" onFocus="alert(value)">
Более того, в этом контексте эквивалентны следующие записи:
value // короче не бывает!
this.value // здесь this ссылается на элемент "e"
form.e.value // form есть свойство объекта "e" (равное "f")
this.form.e.value // комбинируем оба способа
document.f.e.value // почти полная запись
window.document.f.e.value // это самая полная запись
document.f.e.form.e.value // можно итерировать "form.e."
Например, здесь в 3-й строчке form есть свойство (текущего!) элемента document.f.e - напомним, что это свойство ссылается на объект document.f. Аналогично, в обработчик элемента b мы можем поместить скрипт form.e.value=50 (краткое обращение к свойству другого элемента формы: document.f.e.value ) или (краткое обращение к свойству самой формы document.f. ) или даже TestForBugs(this) (в TestForBugs() будет передан (по ссылке) объект document.f.b ).
Как видим, это соглашение не только дает некоторую экономию кода, но также позволяет ссылаться на текущий элемент или на форму, не зная его имени или номера. Это предоставляет дополнительную гибкость при программировании форм; например, можно переименовать форму, ничего не меняя во всех скриптах. Далее мы рассмотрим объекты JavaScript, соответствующие полям различных типов в name, type и form есть у объектов всех элементов формы, то мы не будем их указывать особо.
INPUT типа TYPE=text ) являются одним из наиболее популярных объектов программирования на JavaScript. Это объясняется тем, что, помимо использования по прямому назначению, их применяют и в целях отладки программ, выводя в эти поля промежуточные значения переменных и свойств объектов.
<A HREF="http://site.com/">ссылка 1</A>
<FORM>Число гипертекстовых ссылок к данному моменту:
<SCRIPT>
document.write('<INPUT NAME=t VALUE='+document.links.length+'>');
</SCRIPT>
<BR><INPUT TYPE=button
VALUE="Число ссылок по окончании загрузки страницы"
onClick="form.t.value=document.links.length;">
<BR><INPUT TYPE=reset>
</FORM>
<A HREF="http://rite.com/">ссылка 2</A>
В данном примере первое поле формы - это
С каждым текстовым полем ввода <INPUT TYPE=text> связан свой объект класса Text, который является свойством той формы, в которой он был описан. Этот объект, в свою очередь, характеризуется следующими свойствами, методами и событиями:
| Свойства | Методы | Обработчики событий | |
|---|---|---|---|
defaultValue value size maxLength disabled readOnly |
focus() blur() select() |
onChange onSelect onFocus onBlur onClick onDblClick |
onMouseOver onMouseOut onMouseDown onMouseUp onKeyPress onKeyDown onKeyUp |
Все перечисленные value (текущее значение defaultValue (значение size (число умещающихся в поле символов, т.е. видимых) maxLength (максимальное число символов, которое можно присвоить значению данного поля) (может ли пользователь менять значение поля) (может ли пользователь установить фокус на этом поле).
Опишем вкратце - устанавливает фокус на данном поле, - убирает фокус с данного поля, select() - выделяет весь введенный текст (чтобы, например, его можно было скопировать в буфер, либо удалить, нажав клавишу Delete).
Смысл вызывается, когда пользователь (но не скрипт) изменил значение в onSelect - когда пользователь начинает выделять текст, расположенный в поле; onFocus и onBlur - когда поле получает и теряет фокус, соответственно; и - когда пользователь совершил одинарный или двойной щелчок мышью на поле, соответственно. Вторая колонка событий - стандартна для большинства элементов HTML-страницы. Нужно лишь иметь в виду, что обработчики событий onMouseDown, onMouseUp, onKeyPress, onKeyDown, onKeyUp срабатывают у того элемента формы, который в данный момент находится в фокусе.
Одним из важных элементов интерфейса пользователя являются списки вариантов. В <SELECT>, который вмещает в себя контейнеры <OPTION>. При этом список может "выпадать" либо прокручиваться внутри окна. В зависимости от наличия атрибута у контейнера <SELECT> список может быть либо с возможностью выбора только одного варианта, либо нескольких вариантов.
С каждым контейнером <SELECT> ассоциирован объект класса Select, а с каждым дочерним контейнером <OPTION> - объект класса Option, являющийся свойством данного объекта класса Select. Кроме того, Select является также коллекция options[], объединяющая все его дочерние объекты Option. Перечислим основные свойства, методы и события, характеризующие эти объекты.
| Свойства | Методы | Обработчики событий |
|---|---|---|
options[] size length multiple selectedIndex |
focus() blur() add() remove() |
onBlur onChange onFocus |
| Свойства | Методы | События |
|---|---|---|
defaultSelected selected index text value |
нет | нет |
Мы не будем описывать все свойства, методы и события этих двух объектов. Остановимся только на типичных способах применения их комбинаций.
Объект класса Option интересен тем, что в отличие от многих других встроенных в Option:
opt = new Option([ text, [ value, [ defaultSelected, [ selected ]]]]);
где аргументы соответствуют свойствам обычных объектов класса Option:
text - строка текста, которая размещается в контейнере <OPTION> (например: <OPTION> текст </OPTION> );value - значение, которое передается серверу при выборе альтернативы, связанной с объектом Option ;defaultSelected - выбрана ли эта альтернатива по умолчанию ( true / false );selected - альтернатива была выбрана пользователем ( true / false ).На первый взгляд не очень понятно, для чего может понадобиться программисту такой объект, ведь создать объект класса Select нельзя и, следовательно, нельзя приписать ему новый объект Option. Все объясняется, когда речь заходит об изменении списка альтернатив у имеющегося в документе объекта Select. Делать это можно, при этом изменение списка альтернатив Select не приводит к переформатированию документа. Изменение списка альтернатив позволяет решить проблему создания вложенных меню, которых нет в options[] ).
При программировании альтернатив следует обратить внимание на то, что у объектов класса Option нет свойства name, в виду того, что у контейнера <OPTION> нет атрибута NAME. Таким образом, к встроенным в документ объектам класса Option можно обращаться только как к элементам коллекции options[].
Встроенный массив ( options[] - это одно из свойств объекта Select. Элементы этого массива являются полноценными объектами класса Option. Они создаются по мере загрузки страницы браузером. Количество объектов Option, содержащихся в объекте document.f.s класса Select, можно узнать с помощью стандартного свойства массива: document.f.s.options.. Кроме того, у самого объекта Select есть такое же свойство: document.f.s. - оно полностью идентично предыдущему.
Программист имеет возможность не только создавать новые объекты Option, но и удалять уже созданные браузером объекты:
<FORM>
<SELECT NAME=s>
<OPTION>Первый вариант</OPTION>
<OPTION>Второй вариант</OPTION>
<OPTION>Третий вариант</OPTION>
</SELECT>
<INPUT TYPE=button VALUE="Удалить последний вариант"
onClick="form.s.options[form.s.length-1]=null;">
<INPUT TYPE=reset VALUE="Сбросить">
</FORM>
В данном примере при загрузке страницы с сервера у нас имеются три альтернативы. Их можно просматривать как ниспадающий список вариантов. После нажатия на кнопку " Удалить последний вариант " в форме остается только две альтернативы. Если еще раз нажать на эту кнопку, останется только одна альтернатива. В конечном счете, вариантов не останется вовсе, т.е. пользователь лишится возможности выбора. При нажатии кнопки сброса ( ) варианты не восстанавливаются - альтернативы утеряны бесследно.
Теперь, используя конструктор Option, сделаем процесс обратимым:
<SCRIPT>
function RestoreOptions()
{
document.f.s.options[0] = new Option('Вариант один','',true,true);
document.f.s.options[1] = new Option('Вариант два');
document.f.s.options[2] = new Option('Вариант три');
return false;
}
</SCRIPT>
<FORM NAME=f onReset="RestoreOptions();">
<SELECT NAME=s>
<OPTION>Первый вариант</OPTION>
<OPTION>Второй вариант</OPTION>
<OPTION>Третий вариант</OPTION>
</SELECT>
<INPUT TYPE=button VALUE="Удалить последний вариант"
onClick="form.s.options[form.s.length-1]=null;">
<INPUT TYPE=reset VALUE=Reset>
</FORM>
Восстановление альтернатив мы поместили в обработчик события onReset контейнера FORM. Создаваемые объекты класса Option мы присваиваем объекту document.f.s класса Select. При этом первая альтернатива должна быть выбранной по умолчанию (аргументу defaultSelected задано значение true ), чтобы смоделировать поведение при начальной загрузке страницы.
Свойство text представляет собой отображаемый в меню текст, который соответствует альтернативе. В HTML-коде он расположен между тэгами <OPTION> и </OPTION>. Свойство value содержит значение атрибута VALUE тэга <OPTION>. Например, пусть один из вариантов в списке был описан как:
<OPTION VALUE="n1">Вариант первый</OPTION>
Тогда значение свойства text у соответствующего объекта будет равно " Вариант первый ", а значение свойства value равно " n1 ".
Возникает вопрос, зачем нужны два свойства? Дело в том, что на сервер передается значение value выбранного варианта. В случае же, когда атрибут VALUE у контейнера <OPTION> отсутствует, на сервер передается значение text.
Свойство selectedIndex объекта Select возвращает номер выбранного варианта (
<FORM> Вариант: <SELECT onChange="form.e.value=selectedIndex;"> <OPTION>Один</OPTION> <OPTION>Два</OPTION> </SELECT> Выбрали индекс: <INPUT NAME=e> </FORM>
Обратите внимание, что в обработчике события мы ссылаемся на второй элемент формы. На данный момент он не определен, но событие произойдет только тогда, когда мы будем выбирать вариант - к этому моменту поле уже будет определено.
Если список вариантов задан как <SELECT , т.е. с возможностью выбора нескольких опций одновременно, то свойство selectedIndex возвратит индекс первой выбранной опции. На этот случай имеется альтернатива: свойство selected у каждого объекта Option. Оно равно true, если данная опция выбрана, и false в противном случае. Пример будет приведен ниже.
Событие наступает в тот момент, когда пользователь меняет свой выбор вариантов. Если поле является полем выбора единственного варианта, то все просто - см. предыдущий пример. Посмотрим, что происходит, когда мы имеем дело с полем выбора множественных вариантов:
<FORM>
Фрукты: <SELECT MULTIPLE
onChange="form.e.value='';
for(i=0; i<length; i++)
if(options[i].selected)
form.e.value += options[i].text+', ';">
<OPTION>яблоко</OPTION>
<OPTION>банан</OPTION>
<OPTION>киви</OPTION>
<OPTION>персик</OPTION>
</SELECT><BR>
Выбраны позиции: <INPUT READONLY SIZE=70 NAME=e>
</FORM>
Обратите внимание на то, что событие происходит тогда, когда пользователь выбирает или отменяет какой-либо вариант. Исключение составляет тот случай, когда варианты при выборе последовательно отмечаются (нажатие кнопки мыши на одном элементе, ведение мыши до конечного элемента, отпускание кнопки мыши). В этом случае событие происходит в тот момент, когда пользователь отпускает кнопку мыши, и все отмеченные альтернативы становятся выбранными.
В
<FORM> <INPUT TYPE=button VALUE="Кнопка типа button"> <INPUT TYPE=submit VALUE="Кнопка отправки"> <INPUT TYPE=reset VALUE="Кнопка сброса"> <INPUT TYPE=image SRC=a.gif> <!-- графическая кнопка --> </FORM>
В атрибуте кнопки можно задать обработчик события , а в атрибуте формы - обработчики событий onSubmit и onReset. Кроме того, кнопкам и форме соответствуют объекты . Объект, отвечающий форме, имеет методы и . С точки зрения программирования важен вопрос о взаимодействии этих методов друг с другом и с соответствующими обработчиками событий.
В каком случае при вызове метода (из любого места JavaScript-программы) будет автоматически вызван и соответствующий обработчик события, заданный пользователем в атрибуте кнопки или формы? Ответ здесь следующий:
click () кнопки вызывается и обработчик события onClick этой формы;submit () формы не вызывается обработчик события onSubmit формы;reset () формы вызывается и обработчик события onReset формы.Ниже мы на примерах рассмотрим, что это означает на практике. Таким образом, при программном вызове метода нужно позаботиться о дополнительном вызове обработчика события onSubmit, чтобы, например, данные не были отправлены на сервер без предварительной проверки. Как это сделать - мы расскажем ниже. Особое внимание мы уделим также возможности перехвата и генерирования события
Кнопка типа button вводится в форму главным образом для того, чтобы можно было выполнить какие-либо действия либо при ее нажатии пользователем, либо при вызове метода .
<FORM NAME=f>
<INPUT TYPE=button NAME=b VALUE="Кнопка" onClick="alert('5+7='+(5+7))">
</FORM>
<A HREF="javascript:document.f.b.click();void(0);">Вызвать метод click()</A>
у кнопки равносилен нажатию кнопки, что и демонстрирует приведенный пример. Как мы увидим ниже, это же справедливо для любых типов кнопок.
) позволяет отправить данные, введенные в форму, на сервер<FORM> атрибутов (его значением по умолчанию является адрес текущей страницы), (его значением по умолчанию является GET ) и (его значением по умолчанию является _self ) - стандартным действием браузера при
<FORM> <INPUT TYPE=submit> </FORM>
Для имитации ответа сервера заготовим следующий простой HTML-файл :
<HTML><BODY>Данные приняты!</BODY></HTML>
Теперь усложним наш пример: добавим обработчики событий (у кнопки отправки) и onSubmit (у формы), и посмотрим на поведение браузера при нажатии кнопки отправки:
<FORM NAME=f ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у кнопки отправки')"
TYPE=submit VALUE="Кнопка отправки" NAME=s>
</FORM>
Убедитесь, что нажатие кнопки отправки приводит к следующей последовательности действий браузера:
onClick у данной кнопки;onSubmit у формы;Соответственно, для выполнения дополнительных действий перед return false, мы сможем предотвратить
кнопки отправки равносилен нажатию этой кнопки - произойдут все три вышеперечисленных действия:
<FORM NAME=f ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у кнопки отправки')"
TYPE=submit VALUE="Кнопка отправки" NAME=s></FORM>
<A HREF="javascript: document.f.s.click();void(0);"
>Вызвать метод <B>click()</B> кнопки отправки</A>
формы не равносилен нажатию кнопки отправки. При вызове этого метода будет выполнено только третье из вышеперечисленных трех действий - кнопки отправки, вполне понятно - ведь мы пытаемся отправить данные в обход кнопки отправки (которой, кстати, может и не быть вовсе). Но и обработчик события onSubmit у формы тоже не вызывается - это является для многих неожиданным. Не будем судить, насколько это логично (и почему это поведение отличается от поведения метода , см. ниже), а просто проиллюстрируем этот эффект, введя в предыдущий пример ссылку, вызывающую метод :
<FORM NAME=f ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у кнопки отправки')"
TYPE=submit VALUE="Кнопка отправки" NAME=s></FORM>
<A HREF="javascript: document.f.submit();void(0);"
>Вызвать метод <B>submit()</B> формы</A>
Тем самым данные могут уйти на сервер без предварительной проверки JavaScript-скриптом. Каким же образом заставить браузер вызвать обработчик onSubmit? Для этого существует возможность обратиться к этому обработчику напрямую: document.f.onsubmit(). Остается предусмотреть, что после этого метод должен вызываться не всегда, а только если onSubmit либо не возвратил никакого значения, либо возвратил true, иными словами, если он не возвратил false. Окончательно мы получаем:
<FORM NAME=f ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у кнопки отправки')"
TYPE=submit VALUE="Кнопка отправки" NAME=s></FORM>
<A HREF="javascript:
if(document.f.onsubmit() != false)
document.f.submit(); void(0);"
>Вызвать <B>submit()</B> с преварительной проверкой onSubmit</A>
Есть еще один способ инициировать <INPUT TYPE=text> формы и пользователь нажмет клавишу Enter, то (в большинстве браузеров) произойдет вызов обработчика события onSubmit формы и
Введите текст и нажмите Enter:<BR>
<FORM ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT TYPE=text VALUE="Текст вводить здесь:" SIZE=50>
</FORM>
Этот способ работает логичнее, чем метод , т.к. отправляемые на сервер данные не избегают предварительной проверки обработчиком onSubmit.
) позволяет вернуть все поля формы в первоначальное состояние, которое они имели при загрузке страницы
onClick у данной кнопки;onReset у формы; у кнопки сброса равносилен нажатию этой кнопки, т.е. приводит к тем же трем действиям:
<FORM NAME=f
onReset="return confirm('Вы хотите очистить форму?')">
<INPUT TYPE=text VALUE="Измените этот текст">
<INPUT TYPE=reset VALUE="Кнопка сброса" NAME=s
onClick="alert('Вызван обработчик onClick у кнопки сброса')">
</FORM>
<A HREF="javascript: document.f.s.click();void(0);"
>Вызвать метод <B>click()</B> кнопки сброса</A>
Есть способы сбросить форму в исходное состояние в обход кнопки сброса (которой, кстати, у формы может и не быть). Во-первых, это у формы. Во-вторых, если фокус находится на любом поле или кнопке формы, то можно нажать клавишу Esc. Пример:
Измените текст, а затем нажмите Esc (либо ссылку).<BR>
<FORM NAME=f
onReset="return confirm('Вы хотите очистить форму?')">
<INPUT TYPE=text VALUE="Измените этот текст">
</FORM>
<A HREF="javascript: document.f.reset();void(0);"
>Вызвать метод <B>reset()</B> формы</A>
Как можно видеть, оба способа не просто сбрасывают форму, но и вызывают обработчик события onReset формы. Таким образом, метод ведет себя более логично и .
<FORM ACTION="receive.htm"> <INPUT TYPE=image SRC="pic.gif"> </FORM>
Кроме того, когда пользователь <MAP>.
Графические кнопки имеют ряд странностей. Например, являясь одновременно и кнопкой, и изображением, они почему-то отсутствуют как в коллекции document.f., так и в коллекции document.images[] (IE 7, Mozilla Firefox). Как следствие, они не учитываются ни в общем количестве элементов формы ( document.f. ), ни в общем количестве изображений документа ( document.images. ).
Как же обратиться к такой кнопке? Это можно сделать, например, задав атрибут ID:
<INPUT TYPE=image SRC="pic.gif" ID="d1">
и затем в программе написав: var knopka = document.. После этого мы можем обращаться к свойствам этой кнопки, например knopka.src, а также к методу knopka.. Следующий пример показывает, что графической кнопки "почти" равносилен нажатию этой кнопки, т.е. последовательно вызывает обработчики кнопки, onSubmit формы и передает данные на сервер (но что при этом передается в качестве координат курсора мыши?):
<FORM ACTION="receive.htm"
onSubmit="return confirm('Вы хотите отправить данные?')">
<INPUT onClick="alert('Вызван обработчик onClick у графической кнопки')"
TYPE="image" SRC="pic.gif" id="d1">
</FORM>
<A HREF="javascript:
var knopka = document.getElementById('d1');
knopka.click(); void(0);"
>Вызвать метод <B>click()</B> графической кнопки</A>
Поскольку графические кнопки используются довольно редко, на этом мы остановимся в их обсуждении.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.