Лекция

Тема: «Работа с числами. Строки. Формы и компоненты»

 

План

1. Работа с числами

2. Функции для расчетов

3. Преобразования типов

4. Работа со строками

5. Формы и ее элементы. Свойства, методы и события

 

1. Работа с числами

Для работы с числами используются переменные или числовые константы. При этом тип переменной не указывается и определяется присваиваемым значением.

Над такими переменными можно выполнять все действия, которые допустимы в языке С: "+", "-", "*", "/", "++", "--", "+=", "-=", "*=", "/=", "%" и т.д. Для применения указанных операций необходимо, чтобы аргумент или аргументы обязательно были числами. В противном случае код скрипта не компилируется и не работает (при этом сообщений об ошибках в окне браузера не выдается).

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

Для проверки используется функция вида:

 

isNaN(значение) - возвращает true, если значение не число; и возвращает false, если значение число.

 

Пример.

 

var a;

a=10;

b="Текст";

if (isNaN(a)) - false (число)

if (isNaN(b)) - true (не число)

 

Каждое число представляет собой объект, который имеет свои свойства и методы. Наиболее используемыми методами являются (с обязательным сохранением регистра символов в написании):

 

.toFixed(n) - задает точность до n знаков после запятой. Метод выполняется с округлением.

.toPrecision(n) - задает общую ширину без точки. Метод выполняется с округлением, но учитывается только следующая цифра

.toString() - преобразовывает число в текст

 

Пример.

Пусть имеются переменные.

var a,b;

a=12.547;

b=25.1;

 

a.toFixed(2) - 12.55

b.toFixed(2) - 25.10

 

a.toPrecision(3) - 12.5 (округления нет, так как за 5 идет цифра 4)

b.toPrecision(5) - 25.100

 

a.toString() - число стало текстом

(b.toFixed(2)).toString() - округляем число до 25.10 и конвертируем в текст

 

2. Функции для расчетов

Для выполнения расчетов в JavaScript существует набор специальных методов, которые являются частью встроенного объекта Math (обратите внимание на регистр первого символа). К таким методам относятся:

 

Math.abs(x)

модуль числа x

Math.acos(x)

арккосинус числа x

Math.asin(x)

арксинус числа x

Math.atan(x)

арктангенс числа x

Math.ceil(x)

округление вверх числа x

Math.cos(x)

косинус числа x

Math.exp(x)

экспонента от числа x

Math.floor(x)

округление вниз числа x

Math.log(x)

натуральный логарифм числа x

Math.max(x1, x2, . . ., xn)

максимальное из чисел

Math.min(x1, x2, . . ., xn)

минимальное из чисел

Math.pow(x,y)

число x в степени y

Math.random()

случайное число на отрезке от 0 до 1

Math.round(x)

округление числа x

Math.sin(x)

синус числа x

Math.sqrt(x)

корень числа x

Math.tan(x)

тангенс числа x

 

Кроме методов для разработчика в распоряжении имеется несколько свойств, с помощью которых можно получить значение некоторых математических констант:

 

Math.E

Константа Эйлера, экспонента, основание натурального логарифма. Приблизительно 2.718

Math.LN2

Натуральный логарифм 2, приблизительно 0.693

Math.LOG2E

Логарифм E по основанию 2, приблизительно 1.442

Math.LOG10E

Логарифм E по основанию 10, приблизительно 0.434

Math.PI

Отношение длины окружности к ее диаметру, число PI, приблизительно 3.14159.

Math.SQRT12

Квадратный корень из 1/2; иначе говоря, 1 поделить на корень из 2, приблизительно 0.707

Math.SQRT2

Квадратный корень из 2, приблизительно 1.414

Math.LN10

Натуральный логарифм 10, приблизительно 2.302

           

3. Преобразование типов

Как уже говорилось ранее, преобразование типов выполняется "на лету" в соответствии с контекстом команды. Однако, в некоторых случаях нужно явно преобразовать тип. Для этого используется ряд приемов:

 

