- •1. Основні поняття
- •1.1. Сім варіацій на тему "Hello, world! "
- •1.1.1. Варіація перша: сама проста
- •1.1.2. Варіація друга: із секретним вихідним текстом
- •1.1.3. Варіація третя: із переменной і функціями
- •1.1.4. Варіація четверта: створення сторінки "на літу"
- •1.1.5. Варіація п'ята: із діалоговою панеллю
- •1.1.6. Варіація шоста: опрацювання події
- •1.1.7. Варіація сьома: із визначенням типу браузера
- •1.2. Перемінні в JavaScript
- •1.2.1. Оголошення перемінних
- •1.2.2. Присвоєння значення перемінним
- •1.2.3. Типи даних
- •1.2.4. Перетворення типів даних
- •1.3. Оператори мови JavaScript
- •1.3.1. Унарные оператори
- •1.3.2. Бинарные оператори
- •1.3.3. Оператори для роботи з окремими бітами
- •1.3.4. Оператори зсуву
- •1.3.5. Оператори відношення
- •1.3.6. Логічні оператори
- •1.3.7. Оператор присвоювання
- •1.3.8. Умовні оператори
- •1.3.9. Оператори циклу
- •1.3.10. Інші оператори
- •1.3.11. Старшинство операторів JavaScript
- •1.3.12. Функції в мові сценаріїв JavaScript
- •1.4. Приклади використання операторів циклу
- •2. Класи і об'єкти
- •2.1. Три типи об'єктів «JavaScript
- •2.1.1. Умонтовані об'єкти
- •2.1.2. Об'єкти браузера
- •2.1.3. Об'єкти на базі класів, утворюваних програмістом
- •2.2. Масиви в JavaScript
- •2.3.1. Властивості об'єкта window
- •2.3.2. Методи об'єкта window
- •2.4. Сценарії, що працюють з об'єктами window
- •2.4.1. Як закрити вікно браузера
- •2.4.2. Открываем нове окно
- •2.4.3. Текст , що біжить , у рядку стани браузера
- •2.4.4. Обмеження часу реакції користувача
- •2.4.5. Завантаження документа html у вікно браузера
- •2.5.1. Властивості об'єкта document
- •2.5.2. Методи об'єкта document
- •2.5.3. Колірне оформлення документа
- •2.5.4. Посилання і мітки в документі
- •2.6. Умонтований клас Math
- •2.6.1. Властивості
- •2.6.2. Методи
- •2.7. Умонтований клас Date
- •2.7.1. Конструктори класу Date
- •2.8. Умонтовані функції
- •2.9. Плавна зміна цвіту фона документа html
- •3. Робота з формами
- •3.1. Ієрархія об'єктів у формах
- •3.2. Форма і її властивості
- •3.2.2. Властивості об'єкта form
- •3.3. Об'єкти, що входять до складу форм
- •3.3.1. Кнопка button
- •3.3.2. Перемикач checkbox
- •3.3.3. Перемикач radio
- •3.3.4. Приклад форми з перемикачами
- •3.3.5. Список select
- •3.3.6. Приклади сценаріїв, що працюють із списками
- •3.3.7. Однострочное поле text
- •3.3.8. Перевірка анкети
- •3.3.9. Многострочное поле textarea
- •3.3.10. Приклад сценарію, що заповнює поле textarea
- •3.3.11. Однострочное поле password
- •3.3.12. Запровадження ідентифікатора і пароля
- •3.4. Перевірка заповнення форми
- •3.5. Шестнадцатеричный калькулятор
- •3.3.6. Електронні часи
- •4. Фреймы
- •4.1. Файл опису фреймов
- •4.2. Взаємодія між фреймами
- •4.2.1. Десятично-шестнадцатеричный перетворювач
- •4.2.2. Відображення декількох документів html
- •5. Растровые зображення
- •5.1. Растровое зображення як об'єкт
- •5.2. Динамічна заміна растровых зображень
- •5.2.1. Зміна зовнішнього вигляду графічних посилань
- •5.2.2. Створення анімаційних зображень
- •5.2.3. Чекання завантаження всіх зображень
- •6. Взаємодія з аплетами java
- •6.1. Вбудовування аплета Java у документ html
- •6.2. Виклик методів аплета Java із сценарію JavaScript
- •6.3. Доступ до полів аплета Java із сценарію JavaScript
- •6.4. Динамічне завантаження аплетов Java
- •7. Застосування cookie
- •7.1. Виконання основних операцій із cookie
- •7.1.1. Створення cookie
- •7.1.2. Одержання значення cookie
- •7.1.3. Зміна значення параметра cookie
- •7.1.4. Видалення cookie
- •7.1.5. Обмеження на використання cookie
- •7.2. Декілька прикладів використання cookie
- •7.2.1. Фіксація повторних провідин сторінки
- •7.2.2. Записна книжка Cookies Notepad
- •7.2.3. Настроювання параметрів документа html
- •7.2.5. Одержання cookie розширенням серверу Web
- •7.2.6. Лічильник провідин на базі cookie і програми cgi
- •7.3. Настроювання браузера для роботи з cookie
3.5. Шестнадцатеричный калькулятор
На мові сценаріїв JavaScript можна складати достатньо великі програми. Як приклад приведений вихідний текст сценарію, що виконує функції шестнадцатеричного калькулятора.
Калькулятор створений у документі HTML як форма з двома текстовими полями і кнопками, розташованими в осередках таблиці.
За допомогою кнопок 0 - F можна вводити шестнадцатеричные число, що будуть відображатися в текстовому полі Hex. У поле Dec знаходиться десяткове значення введеного шестнадцатеричного числа або результату обчислень.
Кнопки +, -, * і / призначені відповідно для виконання операцій додавання, вирахування, множення і розподілу. За допомогою кнопки Enter можна одержати результат обчислень. Кнопка СЕ дозволяє стерти поточне введене число, а кнопка С - скинути проміжний результат обчислень і поточне введене число.
Вихідний текст документа HTML із калькулятором поданий у листинге З.9.
Листинг 3.9. Файл chapter3/hexcalc/hexcalc. html
<HTML>
<head>
<TITLE>Hexadecimal calculator</TITLE>
<script>
<!--
var total = 0;
var lastOperation = "+";
var newnurnber = true;
function dec2hex(nDec)
{
var szHexTable = "0123456789ABCDEF";
var szResult = "";
var szBuf = "";
var nRem = 0;
var bNegative = false;
if(nDec < 0)
{
bNegative = true;
nDec = -nDec;
}
nTmp = nDec;
while(true)
{
nRem = nTmp % 16;
nTmp = nTmp / 16;
if(Math.floor(nTmp) < 16)
break;
szBuf = szHexTable.charAt(nRem);
szResult = szBuf.concat(szResult);
}
szBuf = szHexTable.charAt(nRem);
szResult = szBuf.concat(szResult);
if(Math.floor(nTmp) != 0)
{
szBuf=szHexTable.charAt(Math.floor(nTmp));
szResult = szBuf.concat(szResult);
}
if(bNegative == true)
return ("-" + szResult);
else
return szResult;
}
function putNumber(btn, form)
{
var szOld = "";
var szNew = "";
if(newnumber)
{
form.displayHex.value = "";
form.displayDec.value = "";
newnumber = false;
}
szOld = form.displayHex.value;
szNew = szOld.concat(btn.name) ;
nCurrent = eval("0x" + szNew) ;
form.displayHex.value = szNew;
form.displayDec.value = nCurrent;
}
function clearNumber(form)
{
form.displayHex.value = "0";
form.displayDec.value = "0";
newnumber = true;
}
function clearAll(form)
{
total = 0;
lastOperation = "+";
clearNumber(form);
}
function plusOp(form)
{
var result; result = total + " " + lastOperation + " " + form.displayDec.value; total = eval(result);
lastOperation = "+";
form.displayHex.value = dec2hex(total);
form.displayDec.value = total;
newnumber = true;
function minusOp(form)
{
var result;
result = total + " " + lastOperation + " " + form.displayDec.value;
total = eval(result);
lastOperation = "-";
form.displayHex.value = dec2hex (total);
form.displayDec.value = total;
newnumber = true;
}
function mulOp(form)
{
var result;
result = total + " " + lastOperation + " " + form.dispiayDec.value;
total = eval(result);
lastOperation = "*";
form.displayHex.value = dec2hex(total);
form.dispiayDec.value = total;
newnumber = true;
}
function divOp(form)
{
var result;
result = total + " " + lastOperation + " " + form.displayDec.value;
total = eval(result);
lastOperation = "/";
form.displayHex.value = dec2hex(total);
form.dispiayDec.value = total;
newnumber = true;
}
function getResult(form)
{
var result; result = total + lastOperation + eval("Ox" + form.displayHex.value);
total = eval(result);
form. displayHex. value = dec2hex (total);
form. displayDec. value = total;
newnumber = true;
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<FORM>
<TABLE BORDER=2 BORDERCOLOR="Black" BGCOLOR="Yellow">
<TR>
<TD>Hex:</TD>
<TD COLSPAN=3><INPUT TYPE=text NAME="displayHex" VALUE="0" onFocus="this.blur();"></TD>
</TR>
<TR>
<TD>Dec:</TD>
<TD COLSPAN=3><INPUT TYPE=text NAME="displayDec" VАLUЕ="0"
onFocus="this.blur();"></TD>
</TR>
<TR>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="C" VALUE=" С " onClick="putNumber(this, this. form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="D" VALUE=" D " onClick="putNumber(this, this. form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="E" VALUE=" E " onClick="putNumber(this, this. form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="F" VALUE=" F " onClick="putNumber(this, this. form);"></TD>
</TR>
<TR>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="8" VALUE=" 8 " onClick="putNumber(this, this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="9" VALUE=" 9 " onClick="putNumber(this, this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button " NAME="A" VALUE=" A " onClick="putNumber(this, this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="B" VALUE=" У " onClick="putNumber(this, thi s.form);"></TD>
</TR>
<TR>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="4" VALUE=" 4 " onClock="putNumber(this, this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="5" VALUE=" 5 " onClick="putNumber(this,this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="6" VALUE=" 6 " onClick="putNumber(this,this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="7" VALUE=" 7 " onClick="putNumber(this, this.form);"></TD>
</TR>
<TR>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="0" VALUE=" 0 " onClick="putNumber(this, this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="1" VALUE=" 1 " onClick="putNumber(this, this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="2" VALUE=" 2 " onClick="putNumber(this, this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="3" VALUE=" 3 " onClick="putNumber(this, this.form);"></TD>
</TR>
<TR>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="+" VALUE=" + " onClick="plusOp(this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="-" VALUE=" - " onClick="minusOp(this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="*" VALUE=" * " onClick="mulOp(this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="/" VALUE=" / " onClick="divOp(this.form);"></TD>
</TR>
<TR>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="C" VALUE=" С " onClick="clearAll(this.form);"></TD>
<TD ALIGN=CENTER><INPUT TYPE="button" NAME="CE" VALUE="CE" onClick="clearNumber(this.form);"></TD>
<TD COLSPAN=2 ALIGN=CENTER><INPUT TYPE="button" NAME="Enter" VALUE="Enter" onClick="getResult(this.form);"></TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
Найбільше цікаві моменти в листинге такі:
Коли калькулятор відображається в перший разом, у текстових полях displayHex і displayDec, призначених відповідно для відображення чисел у шестнадцатеричном і десятковому виді, знаходяться нульові значення:
<INPUT TYPE=text NAME="displayHex" VALUE="0"
onFocus="this.blur();">
<INPUT TYPE=text NAME="displayDec" VALUE="0"
onFocus="this. blur();">
Ці значення встановлюються параметром VALUE.
Для текстових полів displayHex і displayDec передбачений оброблювач події onFocus. Цей оброблювач одержує керування, коли користувач передасть полю фокус запровадження. Задача оброблювача полягає в тому, щоб знову відібрати фокус запровадження, запобігши безпосереднє редагування числа користувачем.
З кожній із кнопок, пов'язаної з запровадженням шестнадцатеричного числа, пов'язаний оброблювач події onClick, що викликає функцію putNumber, наприклад:
<INPUT TYPE="button" NAME="F" VALUE=" F "
onClick="putNumber (this, this. form);">
Цієї функції передаються два параметри - натиснута кнопка (як об'єкт класу button) і форма, у котрої ця кнопка знаходиться.
Задача функції putNumber - запровадження числа і його відображення в двох текстових полях, розташованих у верхній частині калькулятора:
function putNumber(btn,form)
{
var szOld = "";
var szNew = "";
if(newnumber)
{
form. displayHex. value = "";
form.displayDec.value = "";
newnumber = false;
}
szOld = form.displayHex.value;
SzNew = szOld.concat(btn.name);
nCurrent = eval("0x" + szNew);
form. displayHex. value = szKew;
form. displayDec. value = nCurrent;
На самому початку функція putNumber перевіряє двоичную перемінну newnumber. Якщо значення цей перемінної дорівнює true, користувач уводить першу цифру нового числа. У цьому випадку функція putNumber скидає вміст текстових полів displayHex і displayDec, а також установлює значення newnumber, рівне false.
Далі функція добавляє введену користувачем цифру попереду перемінної szOld, рівної поточному значенню з поля displayHex. При цьому вона викликає метод concat із класу String, призначений для злиття (конкатенации) рядків.
На такому етапі до введеному шестнадцатеричному числа добавляється префікс "Ох", після чого відбувається обчислення поточного значення функцією eval. Ця функція намагається інтепретувати текстовий рядок, переданий їй у якості параметра, як арифметичне вираження, повертаючи результат інтепретації у виді чисельного значення. Цей результат зберігається і перемінної nCurrent і відображається в текстовому полі displayDec (вихідне шестнадцатеричное число відображається в поле displayHex).
Якщо після запровадження числа користувач натискає одну з чотирьох кнопок призначених для виконання операцій додавання, вирахування, множення і розподілу, визиваються функції, призначені для цих кнопок в оброблювачі події onClick. Це функції plusOp (додавання), minusOp (вирахування), mulOp (множення) і divOp (розподіл).
Перераховані функції схожі один на одного, тому можна обмежитися докладним розглядом тільки однієї з них, що виконує операцію додавання:
function plusOp(form)
{
var result;
result = total + " " + lastOperation + " " + form.displayDec.value;
total = eval(result);
lastOperation = "+";
form.displayHex.value = dec2hex(total);
form.displayDec.value = total;
newnumber = true;
}
Тут глобальна перемінна total, що має початкове значення, рівне нулю, використовується для збереження проміжних результатів обчислень. Вона укладається з прогалиною і текстовим рядком lastOperation. потім ще з одною прогалиною і, нарешті, із рядком десяткового уявлення введеного числа, витягнутого з поля displayDec.
Рядок lastOperation призначений для збереження коду операції, що виконувалася востаннє. Додаткові прогалини потрібні для коректної роботи з негативними числами
За допомогою функції eval функція plusOp обчисляє результат операції і записує його в перемінну total. Потім у перемінну lastOperation записується код операції додавання - рядок "+".
На такому етапі функція plusOp перетворює значення total за допомогою функції dec2hex і відображає результат у шестнадцатеричном виді в поле displayHex, а також у двоичном - у поле displayDec.
Перед тим як повернути керування, функція plusOp записує в перемінну newnumber значення true. Це призводить до тому, що при подальшому запровадженні цифр вони будуть розглядатися як цифри другого що складається, що бере участь в операції додавання.
Функція getResult визивається, коли користувач натискає на клавішу калькулятора з написом Enter:
function getResult(form)
{
vаr result;
result = total + lastOperation + eval("Ox" + form.displayHex.value);
total = eval(result);
form.displayHex.value = dec2hex(total);
form. displayDec.value = total;
newnumber = true;
}
Від тільки що описаної функції plusOp ця функція відрізняється лише тим, що вона не змінює значення перемінної lastOperation (тому що дана кнопка служить для одержання підсумкового результату, а не для виконання арифметичної операції).
Цікаво роздивитися функцію dec2hex, що виконує перетворення десяткового числа в шестнадцатеричное. Результат перетворення ця функція повертає у виді текстового рядка.
На початку роботи функція dec2hex перевіряє знак вихідного числа. Негативні числа преобразовываются в позитивні, при цьому в перемінну bNegativе записується значення true.
Алгоритм перетворення десяткового числа в шестнадцатеричное заснований на розподілі вихідного числа на 16 у циклі. Якщо ціла частина результату розподілу, що обчисляється за допомогою методу Math.floor, надається менше 16, цикл завершується. У противному випадку залишок від розподілу розглядається як значення поточного шестнадцатеричного розряду.
Для того щоб одержати символічне уявлення шестнадцатеричного числа по його значенню, треба витягти потрібний символ із рядка szHexTable викликом для цього методу charAt:
szBuf=szHexTable. charAt(nRem);
szResult = szBuf concat(szResult);
Після завершення циклу функція обчисляє старші розряди результату, а також коректує знак цього результату відповідно до стана перемінної bNegative
