
Программирование / Заочники / Высокоуровневые методы / JavaScript_Урок 2
.pdf
Урок 2: События в DOM
Основная цель урока.
1.Научиться пользоваться событиями DOM-структуры документа
2.Научиться использовать строковые функции indexOf, fromCharCode, substring
3.Научиться работать с тегом input из JS
4.Освоить работу с циклами в JS
Учебное задание 2.
Написать приложение фильтрующее ввод в текстовые поля (только числовые значения).
Технология выполнения учебного задания 2.
Шаг 1. Откройте браузер Google Chrome и перейдите на страницу google.ru.
Откройте консоль разработчика.
Шаг 2. Попробуем переопределить функцию onkeypress у текстового поля для ввода запросов. Для этого нам нужно найти это текстовое поле по его id. Через команду
« Просмотр кода элемента» найдите id текстового поля и выполните следующую команду:
varx
=
document.getElementById("id элемента");
Шаг 3.
Теперь попробуем переопределить функцию onkeypress, которая отвечает за нажатие клавиши. В таблице 1 приведены некоторые события элементов DOM.
Таблица 1. События элементов
Событие (функция) |
|
Описание |
|
|
|
|
|
onkeypress |
|
Вызывается при нажатии и последующем отпускании |
|
|
|
клавиши. Принимает аргумент, содержащий в свойстве |
|
|
|
|
|
|
|
keyCode |
код нажатой клавиши. Если функция возвращает |
|
|
false, то нажатия клавиши не происходит. |
|
|
|
|
|
onkeydown |
|
Вызывается при нажатии клавиши. Аргументы аналогичны |
|
|
|
onkeypress. |
|
|
|
|
|
onkeyup |
|
Вызывается при отпускании клавиши. Аргументы |
|
|
|
аналогичны onkeypress. |
|
|
|
|
|
onclick |
|
Вызывается при клике на объект. |
|
|
|
|
|
ondblclick |
|
Вызывается при двойном клике на объект. |
|
|
|
|
|
onmousedown |
|
Вызывается при нажатии кнопки мыши |
|
|
|
|
|