- если перед текстовой переменной поставить знак "+", то эта переменная преобразовывается в число, при условии, что ее значение допускает такое преобразование.

 

Пример.

 

var a,b

a='10'; //в переменной текст

b=+a; //в переменной число

 

- если числовую переменную нужно преобразовать в текст, то вызовите для переменной метод .toString(). Пример.

 

var a,b;

a=10; //в переменной число

b=a.toSgtring(); //в переменной текст

 

- если нужно программно сформировать некоторый фрагмент кода и "заставить" браузер понять его и выполнить, то такой фрагмент преобразовывают в команду с помощью команды eval(текст).

 

Пример.

 

var s;

s='alert("Доброе утро");' //в переменной текст

eval(s); //текст конвертируется в команду и сразу выполняется

 

4. Работа со строками

Строкой является как переменная, так и фраза, заключенная в одинарные или двойные кавычки. Каждая строка в JavaScript является объектом, у которого есть ряд методов для работы с ним:

 

.charAt(i) – символ в номером i. Нумерация начинается с 0.

 

Пример. s="Текст";

      s.charAt(0) = "Т"

 

.charCodeAt(i) - код символа с номером i.

 

.concat(str1, str2, . . ., strN) - добавляет в тексту указанные строки.

 

Пример. s="Пример";

      s.concat(" текста.") = "Пример текста"

 

.indexOf(str[,n]) - ищет в строке позицию первого вхождения текста str, начиная с позиции n. Если n не указано, то поиск идет с начала текста. Возвращает номер позиции, с которой найден фрагмент str, иначе - возвращает "-1".

 

Пример. s="Пример текста".

      s.indexOf("Пример") = 0

      s.indexOf("текста") = 7

      s.indexOf("утро") = -1

 

.lastIndexOf(str[,n]) - ищет в строке позицию последнего вхождения текста str, начиная с позиции n. Если n не указано, то поиск идет с начала текста. Возвращает номер позиции, с которой найден фрагмент str, иначе - возвращает "-1".

 

Пример. s="Пример текста".

      s.lastIndexOf("е") = 8

      s.lastIndexOf("р") = 5

 

.match(регулярное выражение) - возвращает найденное в строке выражение в соответствии с заданным регулярным выражением. Регулярные выражения будут рассмотрены позже.

 

Пример.

s='Пример текста с целым (1234) числом';

s.match(/\d\d*/) = 1234. В строке s находится последовательность цифр любой длины. Находится первое совпадение.

 

.replace(регулярное выражение, новый текст) - находит фрагмент с помощью регулярного выражения и заменяет на новый текст. Результат обязательно должен присваиваться новой переменной.

 

Пример.

s='Пример текста с целым (1234) числом';

s1=s.replace(/\d\d*/, 'ххх') = 'Пример текста с целым (ххх) числом'. В строке s находится первая последовательность цифр любой длины, заменяется на "ххх". Результат записывается в переменную s1.

 

.search(регулярное выражение) - возвращает номер позиции, с которой начинается первое найденное в строке выражение в соответствии с заданным регулярным выражением.

 

Пример.

s='Пример текста с целым (1234) числом';

s.search(/\d\d*/) = 23. В строке s находится позиция начала первой последовательности из цифр.

 

.slice(a[,b]) - возвращает часть строки, начиная с позиции a и до b-1. Если b не указана, то до конца текста. Если b отрицательное, то означает, сколько символов от конца текста нужно отступить.

 

Пример. s="Пример текста".

      s.slice(0,6) = "Пример"

      s.slice(7) = "текста"

      s.slice(7,-1) = "текст"

 

.split(разделитель[,n]) - разбивает текст на массив по разделителю. Если указан параметр n, то разбивается не более чем на n частей, а остальные игнорируются.

 

Пример. var s="12.5, 13, 45, 90.56, 23.6";
          var mas=s.split(",");
          mas[0]=12.5; mas[1]=13; mas[2]=45
