Выбрать главу

  Пароль: <input type="password" name="password"><br>

  <button type="submit">Войти</button>

</form>

<script>

  var form = document.querySelector("form");

  console.log(form.elements[1].type);

  // → password

  console.log(form.elements.password.type);

  // → password

  console.log(form.elements.name.form == form);

  // → true

</script>

Кнопка с атрибутом type равным submit при нажатии отправляет форму. Нажатие клавиши Enter внутри поля формы имеет тот же эффект.

Отправка формы обычно означает, что браузер переходит на страницу, обозначенную в атрибуте формы action, используя либо запрос GET, либо POST. Но перед этим запускается свойство “submit”. Его можно обработать в JavaScript, и обработчик может предотвратить поведение по умолчанию, вызвав на объекте event preventDefault.

<form action="example/submit.html">

  Значение: <input type="text" name="value">

  <button type="submit">Сохранить </button>

</form>

<script>

  var form = document.querySelector("form");

  form.addEventListener("submit", function(event) {

    console.log("Saving value", form.elements.value.value);

    event.preventDefault();

  });

</script>

Перехват событий “submit” полезен в нескольких случаях. Мы можем написать код, проверяющий допустимость введённых значений и сразу же показать ошибку вместо передачи данных формы. Или мы можем отключить отправку формы по умолчанию и дать программе возможность самой обработать ввод, например используя XMLHttpRequest для отправки данных на сервер без перезагрузки страницы.

Текстовые поля

Поля с тегами <input> и типами text и password, а также теги , имеют общий интерфейс. У их элементов DOM есть свойство value, в котором содержится их текущее содержимое в виде строки текста. Присваивание этому свойству значения меняет содержимое поля.

Свойства текстовых полей selectionStart и selectionEnd содержат данные о положении курсора и выделения текста. Когда ничего не выделено, их значение одинаковое, и равно положению курсора. Например, 0 обозначает начало текста, 10 обозначает, что курсор находится на 10-м символе. Когда выделена часть поля, свойства имеют разные значения, а именно начало и конец выделенного текста. В эти поля также можно записывать значение.

К примеру, представьте, что вы пишете статью про Khasekhemwy, но затрудняетесь писать его имя правильно. Следующий код назначает тегу <textarea> обработчик событий, который при нажатии F2 вставляет строку “ Khasekhemwy”.

<textarea></textarea>

<script>

  var textarea = document.querySelector("textarea");

  textarea.addEventListener("keydown", function(event) {

    // The key code for F2 happens to be 113

    if (event.keyCode == 113) {

      replaceSelection(textarea, "Khasekhemwy");

      event.preventDefault();

    }

  });

  function replaceSelection(field, word) {

    var from = field.selectionStart, to = field.selectionEnd;

    field.value = field.value.slice(0, from) + word

                  field.value.slice(to);

    // Put the cursor after the word

    field.selectionStart = field.selectionEnd =

      from + word.length;

  };

</script>

Функция replaceSelection заменяет текущий выделенный текст заданным словом, и перемещает курсор на позицию после этого слова, чтобы можно было продолжать печатать.

Событие “change” для текстового поля не срабатывает каждый раз при вводе одного символа. Оно срабатывает после потери полем фокуса, когда его значение было изменено. Чтобы мгновенно реагировать на изменение текстового поля нужно зарегистрировать событие “input”, которое срабатывает каждый раз при вводе символа, удалении текста или других манипуляциях с содержимым поля.

В следующем примере мы видим текстовое поле и счётчик, показывающий текущую длину введённого текста.

<input type="text"> length: <span id="length">0</span>

<script>

  var text = document.querySelector("input");

  var output = document.querySelector("#length");

  text.addEventListener("input", function() {

    output.textContent = text.value.length;

  });

</script>

Галочки и радиокнопки

Поле галочки – простой бинарный переключатель. Его значение можно извлечь или поменять через свойство checked, содержащее булевскую величину.

<input type="checkbox" id="purple">

<label for="purple">Сделать страницу фиолетовой</label>

<script>

  var checkbox = document.querySelector("#purple");