onmousemove |
Вызывается при перемещении курсора мыши |
|
|
onmouseout |
Вызывается, когда курсор мыши выходит за пределы |
|
элемента |
|
|
onresize |
Вызывается, когда размер элемента изменился |
|
|
onscroll |
Вызывается, когда элемент прокручивается |
|
|
ondrag |
Вызывается периодически на элементе-источнике при |
|
операции перетаскивания |
|
|
Выполните следующий код в консоли разработчика:
x.onkeypress = function(e)
{
alert("Вы нажали клавишу с кодом " + e.keyCode);
}
Следующий пример чуть интереснее, попробуйте самостоятельно разобраться как он работает до выполнения кода в консоли разработчика:
var x = document.getElementById("gbqfq");
var pos = 0;
var desireStr = "как научиться программировать на 3-ем курсе"; x.onkeypress = function(e)
{
if (pos < desireStr.length) pos++; x.value = desireStr.substring(0, pos); return false;
}
Шаг 4. Попробуем написать скрипт фильтрующий ввод в текстовые поля. Так как страница может содержать множество текстовых полей, то хотелось бы получить универсальное решение, которое можно применить ко всем текстовых полям на странице (или « всем принадлежащим к такому-то классу»).
Найдите в интернете страницу с текстовыми полями (можно в гугле набрать запрос
« Калькулятор НДС»). Откройте консоль разработчика этой страницы.
Шаг 5. У объект document есть свойство all, которое является массивом содержащим все элементы(теги) загруженной страницы. Т.о. перечислив в цикле все элементы и выбрав только текстовые поля (по свойству tagName) мы можем переопределить событие onkeypress для всех текстовых полей на странице.
var all = document.all;
for(var i = 0; i < all.length; i++)
{
if (all[i].tagName == "INPUT")
{
all[i].onkeypress = function(e)
{
e = window.event || e;
var goodChars = "01234567890";
var с = String.fromCharCode(e.keyCode);

if (goodChars.indexOf(с) == -1) return false;
}
}
}
Справка по используемым функциям/свойствам:
|
Функция |
|
Описание |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
document.all |
|
|
|
|
|
Массив, содержащий все элементы страницы. |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var all = document.all; |
– переменная all ссылается |
|
|
|
|
|
|
|
|
|
|
на document.all, удобно использовать, чтобы не писать |
||
|
|
|
|
|
|
|
|
|
каждый раз длинное document.all |
||
|
|
|
|
|
|
|
|
|
|
||
|
all.length |
|
|
|
|
|
Свойство length. Возвращает количество элементов в |
||||
|
|
|
|
|
|
|
|
|
массиве. |
||
|
|
|
|
|
|
|
|
|
Так же может применяться к строкам. |
||
|
|
|
|
|
|
|
|
|
|||
|
e.keyCode |
|
|
|
|
|
Числовой код нажатой клавиши |
||||
|
|
|
|
|
|
|
|
||||
|
String.fromCharCode(e.keyCode) |
|
|
Преобразование кода клавиши в строку(символ) |
|||||||
|
|
|
|
|
|
||||||
|
goodChars.indexOf(с) |
|
|
|
indexOf |
метод строки, возвращает индекс первого |
|||||
|
|
|
|
|
|
|
|
|
вхождения аргумента в строку. Если аргумент не |
||
|
|
|
|
|
|
|
|
|
содержится в строке, возвращает -1 |
||
|
|
|
|
|
|||||||
|
e = window.event || e; |
|
|
кроссбраузерный код для аргумента event |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
Шаг 6. Попробуйте ввести буквы и цифры в текстовых полях на странице. Если всё сделано верно, то вводить можно будет только цифры (точнее то, что содержится в переменной goodChars).
У этого решения есть небольшой недостаток – оно не защищает от копирования текста в текстовое поле. Это можно обойти, если дополнительно проверять значение в текстовом поле по таймеру. Добавьте следующий код в цикл:
var check = function(obj)
{
var result = parseFloat(obj.value); if (isNaN(result)) result = "";
if (obj.value != result)
{
obj.value = result;
}
|
|
|
setTimeout(function() { check(obj) }, 10); |
|
|
|||
|
} |
|
|
|
|
|
|
|
|
check(all[i]); |
|
|
|
|
|||
|
Справка по используемым функциям/свойствам: |
|||||||
|
|
|
|
|
|
|
||
|
Функция |
|
|
Описание |
||||
|
|
|
|
|
||||
|
parseFloat |
|
|
Преобразует текст в число, до тех пор, пока это |
||||
|
|
|
|
|
|
|||
|
|
|
|
|
возможно. Например |
parseFloat(“100px”) == 100 |
|
|
|
|
|
|
|
Если невозможно возвращает NaN |
|
||
|
|
|
|
|
|
|
|
|
|
isNaN |
|
|
Функция проверяет является ли значение переменной |
|
|
|
|
равной NaN. (с NaN нельзя сравнивать напрямую, так |
|
|
|
|
как NaN это неопределённое число и NaN != NaN) |
|
|
|
|
|
|
if (obj.value != result) |
|
Важная проверка, если её не поставить, то значение |
|
|
|
|
|
текстового поля будет меняться, каждые 10 |
|
|
|
|
миллисекунд и текст невозможно будет выделить. |
|
|
|
|
|
Самостоятельное задание 2.
Написать JavaScript, удаляющий рекламные баннеры (картинки). Для теста можно взять любой сайт с рекламой (например, 74.ru). Обычно все рекламные баннеры ссылаются на внешний ресурс, т.о. можно занести домен рекламного сайта в « чёрный список» ( в смысле просто в переменную или массив) и при переборе элементов проверять, если ссылка на картинку содержит в себе этот домен, то… есть несколько вариантов – либо удалять этот элемент (метод remove), либо делать его невидимым (см. свойство display), либо менять картинку на другую. Реализация на ваше усмотрение.
Доп. задание (+5 баллов):
Должны удаляться/скрываться не только изображения, но и флеш-баннеры.