и т.д.

 

.substr(a[,b]) - аналогично .slice()

 

.toLowerCase() - записывает все символы строчными.

 

Пример. s="Пример текста".

      s.toLowerCase = "пример текста"

 

.toUpperCase() - записывает все символы прописными.

 

Пример. s="Пример текста".

      s.toUpperCase = "ПРИМЕР ТЕКСТА"

 

Замечание. Все указанные методы не могут изменить саму строку и всегда возвращают новый текстовый объект, который или присваивайте переменной, или используйте в выражениях.

 

5. Формы и ее элементы. Свойства, методы и события

Одной из основных форм взаимодействия пользователей со страницей является использование форм и компонентов на ней. Используя компоненты формы, пользователь может вводить текст, выбирать разные режимы и параметры работы, генерировать разные события, которые обрабатываются нужными функциями JavaScript.

 

Работа с формами

 

По правилам HTML (хотя и не обязательно) все компоненты должны размещаться на формах, которые создаются с помощью тега:

 

<form> . . .</form>

 

Форма является частью объекта document и для доступа к ней можно использовать два способа:

 

- по имени формы. Если в теге формы задан атрибут "name=имя", то форма доступна с помощью записи:

 

document.имя

 

Пример.

 

<form name="form1">  . . .</form>

 

Для доступа к форме можно использовать запись:

 

document.form1

 

- по номеру формы на странице. Все формы на станице автоматически помещаются в массив forms, через который можно обращаться к формам так:

 

document.forms[0] - первая форма

document.forms[1] - вторая форма и т.д.

 

Как и любой массив, массив forms имеет свойство length - длина массива. Следовательно, в цикле можно пройти по всем формам страницы:

 

for (var i=0; i<forms.length; i++)

    . . . forms[i] . . .

 

 На каждой форме могут размещаться произвольные компоненты, задаваемые тегом <input>. Доступ к таким компонентам возможен по имени (если для компонента задан атрибут "name") или по порядковому номеру на форме через массив elements. При этом все элементы нумеруются слева направо, сверху вниз начиная с 0.

 

Работа с полями

 

Текстовое поле создается с помощью тега <input type="text" . . . >.

Для доступа к полю можно использовать или атрибут поля name, или его порядковый номер .

 

Пример. Пусть на описанной выше форме имеется поле вида:

 

<input type="text" name="T1>

 

Предположим, что это поле является первым на форме, следовательно, для доступа к нему можно использовать одну из записей:

 

document.form1.T1

document.form1.elements[0]

document.forms[0].T1

document.forms[0].elements[0]

 

 

Поля имеют свойство value, с помощью которого можно получить доступ к их содержимому.

 

Пример. Пусть имеется три поля с именами T1, T2, T3. Рассчитать сумму первых двух и записать ответ в третье.

Так как содержимое полей всегда воспринимается как текст, то перед расчетом нужно проверить содержимое поля и, если там число, то нужно конвертировать его содержимое в число.

 

<script type="text/javascript">

 

    //в переменные запишем значения полей

    var a=document.form1.T1.value; //или document.forms[0].elements[0].value

    var b=document.form1.T2.value; //или document.forms[0].elements[1].value

 

    //если в переменных числа

    if (!isNaN(a) && !isNaN(b))

        //суммируем переменные и записываем ответ в третье поле

        //с помощью операции "+" каждая переменная явно конвертируется в число   

        document.form1.T3.value=+a+(+b); //или document.forms[0].elements[2].value

 

</script>

 

Каждое поле имеет методы вида:

 

.focus() - устанавливает курсор в поле:

.select() - выделяет все содержимое поля.

 

Также поля имеют ряд событий, основными из которых являются:

 

onchange() - возникает при вводе или удалении символа в поле;

onfocus() - возникает при получении полем фокуса;

onblur() - возникает при выходе из поля.

 

Пример. Внесем изменения в предыдущий пример. Сделаем так, чтобы при загрузке страницы курсор автоматически стоял в первом поле на форме.

