Олег Никитенко
www.comizdat.com
Полезные функции и
скрипты
Помните, мы говорили о
том, что браузеры могут проверять версию языка
JavaScript? И в зависимости от результатов выполнять тот
или иной код. Когда это нужно? Например, в последней
версии JavaScript появились новые функции, и вы хотели
бы использовать их на своей страничке. Но во всех ли
браузерах это будет работать? Для этого достаточно
проверить, поддерживает ли данный браузер
соответствующую версию JavaScript. Это можно сделать,
например, с помощью такого кода:
<!-- ..... -->
<!-- По умолчанию принимаем, что минимальная версия,-->
<!--которая поддерживается браузером,-->
<!-- — это JavaScript 1.0. -->
<!—Begin
jsver = "1.0";
// End -->
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript1.1">
<!—Begin
jsver = "1.1";
// End -->
</SCRIPT>
<SCRIPT Language="JavaScript1.2">
<!—Begin
jsver = "1.2";
// End -->
</SCRIPT>
<SCRIPT Language="JavaScript1.3">
<!-- Begin
jsver = "1.3";
// End -->
</SCRIPT>
<SCRIPT Language="JavaScript1.4">
<!-- Begin
jsver = "1.4";
// End -->
</SCRIPT>
<SCRIPT Language="JavaScript1.5">
<!-- Begin
jsver = "1.5";
// End -->
</SCRIPT>
<!-- ..... -->
<!-- проверить версию визуально... -->
document.write ("Javascript Version: " + jsver + "");
<!-- проверить версию программно... -->
<!-- ..... -->
Здесь есть, правда, один
недостаток. В старых версиях Opera (3.2x) приведенный
код безболезненно выполняется до конца, в результате
чего переменная jsver получает значение 1.5. Остается
лишь порекомендовать пользователям обновить свой софт…
Полезным будет также и
код для определения платформы:
<HTML>
<HEAD>
<TITLE>Определение используемой платформы.</TITLE>
<SCRIPT language=JavaScript>
function test_os() {
var isMac, isPC, machine;
if (parseInt(navigator.appVersion)>=4) {
isMac = (navigator.platform == "MacPPC");
isPC = (navigator.platform == "Win32");
if (isMac)
machine="Mac";
if(isPC)
machine="Win"
}
document.write("Вы используете платформу: " + machine);
}
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT language=JavaScript>
test_os()
</SCRIPT>
</BODY>
</HTML>
Если же необходимо
получить более подробный отчет об используемой ОС, код
потребуется немного расширить:
<HTML>
<HEAD>
<TITLE>Определение версии ОС.
Расширенный вариант.</TITLE>
<SCRIPT language=JavaScript>
function test_os() {
if ((navigator.userAgent.indexOf ('Win') != -1) &&
(navigator.userAgent.indexOf('98') != -1))
{ var OpSys = "Windows 98"; }
else if((navigator.userAgent.indexOf('Win') != -1) &&
(navigator.userAgent.indexOf('95') != -1))
{ var OpSys = "Windows 95"; }
else if(navigator.appVersion.indexOf("16") !=-1)
{ var OpSys = "Windows 3.1"; }
else if (navigator.appVersion.indexOf ("NT") !=-1)
{ var OpSys= "Windows NT"; }
else if (navigator.appVersion.indexOf ("Linux") !=-1)
{ var OpSys = "Linux"; }
else if (navigator.userAgent.indexOf ('Mac') != -1)
{ var OpSys = "Macintosh"; }
else { var OpSys = "other"; }
return OpSys;
}
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT language=JavaScript>
var OpSys = test_os();
document.write("Вы используете ОС: " + OpSys);
</SCRIPT>
</BODY>
</HTML>
К сожалению, в версиях
Opera 3.2x оба варианта программы работать не будут.
Придется вам подумать самостоятельно, как решить эту
проблему.
На следующем примере
показано, как определить версию браузера пользователя.
Вам наверняка попадались сайты с рекомендациями
просматривать оные только в Navigator и/или IE версии не
ниже n.nn. В противном случае сайт вам покажут с
ограничениями или вообще не покажут. Для определения
версии браузера в начале кода странички обычно
помещается специальный скрипт. Например,
такой:
К сожалению, и здесь не
обошлось без «подводных камней». Например, последний
релиз Navigator 6.2.1 идентифицируется как Mozilla/5.0.
Пришлось пойти на хитрость, объединив версии 5 и 6 в
одном операторе document.write("Navigator 5 или выше (в
т.ч. 6.2+). А в Opera, начиная с 5-го релиза,
пользователь вообще может самостоятельно указывать, как
следует идентифицировать этот браузер (как Opera,
Navigator или Internet Explorer). Дело в том, что многие
сайты «не признают» Opera, вот и приходится
«притворяться» Navigator или IE.
А теперь допустим, что у
нас есть несколько страниц, размещенных в интернете, и
на каждую из них мы хотим ставить дату последнего
обновления. Делать это вручную? Нет уж, увольте…
Достаточно «повесить» на страничку небольшой код,
который бы информировал о последних изменениях.
Например, такой:
<HTML>
<HEAD>
<TITLE> Последнее обновление...
или не последнее? </TITLE>
<SCRIPT language="JavaScript">
<!--
function last_update() {
document.write ("<P>Последний раз страничка
обновлялась ... " + document.lastModified);
}
//-->
</SCRIPT>
</HEAD>
<BODY bgcolor="#FFFFF0" text="#000000">
<SCRIPT language="JavaScript">
last_update();
</SCRIPT>
</BODY>
</HTML>
Поскольку была
использована англоязычная версия Navigator 6.2, дата
обновления странички также проставлена на английском.
Обратите внимание, что
функция document.lastModified регистрозависима! Если по
ошибке поставить в названии функции прописные буквы, код
работать не будет.
Можно добавить на
веб-страницу и другую полезную информацию, например, о
текущей дате или дне недели (рис. 6). Рассмотрим пример
такого кода, а заодно попытаемся его оптимизировать:
<HTML>
<HEAD>
<TITLE> Текущая дата на страничке </TITLE>
</HEAD>
<SCRIPT LANGUAGE="JavaScript">
function cur_date() {
var day = "";
var month = "";
var myweekday = "";
var year = "";
mydate = new Date();
myday = mydate.getDay();
mymonth = mydate.getMonth();
myweekday = mydate.getDate();
weekday = myweekday;
myyear = mydate.getYear();
year = myyear
if (myday == 0)
day = " Воскресенье, "
else if (myday == 1)
day = " Понедельник, "
else if ………
else if(myday == 6)
day = " Суббота, "
if (mymonth == 0)
month = "Январь "
else if (mymonth ==1)
month = "Февраль "
else if ………
else if (mymonth ==11)
month = "Декабрь "
if ((navigator.appName == "Microsoft Internet
Explorer") && (year < 2000))
year="19" + year;
if (navigator.appName == "Navigator")
year=1900 + year;
return ("<FONT face=Verdana size=2 color=BLUE>
Сегодня ... " + day + month +
myweekday + ",
" + year + "</FONT>")
}
</SCRIPT>
<BODY bgcolor="#FFFFF0" text="#000000">
<H3> С днем рождения, программер!</H3>
<SCRIPT language="JavaScript">
document.write (cur_date());
</SCRIPT>
</BODY>
</HTML>
В этом примере
использованы стандартные функции getDay(), getMonth() и
getDate(), возвращающие, соответственно, номер дня
недели, месяца и дату. Специфика их работы заключается в
том, что отсчет ведется от нуля, а отсчет дней недели —
еще и от воскресенья. Функция getYear() возвращает год
после 1900.
Длинную и нудную
конструкцию if … else можно заменить оператором switch:
switch (myday) {
case 0: {day = "Воскресенье"; break;}
………
case 6: {day = "Суббота"; break;}
default:
}
switch (mymonth) {
case 0: {month = "Январь"; break;}
………
case 11: {month = "Декабрь"; break;}
default:
}
<!—..… -->
return ("<FONT face=Verdana size=2 color=BLUE>
Сегодня ... " + day + ", " + month + " " +
myweekday + ", " + year + "</FONT>")
Все равно мы никуда не
делись от длинного перечисления. Можно ли еще ужать код?
Да, если воспользоваться массивом. Внесем небольшие
изменения и получим следующую программу, которая
выполняет те же функции: См.
пример.
Код стал куда компактнее.
Если убрать комментарии, то, по сравнению с первым
вариантом, программа «похудела» более чем на 430 байт.
Тот, кто знаком с языком
C, наверняка спросит: нельзя ли присвоить элементам
массива значения сразу при объявлении? И правда,
напрашивается решение вроде:
days[] = {" ", "Воскресенье", "Понедельник", ...
... "Суббота"};Да, нечто
подобное можно сделать:
function cur_date() {
// в обоих массивах нулевой элемент не используется
var months = new Array(" ", "Январь", ...
... "Декабрь"); // массив месяцев
var days = new Array(" ", "Воскресенье", ...
... "Суббота"); // массив дней недели
<!—..… -->
}
Теперь добавим информацию
о текущем времени. Изменения в программе сводятся к
дополнительной функции (назовем ее cur_time()) и
изменении оператора вывода в основном теле программы:
function cur_time() {
var now = new Date();
var hours = now.getHours();
var minutes = now.getMinutes();
var seconds = now.getSeconds()
var timeValue = "" + ((hours >12) ? hours -12 :hours)
if (timeValue == "0") timeValue = 12;
timeValue += ((minutes < 10) ? ":0" : ":") + minutes
timeValue += ((seconds < 10) ? ":0" : ":") + seconds
timeValue += (hours >= 12) ? " P.M." : " A.M."
return (timeValue);
}
<!-- ... -->
<BODY …>
<SCRIPT language="JavaScript">
document.write (cur_date() + "<P>Время: " + cur_time());
</SCRIPT>
Как и в описанном выше
случае, здесь используются стандартные функции getHours(),
getMinutes() и getSeconds(), которые возвращают,
соответственно, часы от 0 до 23, минуты от 0 до 59 и
секунды от 0 до 59.
Те, кто проверяет работу
примера в Opera 5, могут заметить, что год отображается
довольно странно. Дело в том, что, начиная с пятой
версии, в Опере предусмотрено несколько вариантов
идентификации этого браузера: как Opera (год 102), как
MSIE5 (год 19102) и как браузер семейства Mozilla. В
последнем случае год отображается правильно.
Наверняка вам привычнее
воспринимать время в «нашем» формате (например, 23:50),
а не в английском (11:50 P.M.). Для этого достаточно
убрать из кода «лишние» операторы:
function cur_time() {
var now = new Date();
var hours = now.getHours();
var minutes = now.getMinutes();
var seconds = now.getSeconds()
var timeValue = "" + hours;
var timeValue = "" + hours;
timeValue += ((minutes < 10) ? ":0" : ":") + minutes
timeValue += ((seconds < 10) ? ":0" : ":") + seconds
return (timeValue);
}
Теперь попробуем
поместить на веб-страничку «бегущую строку». Это можно
сделать, например, так:
<HTML>
<HEAD>
<TITLE> Движущееся приветствие в строке status
браузера </TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
function scrollit_r2l(seed) {
var m1 = " С днем рождения, программер! ";
var m2 = " Вас приветствует сайт www.yahoo.com ;-) ";
var msg=m1+m2;
var out = " ";
var c = 1;
if (seed > 100) {
seed--;
var cmd="scrollit_r2l(" + seed + ")";
timerTwo=window.setTimeout(cmd,100);
}
else if (seed <= 100 && seed > 0) {
for (c=0 ; c < seed ; c++) {
out+=" ";
}
out+=msg;
seed--;
var cmd="scrollit_r2l(" + seed + ")";
window.status=out;
timerTwo=window.setTimeout(cmd,100);
}
else if (seed <= 0) {
if (-seed < msg.length) {
out+=msg.substring(-seed,msg.length);
seed--;
var cmd="scrollit_r2l(" + seed + ")";
window.status=out;
timerTwo=window.setTimeout (cmd,100);
}
else {
window.status=" ";
timerTwo=window.setTimeout ("scrollit_r2l(100)",75);
}
}
}
//---->
</SCRIPT>
</HEAD>
<BODY background="" bgcolor=white text=#000000
link=#0000FF vlink=#8000FF alink=#FF0000 onLoad=
"timerONE=window.setTimeout('scrollit_r2l(100)',500);">
<BASEFONT size=3>
<CENTER>
<H3> С днем рождения, программер!</H3>
</CENTER>
<P>
<SMALL>Если вы используете IE5, Opera 3.x/5 или
Navigator 6, обратите внимание на строку, где
отображается состояние загрузки странички ;-)
<BR><HR>
</BODY>
</HTML>
В данном случае строка
приветствия отображается в строке состояния браузера. Не
очень внимательный пользователь может его и не заметить.
Лучше разместить приветствие непосредственно в окне
браузера. Например, используя такой код:
<HTML>
<HEAD>
<TITLE> Движущееся приветствие в
окне браузера.</TITLE>
</HEAD>
<BODY background="" bgcolor=white text=#000000
link=#0000FF vlink=#8000FF alink=#FF0000>
<TABLE border=1 cellpadding=8 width=468
bordercolor=#B4B8BE>
<TR>
<TD bgcolor=#E8EDF3 valign=top align=CENTER>
<FONT size=2 color=#77A0D7><b>
<MARQUEE width=100% direction=left behavior=scroll
loop=infinite scrollamount=2 scrolldelay=20>
<A href=http://www.yahoo.com target=_blank>
С днем рождения, программер!
Вас приветствует сайт www.yahoo.com ;-)
</A></MARQUEE></B></FONT>
</TD></TR></TABLE>
</BODY>
</HTML>
К сожалению, такая
программа корректно выполняется только в среде Internet
Explorer. В Navigator 6 и в Opera картинка будет
неподвижной.
Вам, конечно, хотелось бы
попробовать применить скрипты на практике. Нет ничего
проще. Рассмотрим программу, которая выполняет некоторые
вычисления и отображает их в окне браузера:
См.
пример использование функции для расчета параметров
Обратите внимание на
контекст функции calc_my_val(). Если вы хотите, чтобы
программа корректно работала не только с последними
релизами Navigator, IE и Opera, но и с более ранними
версиями (например, Opera 3.x), то начало и конец блока
with (Math) следует убрать.
Аналогичное замечание
относится и к строке
document.form.sqrt_val.value=sqrt_val_.
Opera 3 «не понимает»
промежуточных значений, совпадающих с именами полей и
др. (в нашем случае это sqrt_val). Пришлось заменить эту
переменную на sqrt_val_. Результат (для примера выбрано
число 50) представлен на рис. 7.
А как же с проверкой
вводимых данных? Можно сделать и ее. Рассмотрим это на
другом примере -
вводе телефонного номера
Для проверки введенных
данных используется функция valF(). Из нее, в свою
очередь, вызывается функция isNum(), где, собственно, и
проверяются вводимые числа. Как ясно из текста
программы, максимальная длина полей (код региона и номер
телефона) составляет, соответственно, 3 и 7 цифр. Если
поля остаются пустыми или пользователь вводит вместо
цифр хотя бы один символ, программа выдает сообщение об
ошибке.