В разделе head страницы напишем функцию, которая устанавливает курсор в заданное через параметр поле.

 

<script type="text/javascript">

 

    function active(param)

    {

        eval(param).focus();

    }

 

</script>

 

Чтобы эта функция срабатывала при загрузке страницы, нужно ее вызвать в событии onload тега body. При этом в качестве параметра нужно передать имя поля, в которое нужно поставить курсор. Для этого в тег body добавьте параметр:

 

<body onload="active('document.form1.T1')">

 

Пример. Напишем код, который не позволяет выйти из поля, пока в него не будет введена цифра.

В скрипте добавим функцию, которая для поля, заданного с помощью параметра, выполняет такие действия.

 

 function validate(param)

{

    //если в поле не число или поле пустое   

    if (isNaN(eval(param).value) || eval(param).value=='')

    {

        //выдаем сообщение       

        alert('Можно ввести только число');

        //ставим опять курсор в это поле       

        eval(param).focus();

        //выделяем содержимое поля       

        eval(param).select()

    }

}
 

Данная функция должна вызываться при выходе из поля. Для этого найдите теги создания двух первых полей и добавьте в них событие onblur с вызовом данной функции. При этом в качестве параметра в функцию передается текущее поле.

 

Пример:

 

<input type="text" name="T1" size="20" onblur="validate('document.form1.T1')">

<input type="text" name="T2" size="20" onblur="validate('document.form1.T2')">

 

Обратите внимание, что для поля T1 в функции подставляется полное имя этого поля. Аналогично для поля T2.

В подобных ситуациях, когда элемент передает сам себя в функцию, то в Javascript можно в качестве параметра функции использовать стандартное имя "this", которое обозначает текущий элемент.

Наш пример можно записать так:

 

<p><input type="text" name="T1" size="20" onblur="validate(this)"></p>

<p><input type="text" name="T2" size="20" onblur="validate(this)"></p>

 

Работа с кнопками

 

Кнопка создается тегом <input type="button" . . . > и предназначена для запуска пользователем каких-либо действий с помощью щелчка на ней.

Кнопка имеет одно свойство value - содержит текст надписи на кнопке.

Основным событием для кнопки является событие onclick, возникающее при щелчке на кнопке.

 

Пример. Пусть на форме имеется массив из 10 полей с именами "T1"-"T10". Напишите функцию, которая рассчитывает сумму всех непустых полей и выводит результат в сообщении alert(). Для универсальности функция будет суммировать любое число полей, задаваемое через параметр.

 

В тег скрипта добавьте функцию вида:

 

function sum(param)

{

    //вначале сумма 0   

    var s=0;

    //цикл от 1 до последнего элемента   

    for (var i=1; i<=param; i++)

        //если в поле число       

        if (!isNaN(eval('document.form1.T'+i).value) )

            //суммируем его к ответу          

            s+=+eval('document.form1.T'+i).value;

    //выдаем ответ в сообщение   

    alert('Сумма = '+s);

}

 

В теге кнопки добавим параметр события onclick с вызовом созданной функции для 10 полей.

 

<p><input type="button" value="Расчет" onclick="sum(10)" ></p>

 

Работа с выпадающим списком

 

Выпадающий список создается с помощью тегов вида:

 

<select . . . >

    <option></option>

    <option></option>

    . . .

</select>

 

Элемент имеет свойства:

 

- selectedIndex - номер выбранного элемента (нумерация с 0);

- options[i].text - содержимое элемента с номером i (нумерация с 0)

 

Если на первой форме имеется список с именем D1, то для получения текста активного элемента используют запись вида:

 

document.form1.D1.options[document.form1.D1.selectedIndex].text

 

Основным событием списка является onchange, которое возникает, если пользователь выбрал новый элемент.

 

Пример. Пусть имеется список D1. Напишите функцию, которая выдает в сообщении alert() текст выбранного пользователем пункта.

В скрипте добавьте функцию вида:

 

function showList()

{

    alert(document.form1.D1.options[document.form1.D1.selectedIndex].text);

}

 

В теге списка добавьте событие onchange с вызовом данной функции:

 

<select name="D1" onchange="showList()">

 

Работа с флажками

 

Флажок создается с помощью тега  <input type="checkbox" . . . >. Он имеет основное свойство checked, которое принимает значения true/false, если флажок включен/выключен.

 

Пример. Пусть на форме имеется флажок с именем "C1". Напишите фрагмент кода, который выполняет разные действия в зависимости от состояния флажка.

 

if (document.form1.C1.checked)

    действие, если включен

else

    действие, если выключен;

 

Работа с переключателями

 

Переключатели создаются с помощью тега <input type="radio" . . .>. Группа переключателей определяется одинаковым именем name, а различается разными значениями параметра value.

Основным свойством переключателя является checked, которое принимает значение true/false. Однако, определить, какой из переключателей выбран, обычными средствами не возможно.

 

Пример. Пусть имеется группа переключателей вида:

 

<p><input type="radio" name="R1" value="V1" checked ></p>

<p><input type="radio" name="R1" value="V2"></p>

<p><input type="radio" name="R1" value="V3"></p>

 

Если написать код вида:

 

if (document.form1.R1.checked)

 

то он не позволит определить активный переключатель, так как все переключатель имеют имя R1, и к какому из них вы обращаетесь не понятно.

Поэтому есть два способа определения активного переключателя.

 

 - распознавание переключателя по номеру элемента на форме.

 

if (document.form1.elements[n].checked) - где n - это номер нужного переключателя на форме. Его вычисление полностью лежит на разработчике.

 

- получение массива всех переключателей и нахождения в нем номера выбранного переключателя.

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

 

Пример.

 

//получаем массив элементов с именем R1

var radio=document.getElementsByName('R1');

//запускаем цикл по массиву radio

for (var i=0; i<radio.length; i++)

    //если очередной переключатель включен  

     if (radio[i].checked)

    {

        //запоминаем его номер       

        var nom=i;

        //завершаем работу цикла, дальше можно не продолжать

        break;

    }

 

Теперь, проверяя значение переменной nom, можно определить, какой из переключателей включен и выполнить соответствующие операции.

 

Пример. Пусть имеется форма вида:

 

 

Для кнопки написать код, который в зависимости от переключателя рассчитывает результат и отображает его в новом окне размером 250х200.

В теге скрипта напишите функцию для расчета:

 

<script type="text/javascript">

 

function calc()

{

    //переменная для результата   

    var rez;

    //получаем массив переключателей   

    var radio=document.getElementsByName('R1');

    //в цикле находим номер выбранного переключателя   

    for (var i=0; i<radio.length; i++)

        if (radio[i].checked)

        {

            var nom=i;

            break;

        }

 

    //в зависимости от номера переключателя выполняем расчет   

    switch (nom)

 

    {

        //сумма       

        case 0: rez=+document.form1.T1.value+(+document.form1.T2.value); break;

       

        //разность       

        case 1: rez=+document.form1.T1.value-(+document.form1.T2.value); break;

       

        //максимальное       

        case 2: if (+document.form1.T1.value>=+document.form1.T2.value)

                    rez=document.form1.T1.value

                else

                    rez=document.form1.T2.value; break;

       

        //среднее       

        case 3: rez=(+document.form1.T1.value-(+document.form1.T2.value))/2; break;

    }

 

    //создаем новое окно   

    var win=window.open("","win1","height=200,width=250");

    //выдаем в новом окне значение переменной rez

    win.document.write("<h2 align='center'>Результат: "+rez+"</h2>");

    //завершаем вывод

    win.document.close();

}

 

</script>

 

В тег кнопки добавьте событие onclick с вызовом созданной функции.

 

<input type="button" value="Расчет" name="B1" onclick="calc();">