Apply
Синтаксис
apply(thisArg, argArray)
Параметры
thisArg ( вызываемый объект )
arg1, arg2, ... ( параметры вызываемого объекта )
apply позволяет применять методы одних объектов в контексте других ( вызывающих ). Так же как и в call объект this может принимать заданное значение ( this будет указывать на текущий, вызвавший объект ). Apply очень напоминает call, отличие лишь в типах параметров ( аргументов ) вызываемого объекта. В методе apply возможно использование любых типов массивов. Например: apply(this, new Array(name, value)). Разрешается так же использовать свойства вызываемого объекта. Можно использовать arguments для передачи всех параметров вызываемому обекту.
Пример:
function product(name, value) { this.name = name; if(value > 1000) this.value = 999; else this.value = value; } function prod_dept(name, value, dept) { this.dept = dept; product.apply(product, arguments); } prod_dept.prototype = new product(); cheese = new prod_dept(feta, 5, food); car = new prod_dept(honda, 5000, auto);
Архитектура сервлета
Разобьем нашу программу на две части. Первая часть - сервлет - отвечает за обработку HTTP запроса и возвращает клиенту требуемое изображение, если это возможно. Вторая часть, класс, формирующий картинку. Для простоты реализации, в качестве параметра при обращении к сервлету будет передаваться имя используемого класса. Соответствующий Java класс должен реализовывать определенный интерфейс для общения с сервлетом. Приведем описание этого интерфейса:
public interface ImageProducer {
/** * MIME тип создаваемого изображения. * * @return MIME тип изображения. */ public String getMIMEType();
/** * Создает изображение и записывает его в указанный поток. * * @param stream Куда писать картинку. */ public void createImage(OutputStream stream) throws IOException; }
Интерфейс ImageProducer содержит метод для определения типа изображения и метод для формирования изображения. Полученная картинка отправляется клиенту.
Следующий код демонстрирует, как сервлет работает с классами, реализующими интерфейс ImageProducer:
ImageProducer imageProducer =
(ImageProducer) Class.forName(request.getQueryString()).newInstance(); response.setContentType(imageProducer.getMIMEType()); imageProducer.createImage(response.getOutputStream());
Сервлет создает (загружается) класс с именем, указанным в параметрах запроса - части URL справа после "?". Полученный класс приводится к типу ImageProducer. Затем, обращаясь к соответствующим методам, сервлет получает тип и формирует изображение. В случае если нет ошибок, картинка пересылается клиенту.
Приведенный код может вызвать несколько исключений, наиболее распространенные из них: ClassNotFoundException и ClassCastException. Первое вызвано тем, что класс, имя которого передано в качестве параметра запроса, не доступен загрузчику (ClassLoader), второе же тем, что указанный класс не реализует интерфейс ImageProducer. В случае ошибки клиент, конечно же, не получает картинку, и броузер выводит изображение, показывающее, что сервер не ответил на запрос. Программа тестировалась с использованием Java Server Web Development Kit (JSWDK 1.0.1), но вы должны получить аналогичные результаты на большинстве других Веб серверах, поддерживающих Java.
Бегущая строка
Бегущая строка в строке статуса
<html>
<head>
<title>Бегущая строка</title>
<script language="javascript">
function statusmessageobject(p,d) {
this.msg = message
this.out = " "
this.pos = position
this.delay = delay
this.i = 0
this.reset = clearmessage
}
function clearmessage() {
this.pos = position
}
var position = 100
var delay = 40
var message = "центр информационных"
+ " технологий"
var scroll = new statusmessageobject()
function scroller() {
for (scroll.i = 0; scroll.i < scroll.pos; scroll.i++) {
scroll.out += " "
}
if (scroll.pos >= 0)
scroll.out += scroll.msg
else scroll.out = scroll.msg.substring(-scroll.pos,scroll.msg.length)
window.status = scroll.out
scroll.out = " "
scroll.pos--
if (scroll.pos < -(scroll.msg.length)) {
scroll.reset()
}
setTimeout ('scroller()',scroll.delay)
}
</script>
</head>
<body bgcolor="#000000" onLoad="scroller()">
</body> </html>
Бегущая строка в поле form.
<html>
<head>
<title>Бегущая строка</title>
</head>
<script language="JavaScript">
var line="Центр Информационных Технологий ";
var speed=150;
var i=0;
function m_line() {
if(i++<line.length) {
document.cit.forum.value=line.substring(0,i);
}
else{
document.cit.forum.value=" ";
i=0;
}
setTimeout('m_line()',speed);
}
</script>
<body bgcolor=000000>
<center>
<form name=cit>
<input type=text size=32 name=forum>
</form>
</center>
<script language="JavaScript">
m_line();
</script>
</body>
</html>
Brows
Имя броузера | document.write(navigator.appName); |
Версия броузера | document.write(navigator.appVersion); |
Кодовое название броузера | document.write(navigator.appCodeName); |
Заголовок пользовательского агента | document.write(navigator.userAgent); |
Call
Синтаксис
call(thisArg, arg1, arg2, ...)
Параметры
thisArg ( вызываемый объект )
arg1, arg2, ... ( параметры вызываемого объекта )
call позволяет вызывать методы одних объектов в контексте других ( вызвавших ) объектов. Это дает возможность задать свое значение объекту this, при вызове функции и, что самое главное, метод call позволяет написать метод один раз и наследовать его для других объектов не переписывая их! (См. также apply ).
Пример:
function product(name, value) { this.name = name; if(value > 1000) this.value = 999; else this.value = value; } function prod_dept(name, value, dept) { this.dept = dept; product.call(this, name, value); } prod_dept.prototype = new product(); cheese = new prod_dept(feta, 5, food); car = new prod_dept(honda, 5000, auto);
Чтение и запись изображений, требования к JDK
Для того чтобы сервлет - приложение, выполняемое на сервере, которое обрабатывает запросы пользователей,- мог динамически создавать изображения, прежде всего, необходим механизм чтения и записи графических файлов. Точнее, сервлет должен уметь отправить полученную картинку в ответ на запрос пользователя. Основные библиотеки (Core API) для Java не предоставляют средств, используя которые можно было бы сохранить полученное в памяти изображение в одном из графических форматов. Есть библиотеки Sun для Java 1.1 и лицензированные Sun библиотеки для Java 1.2. Поскольку, они расположены в пакете com.sun они не относятся ни к основным библиотекам, ни к стандартным расширениям (standard extension), поэтому использующие их приложения нельзя считать переносимыми (portable). Другими словами, они могут и не работать на виртуальной машине, выпущенной другой компанией. Стоит отметить, что утвержденный запрос Java Specification Request JSR-000015 на стандартное расширение Java 2 содержит описание механизма для чтения и записи графических файлов; когда он будет реализован, можно будет писать переносимые программы, осуществляющие ввод/вывод изображений.
Для этой статьи я подготовил примеры, работающие на платформах Java 1.1 и Java 1.2.
Что нового в JavaScript версии 1.3 от Netscape.
Степанищев Евгений
Язык JavaScript 1.3 поддерживается Navigator'ом версий 4.06 и 4.5.
Динамическая графика в Java сервлетах
Кен МакКрэри,
Server-Side Java
Обзор
Как создать графический счетчик посещений? Диаграмму, изображающую загруженность канала до провайдера или количество писем в очереди? Одним словом, как сформировать изображение динамически по запросу пользователя? В своей статье Ken McCrary предлагает варианты решения этой задачи. (2500 слов)
Графики и диаграммы позволяют облегчить восприятие аналитической информации. Представьте, например, таблицу измерений параметров загруженности канала, проводимых каждые пять минут. Трудно поверить, что у вас хватит терпения просматривать ее хотя бы раз в неделю. Тогда как, соответствующая диаграмма представляется вполне удобоваримой и исчерпывающей. Во многих случаях изображения должны создаваться в реальном времени по запросу пользователя. Потребность в этом может быть обусловлена природой отображаемых данных, в случае, когда данные поступают непрерывно или меняются со временем, или же возможностью значительно уменьшить используемое дисковое пространство. Конечно же, не всегда уместно (технически осуществимо) конструировать изображения динамически, но, там, где это действительно необходимо, использование удачных технологических решений может привести к значительному выигрышу в производительности и качестве сервиса.
Ex_date.shtml
Для вывода текущей даты используется объект Date и метод write объекта document.
current_date = new Date();
document.write("
Текуща\я дата: " + current_date + ".
");
<SCRIPT LANGUAGE="JavaScript">
current_date = new Date();
document.write("<p><i>Текуща\я дата:</i> " +
current_date + ".<p>");
</SCRIPT>
Также можно вывести сокращенный вариант для этого используются методы getDate, getMonth, getYear. Обратите внимание, что нумерация месяцев начинается с нуля.
current_date = new Date();
document.write("
Число: " + current_date.getDate() + "." + current_date.getMonth() + "." + current_date.getYear() + ".
");
<SCRIPT LANGUAGE="JavaScript">
current_date = new Date();
document.write("<i>Число:</i> " + current_date.getDate() +
"." + current_date.getMonth() + "." + current_date.getYear() + ".");
</SCRIPT>
Или такой вариант:
current_date = new Date();
document.write("
Врем\я: " + current_date.getHours() + "." + current_date.getMinutes() + "." + current_date.getSeconds() + ".
");
<SCRIPT LANGUAGE="JavaScript">
current_date = new Date();
document.write("<i>Врем\я:</i> " + current_date.getHours() +
"." + current_date.getMinutes() + "." + current_date.getSeconds() + ".");
</SCRIPT>
Exdiag.shtml
Гистограмма построена с использованием свойства images[ ] объекта Document.
<html>
<head>
<script language="JavaScript">
i=0 function d_rand() { for(j=0;j<10;j++) { for(i=0;i<10;i++) document.images[j+i*10].src = "white.jpg" y= Math.floor(Math.random()*10) for(i=9;i>9-y;i--) document.images[j+i*10].src = "blue.jpg" } } </script>
<body bgcolor=ffffff>
<center>
<table>
<tr>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<tr>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<tr>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<tr>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<tr>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
<td><img src="white.jpg" width=20 height=10></td>
Файлы данных, потоки, БД.
Итак, как все, надеюсь, знают, в языке Java для представления символов используется Unicode, т.е. по два байта на один символ (тип char размером в 16 бит). В набор символов входят всевозможные буквы со всякими чёрточками и припендюльками, греческие, математические и символы псевдографики. В том числе и так любимые нами символы кириллицы (диапазон значений 0x0400-0x04ff). Так что с этой стороны никакой дискриминации нет.
Если Вам интересны конкретные кода символов, для их просмотра удобно использовать программу "Таблица символов" из WinNT. Вот, например, диапазон кириллицы:
С другой стороны большинство файлов данных основано на 8-битовом представлении символов. Сюда входят также текстовые файлы и большинство баз данных (окромя наиболее продвинутых). Кроме того, что самое паршивое, одни и те же байты могут представлять разные символы (в зависимости от кодовой страницы). Налицо конфликт - как преобразовать одно в другое и наоборот, причём с наименьшими потерями для данных. Для этого был придуман довольно удобный механизм использования кодовых страниц. Для каждой кодовой страницы было создано по 2 класса перекодировки (ByteToChar и CharToByte). Классы эти лежат в пакете sun.io. Если, при перекодировке из char в byte не было найдено соответствующего символа, он заменяется на символ ?.
Кстати, эти файлы кодовых страниц в некоторых ранних версиях JDK 1.1 содержат ошибки, вызывающие ошибки перекодировок, а то и вообще исключения при выполнении. Например, это касается кодировки KOI8_R. Лучшее, что можно при этом сделать - сменить версию на более позднюю. Судя по Sun-овскому описанию, большинство этих проблем было решено в версии JDK 1.1.6.
Когда и как надлежит пользоваться этой перекодировкой? Когда пользоваться, в принципе, понятно - при любом преобразовании из byte в char и наоборот. В классе String в тех местах, где есть преобразование можно указать дополнительный параметр (String enc), задающий имя кодовой страницы. Это конструктор по массиву байтов и метод getBytes(). Однако, в реальной программе, явно указывать кодовую страницу не всегда удобно. Для этого была введена кодировка по умолчанию. По умолчанию она зависит от системы (для русских виндов принята кодировка Cp1251), и в старых JDK её можно изменить установкой системного свойства file.encoding. Вообще-то, как утверждают в Sun, это свойство отражает системную кодировку, и она не должна изменяться в командной строке (см., например, комментарии к BugID ) Эта кодировка используется тогда, когда явно не указанно название страницы. Т.к. эта настройка одна на все преобразования, иногда можно наткнуться на неприятности. Например, эта же настройка используется для вывода на консольный экран, что, в случае виндов, как правило, неприемлемо - там нужно использовать страницу Cp866. Было бы здорово, если бы эти кодировки указывались независимо - например, console.encoding и т.п., но, думаю, Sun-овцам пока не до таких высоких материй.
Кстати, о выводе на консоль. Есть два пути решения вышеуказанной проблемы:
Использовать вместо System.out.println свой класс, а уже в нём делать преобразование. Например:
public class Msg { static String cp = System.getProperty("console.encoding","Cp866"); public static void message(String msg) { msg += "\n"; byte[] b; try { b = msg.getBytes(cp); } catch( UnsupportedEncodingException e ) { b = msg.getBytes(); // В случае отсутствия нужной кодировки, // делаем преобразование по умолчанию } System.out.write(b); } } ... Msg.message("Сообщение");
Написать свою версию PrintStream, поддерживающую нужную кодировку, и подставить его через System.setOut() и System.setErr(). Вот, например, обычное начало в моих программах:
... public static void main(String[] args) { // Установка вывода консольных сообщений в нужной кодировке try { System.setOut(new CodepagePrintStream(System.out,System.getProperty("console.encoding","Cp866")) ); } catch(UnsupportedEncodingException e) { System.out.println("Unable to setup console codepage: " + e); } ...
Куда же податься бедному российскому программисту? Не отчаивайтесь, есть множество путей прочитать и сохранить данные из файлов в нужной Вам кодировке.
Читать и записывать массивы байтов (byte[]), а для перекодировки использовать упомянутые методы класса String. Этот способ особенно удобен, когда в потоке могут присутствовать данные в разных кодировках.
Использовать классы InputStreamReader и OutputStreamWriter из пакета java.io, специально предназначенные для этих целей.
Сделать преобразование в нужную кодировку. Если вы всё сделаете корректно, то данные не потеряются, хотя, конечно, пользоваться этим желательно только в крайнем случае. Пример:
// Чтение русских букв в кодировке Cp866 через объект, // поддерживающий только Cp437 String str = o.readString(); str = new String(str.getBytes("Cp437"),"Cp866"); // Сохранение русских букв в кодировке Cp866 через объект, // поддерживающий только Cp437 str = new String(str.getBytes("Cp866"),"Cp437"); o.writeString(str);
Более подробно о этом методе, и о возможных проблемах с ним, расписано ниже, в разделе О методе перекодировки символов. Настроить драйвер БД на нужную кодировку. Как именно - это зависит от конкретного драйвера. К сожалению, многие драйвера понятия не имеют о каких-то там кодировках. Иногда их можно пропатчить на этот счёт, но чаще всего приходится действовать обходными путями.
Например, один из самых часто используемых драйверов - мост JDBC-ODBC. В версиях JDK 1.1, этот мост просто игнорировал кодировки символов, из-за чего нужно было предпринять дополнительные ухищрения, типа описанных в предыдущем пункте (это также касается и последней ихней версии, 1.1.8).
Мост из комплекта Sun Java 2 теперь можно настроить на нужную кодировку. Это делается добавлением дополнительного свойства charSet в набор параметров, передаваемых для открытия соединения с базой. По умолчанию используется file.encoding. Делается это примерно так: // Параметры соединения с базой Properties connInfo = new Properties(); connInfo.put("user", username); connInfo.put("password", password); connInfo.put("charSet", "Cp1251"); // Устанавливаем соединение Connection db = DriverManager.getConnection(dataurl, connInfo);
Другой пример - драйвер JDBC-OCI (не pure Java - тот называется thin) от Oracle 8.0.5 под Linux. При получении данных из БД, драйвер определяет "свою" кодировку при помощи переменной окружения NLS_LANG. Если эта переменная не найдена, то он считает что кодировка - ISO88591. Весь фокус в том, что NLS_LANG должна быть именно переменной окружения, а properties (типа file.encoding) здесь "не катят". В случае использования драйвера внутри servlet engine Apache+Jserv, переменную окружения можно задать в файле jserv.properties: wrapper.env=NLS_LANG=American_America.CL8KOI8R
Информацию об этом прислал , за что ему отдельное спасибо.
Если же Вы свободны в формировании формата - тогда всё проще. Используйте формат Unicode или UTF8 - и проблем не будет.
В случае с БД, можно, конечно, использовать и какой-нибудь 16-ричный формат, но это не всегда приемлемо, т.к. Вы получите 2-х - 4-х кратный рост места на диске и потеряете возможность использовать стандартные программы работы с БД, например генераторы отчётов.
Форматы изображений
Формат GIF - самый распространенный формат графических файлов в Веб. Он широко поддерживается броузерами, в том числе и самыми первыми. К сожалению, написание программ, генерирующих изображения в этом формате, потенциально затруднено патентом на алгоритм сжатия данных. Программ, приведенные в этой статье, создают изображения в формате JPEG и PNG. Формат JPEG выбран, прежде всего, из тех соображений, что реализация Sun Java 1.2 позволяет формировать изображения этого типа без применения дополнительных библиотек. (В примере приложения для JDK 1.1 можно получить файл не только в формате PNG, но и во многих других, в том числе - JPEG и GIF - прим. переводчика)
Одно из различий между форматами JPEG и GIF состоит в том, что алгоритм сжатия данных, используемый в GIF, в отличие от алгоритма, используемого в JPEG, не искажает изображение. Обычно, артефакты в JPEG картинках не сильно заметны. (Следует отметить, что формат JPEG лучше справляется с представлением фотографий, нежели текста, диаграмм или изображений, содержащих тонкие линии и четкие границы цветовых переходов - прим. переводчика) Второй пример применяет формат PNG с алгоритмом сжатия без потери данных и, к тому же, свободный от правовых затруднений.
Функция escape
Возвращает ASCII значение аргумента, закодированного в ISO Latin-1.
Функция eval
Функция eval выполняет строку-аргумент и подставлает полученное значение вместо себя.
Функция isNaN
Изменена в Navigator 3.0.
На UNIX платформах проверяет аргумент, является ли он "NaN" (не числом).
Функция parseFloat
Анализирует строковый аргумент и возвращает число с плавающей точкой.
Функция parseInt
Анализирует строковый аргумент и возвращает целое число, определенное как основание.
Графические часы
Первый пример - это часы, отображающие время загрузки страницы (т.е. момент вызова скрипта). Используются методы объекта Date (getHours, getMinutes) и графические файлы, отображающие полученное время (имена этих файлов соответствуют цифрам - 0-9).
Во втором примере, отображающем текущую дату, также используются методы объекта Date (getDate, getMnth, getYear) и графические файлы, отображающие полученную дату (имена этих файлов соответствуют цифрам - 0-9).
1.<SCRIPT LANGUAGE="JavaScript">
<!--
// Copyright (c) 1996-1997 Tomer Shiran. All rights reserved.
// Permission given to use the script provided that this notice remains as is.
// Additional scripts can be found at http:
//www.geocities.com/~yehuda
/// image files needed:
// dg0.gif
// dg1.gif
// dg2.gif
// dg3.gif
// dg4.gif
// dg5.gif
// dg6.gif
// dg7.gif
// dg8.gif
// dg9.gif
// dgam.gif
// dgpm.gif
// dgc.gif
// Any set of digit images (0-9), an "am" image,
// a "pm" image, and a colon image respectively
// will work with this script.
// instructions:
// Place all image files in a folder / directory.
// Add this script, including all comments, to
// the desired HTML document. The HTML file must
// be located in the same directory as the image
// files.
document.write(setClock())
function setClock() {
// initialize accumulative HTML variable to empty string
var text = ""
// set standard convention for digit and punctuation images
var openImage = "<IMG SRC=\"" + getPath(location.href) + "dg"
var closeImage = ".gif\" HEIGHT=21 WIDTH=16>"
// initialize time-related variables with current time settings
var now = new Date()
var hour = now.getHours()
var minute = now.getMinutes()
now = null
var ampm = ""
// validate hour values
and set value of ampm
if (hour >= 12) {
hour -= 12
ampm = "pm"
} else
ampm = "am"
hour = (hour == 0) ? 12 : hour
// add zero digit to a one digit minute as spaceholder
if (minute < 10)
minute = "0" + minute
// do not parse this number!
// convert minute and hour values to strings
minute += ""
hour += ""
// assign image tags according to the value of hour
for (var i = 0; i < hour.length; ++i) {
text += openImage + hour.charAt(i) + closeImage
}
// assign image tag of colon separator to text variable
text += openImage + "c.gif\" HEIGHT=21 WIDTH=9>"
// assign image tags according to the value of minute
for (var i = 0; i < minute.length; ++i) {
text += openImage + minute.charAt(i) + closeImage
}
// assign am / pm image tag to text variable
text += openImage + ampm + closeImage
// return accumulative HTML string
return text}function getPath(url) {
lastSlash = url.lastIndexOf("/")
return url.substring(0, lastSlash + 1)}
// -->
</SCRIPT>
2.<SCRIPT LANGUAGE="JavaScript">
<!--
// Copyright (c) 1996-1997 Tomer Shiran. All rights reserved.
// Permission given to use the script provided that this notice remains as is.
// Additional scripts can be found at http:
//www.geocities.com/~yehuda
/// image files needed:
// *******************
// dg0.gif
// dg1.gif
// dg2.gif
// dg3.gif
// dg4.gif
// dg5.gif
// dg6.gif
// dg7.gif
// dg8.gif
// dg9.gif
// dgp.gif
// Any set of digit images (0-9), and a period
// image (.) will work with this script.
// instructions:
// *************
// Place all image files in a folder / directory.
// Add this script, including all comments, to
// the desired HTML document. The HTML file must
// be located in the same directory as the image
// files.
document.write(setDate())
function setDate() {
// initialize accumulative HTML variable to empty string
var text = ""
// set standard convention for digit and punctuation images
var openImage = "<IMG SRC=\"" + getPath(location.href) + "dg"
var closeImage = ".gif\" HEIGHT=21 WIDTH=16>"
// initialize time- related variables with current date settings
var now = new Date()
var month = now.getMonth()
var date = now.getDate()
var year = now.getYear()
now = null
// convert integer value of month to standard range
month++ // 0 - 11 => 1 - 12
// convert minute and hour values to strings
month += ""
date += ""
year += ""
// assign image tags associated with month to text variable
for (var i = 0; i < month.length; ++i) {
text += openImage + month.charAt(i) + closeImage
}
// assign image tag of period separator to text variable
text += openImage + "p.gif\" HEIGHT=21 WIDTH=9>"
// assign image tags associated with date to text variable
for (var i = 0; i < date.length; ++i) {
text += openImage + date.charAt(i) + closeImage
}
// assign image tag of period separator to text variable
text += openImage + "p.gif\" HEIGHT=21 WIDTH=9>"
// assign image tags associated with year to text variable
for (var i = 0; i < year.length; ++i) {
text += openImage + year.charAt(i) + closeImage
}
// return accumulative HTML string
return text}function getPath(url) {
lastSlash = url.lastIndexOf("/")
return url.substring(0, lastSlash + 1)}
// -->
</SCRIPT>
Java
Многие связывают неправильный вывод русских букв с неправильной установкой шрифта. Мне кажется, это связанно с тяжким опытом программирования на Windows 3.x, где основная причина действительно была в этом. В Java всё сложнее и редко действительно связанно со шрифтами. Я не разбирался со специфическими настройками броузеров, т.к. ещё не писал апплетов, только приложения, но думаю в последних версиях в этом плане всё нормально.
Где же действительно лежат наибольшие подводные камни? В основном это связанно с неправильной перекодировкой символов. Часть этих проблем и методы их решения описаны выше. Если у Вас все преобразования выполняются корректно, и для вывода используется шрифт Unicode, то есть очень большой шанс, что Ваша программа будет работать правильно.
Если проблемы всё же остались, тут нужно выяснить, где они возникают. Попробуйте запустить приложение под разными JVM, под разными платформами, на разных броузерах.
Если программа не работает нигде - значит проблема только в ней и в ваших руках. Внимательно перечитайте всё, что было написано выше, и ищите. Если же проблема проявляется только в конкретном окружении - значит дело, скорей всего в настройках. Где именно - зависит от того, какой графической библиотекой Вы пользуетесь. Если AWT - помочь может правильная настройка файла font.properties.ru. Пример корректного файла можно взять из Java 2. Если у Вас нет этой версии, можете скачать его с данного сайта: , . Если у Вас установлена русская версия OS - просто добавьте этот файл туда, где лежит файл font.properties. Если же это англицкая версия, то нужно, или дополнительно сменить текущий язык при помощи задания настройки -Duser.language=ru или переписать этот файл вместо font.properties. Этот файл задаёт используемые шрифты и кодовые страницы.
С библиотекой Swing всё проще - в ней всё рисуется через подсистему Java2D. Надписи в стандартных диалогах (JOptionPane, JFileChooser, JColorChooser) переделать на русский очень просто - достаточно лишь создать несколько файлов ресурсов. Я это уже проделал, так что можете просто взять готовый и добавить его в свой CLASSPATH. Единственная проблема, с которой я столкнулся - в версиях JDK начиная с 1.2 rc1 и по 1.3 beta, русские буквы не выводятся под Win9x при использовании стандартных шрифтов (Arial, Courier New, Times New Roman, etc.) из-за ошибки в Java2D. Ошибка весьма своеобразна - со стандартными шрифтами изображения букв отображаются не в соответствии с кодами Unicode, а по таблице Cp1251 (кодировка Ansi). Эта ошибка зарегистрирована в BugParade под номером . По умолчанию в Swing используются шрифты, задаваемые в файле font.properties.ru, так что достаточно заменить их другими - и русские буквы появляются. К сожалению, набор рабочих шрифтов небольшой - это шрифты Tahoma, Tahoma Bold и два набора шрифтов из дистрибутива JDK - Lucida Sans * и Lucida Typewriter * (). Чем эти шрифты отличаются от стандартных - мне непонятно.
Начиная с версии 1.3rc1 эта проблема уже исправлена, так что можно просто обновить JDK. Так же надо учесть, что с оригинальной версией Win95 поставляются шрифты, не поддерживающие Unicode - в этой ситуации можно просто скопировать шрифты из Win98 или WinNT.
Если же вам, кровь из носу, нужно использовать стандартные шрифты, работая в JDK 1.2, то можно компенсировать этот глюк, перекодировав строки текста непосредственно перед выводом. Сделать это можно, например, так:
public static String convertToWin9x(String s) { byte[] bb; try { bb = s.getBytes("Cp1251"); } catch( java.io.UnsupportedEncodingException e ) { return s; } char[] cb = new char[bb.length]; for(int i=0; i < bb.length; i++) { cb[i] = (char)( bb[i] & 0x00FF ); } return new String(cb); }
Но только не забудьте - этот код будет работать только под Win9x и Sun JDK/JRE 1.2.
По поводу компилятора jikes. Как мне рассказали в конференции по Java (fido7.ru.java) при использовании этого компилятора русские буквы тоже появляются. Это на самом деле классический пример того, как один глюк компенсирует другой - jikes просто не учитывает кодировку исходников. Того же эффекта можно добиться, если указать javac кодировку ISO-8859-1 (Latin1) в ключике -encoding. Если при этом в исходниках русские символы записаны в кодировке Cp1251, то тем самым они вместо диапазона 0x400-0x4ff (стандартный диапазон Unicode для кириллицы) попадают в диапазон 0x80-0xff. Из-за вышеупомянутого глюка в среде Win9x кириллица в стандартных шрифтах отображается как раз в этом диапазоне и русские буквы появляются. Если же попробовать запустить программу в другой среде (например, в WinNT) - русских букв не будет, так как там этот глюк отсутствует.
Аналогично на подобную компенсацию можно нарваться, если поменять региональные настройки с русских на буржуйские. При этом, кроме всего прочего, меняется и кодировка по умолчанию (file.encoding) - вместо 1251 становится 1252. Это приводит к тому, что, если при чтении файлов кодировка не была явно указана (и при компиляции не задавался ключик -encoding), то русские буквы переезжают в диапазон 0x80-0xff и создаётся впечатление нормальной работы. Разницу можно заметить на преобразованиях регистра и сортировках через java.text.Collator - они будут выполняться неверно. А если были использованы строковые константы - то на других платформах вы увидите только кракозяблы.
Ещё один способ - скачать версию Swing для JDK 1.1 и запускать приложение из под Microsoft JVM - там всё выводится корректно. Только не забудьте обновить MS JVM - те версии, что идут в комплекте с IE 4.x не совсем корректно работают. С сервера Microsoft можно скачать свежую версию, например 5.00.3240 - с ней всё ОК.
Кстати, по поводу MS JVM. Непонятно по каким соображениям, но в ней отсутствуют все файлы кодировок русских букв, акромя Cp1251 (наверное, они таким образом пытались уменьшить размер дистрибутива). Если Вам нужны другие кодировки, например, Cp866, то нужно добавить соответствующие классы в CLASSPATH. Причём классы от последних версий Sun JDK не подходят - у Sun-а уже давно изменилась их структура, поэтому последние версии классов с Microsoft-ом не стыкуются (у MS осталась структура от JDK 1.1.4). На сервере Microsoft, в принципе, лежит полный комплект дополнительных кодировок (страница , ссылка "Additional I/O libraries"), но там файл размером около 3 метров, а их сервер докачку не поддерживает :-). Мне удалось таки выкачать этот файл, я его перепаковал jar-ом, можете взять его .
I18n (вывод чисел, дат и т.п.)
Загадочная комбинация i18n расшифровывается просто - это сокращение от могучего слова Internationalization. 18 - это кол-во букв между i и n. Означает оно, в контексте Java, возможность автоматической подстройки программы под текущий язык и специфику страны. Делается это через использование класса Locale, представляющего язык и конкретную страну, и классов, которые знают, что с этим Locale делать. Большинство этих классов находятся в пакете java.text.
Основной класс, которым пользуются все остальные, - это java.util.ResourceBundle, который позволяет загружать различные виды ресурсов. Причём имя загружаемого класса или файла properties зависит от указанного Locale (или Locale по умолчанию - если ничего не указанно).
Имя искомого файла формируется при помощи добавления идентификатора языка и страны к имени ресурса. Например, если грузится ресурс resfile, а текущий Locale - ru_RU, то поиск его будет идти в следующем порядке:
resfile_ru_RU.class
resfile_ru_RU.properties
resfile_ru.class
resfile_ru.properties
resfile.class
resfile.properties
Это позволяет легко добавлять описания для новых языков и стран. Большинство классов сами заботятся обо всей этой внутренней кухне, так что Вам об этом знать часто и не нужно.
Что касается дат, то само форматирование выполняется классом DateFormat. Получить формат, уже настроенный на язык и страну можно при помощи методов getDateInstance(), getTimeInstance() и getDateTimeInstance(). В качестве аргумента можно указать одну из констант для задания необходимого стиля формата. По умолчанию будет использован предпочтительный стиль для данного Locale. Допустимые константы:
Константа | Описание | Пример |
SHORT | Полностью цифровой, короткий вывод | 25.01.99 или 17:40 |
MEDIUM | Вывод средней длины | 25.01.1999 |
LONG | Длинный вывод | 25 Январь 1999 г. или 17:23:32 |
FULL | Вся информация Понедельник, | 25 января 1999 г. или 17:23:32 GMT+03:00 |
Пример:
// Вывод пользователю текущей даты DateFormat df = DateFormat.getDateInstance(); String s = df.format(new Date()); ... // Вывод текущего времени без секунд DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT); String s = df.format(new Date());
Если же вы хотите сами контролировать набор выводимых полей и их разделители, то для этого можно использовать класс SimpleDateFormat.
Аналогичным образом делается и форматирование чисел. За это отвечает класс NumberFormat. Получить форматы можно при помощи методов getInstance(), getNumberInstance(), getCurrencyInstance() и getPercentInstance(). Свой формат можно сконструировать при помощи класса DecimalFormat.
Идущие часики
Идущие часики можно поместить в строке статуса и в поле form. (Реализация объекта Date в Netscape Navigator 2.0 содержит ошибки)
Первый пример - скрипта, создающего часики в строке статуса при загрузке документа:
<html>
<head>
<title>Clock in status bar</title>
<script language="JavaScript">
function clock_status()
{
window.setTimeout("clock_status()",100);
today=new Date();
self.status=today.toString();
}
</script>
</head>
<body background="ffffff" onLoad="clock_status()">
</body>
</html>
Второй пример - скрипта, создающего часики (в сокращенном варианте) в поле form
<html>
<head>
<title>Clock</title>
<script language="JavaScript">
function clock_form()
{
day=new Date()
clock_f=day.getHours()+":"+day.getMinutes()+":"+day.getSeconds()
document.form.f_clock.value=clock_f
id=setTimeout("clock_form()",100)
}
</script>
</head>
<body bgcolor="ffffff" onLoad="clock_form()">
<center>
<form name=form metod="get">
<input name=f_clock maxlength=8 size=8>
</form>
</center>
</body>
</html>
Третий пример - еще один вариант отображения часиков. Причем обратите внимание, что функция вызывается в теле документа, а не в HTML-теге <body> как в предыдущем примере.
<html>
<head>
<title>Clock full</title>
</head>
<script language="JavaScript">
function fulltime() {
var time=new Date();
document.clock.full.value=time.toLocaleString();
setTimeout('fulltime()',500)
}
</script>
<body bgcolor=ffffff text=ff0000>
<center>
<form name=clock>
<input type=text size=17 name=full>
</form>
<script language="JavaScript">
fulltime();
</script>
</center>
</body>
</html>
В четвертом примере часики с "P.M." и "A.M."
<html>
<head>
<title>Clock</title>
<script language="JavaScript">
var timer=null;
var timerrun=false;
function stoptime() {
if(timerrun)
clearTimeout(timer);
timerrun=false;
}
function starttime() {
stoptime();
showtime();
}
function showtime() {
var all=new Date();
var hours=all.getHours();
var minutes=all.getMinutes();
var seconds=all.getSeconds();
var timevalue=" " + ((hours>12) ? hours-12 : hours)
timevalue += ((minutes<10) ? ":0" : ":") + minutes
timevalue += ((seconds<10) ? ":0" : ":") + seconds
timevalue +=(hours>=12) ? "P.M." : "A.M."
document.clock.next.value=timevalue;
timer=setTimeout('showtime()',1000);
timerrun=true;
}
</script>
<body bgcolor=ffffff text=ff0000 onLoad="starttime()">
<center>
<form name=clock>
<input type=text name=next size=12 value=' '>
</center>
</form>
</body>
</html>
Infinity
Синтаксис
Infinity
Числовое значение величины Infinity - бесконечность. В JavaScript 1.2 Infinity было определено как свойство объекта Number. У объекта Number есть два свойства POSITIVE_INFINITY и NEGATIVE_INFINITY ( для примера, Number.POSITIVE_INFINITY ). В JavaScript 1.3 Infinity определено и для объекта Global. Значение Infinity ( положительная бесконечность ) всегда больше, чем любое другое число, включая себя. Infinity полностью соответствует математической бесконечности. Например любое число, умноженное на Infinity, есть Infinity, любое число, деленное на Infinity, есть 0.
Информация о броузере.
Существуют броузеры, не поддерживающие некоторых возможностей JavaScript. Поэтому, чтобы не возникало ситуаций, когда броузер пользователя не видит чего-либо в вашем документе, можно использовать свойства объекта Navigator: appName и appVersion, которые определяют имя и версию броузера. В зависимости от версии броузера можно осуществлять вызов того или иного документа.
Например, на платформах с 16-разрядной Windows обращение к функции eval() приводит к краху Netscape Navigator 2.0. Поэтому, если мы посмотрим , где используется эта функция, то в нем как раз анализируется имя и версия броузера.
Пример: |
<html><head>
<title>Броузер</title>
</head>
<body bgcolor=ffffff>
<center><table border=1>
<tr><td>Имя броузера</td><td>
<script language="JavaScript">
document.write(navigator.appName);</script></td>
<tr><td>Версия броузера</td><td>
<script language="JavaScript">
document.write(navigator.appVersion);</script></td>
<tr><td>Кодовое название броузера</td><td>
<script language="JavaScript">
document.write(navigator.appCodeName);</script></td>
<tr><td>Заголовок пользовательского <br>агента</td><td valign=top>
<script language="JavaScript">
document.write(navigator.userAgent);</script></td>
</table><center>
</body>
</html>
Информация о дате последнего изменения документа.
Для этого в HTML-теге <body> используется свойство lastModified объекта Document. В данном примере такая информация выводится в строку статуса.
<body onLoad="status=document.lastModified">
Информация о документе.
Такая информация может быть помещена в строке статуса при загрузке документа. Для этого в HTML-тэг <body> добавлен атрибут onLoad="status='Примеры скриптов. Центр Информационных Технологий'"
Также при попадании указателя мыши в область ссылки вместо имени файла, появляющегося в строке статуса, можно поместить информацию об этом документе.
Обратите внимание, что при загрузке документа в строке статуса одна информация, при попадании указателя мыши в область ссылки - другая, а после выхода указателя мыши из области ссылки - третья. Для этого в HTML-теге <a> добавлены обработчики событий onMouseOver и onMouseOut и свойство status объекта Window:
onMouseOver="status='Примеры скриптов' ;return true"
onMouseOut="status='Центр Информационных Технологий' ;return true"
Информацию также можно выводить в диалоговое окно, при этом выполнение программы не прерывается. Для этого используется метод alert() объекта Window и обработчик событий onMouseOver, включенные в HTML-тег <a>. В окне есть кнопка "OK", которая закрывает диалоговое окно.
Например, при попадании указателя мыши в область ссылки открывается диалоговое окно с каким-либо сообщением (лучше, если оно будет не на русском языке).
onMouseOver="alert('Server for Information Technologies')"
IsFinite
Синтаксис
IsFinite(число)
Вы можете использовать эту функцию, для определения конечности числа. Если аргумент функции NaN положительная или отрицательная бесконечность, функция возвращает false, иначе она возвращает true.
Пример:
Проверка числа на конечность
if(isFinite(Input) == true) { // Ваш код }
История посещений.
Использование объекта History предоставляет возможность возвращаться на URL, который был посещен перед этим (что эквивалентно щелчку на кнопке BACK), и переходить на URL, посещенный перед этим (что эквивалентно щелчку на кнопке FORWARD). Список посещенных URL содержится в меню GO броузера Netscape Navigator.
Делается это, используя методы объекта History: back() и forward(). Для этого в HTML-тег <a> включается следующая строка:
<a href="javascript:history.back()"></a>
или
<a href="javascript:history.forward()"></a>
Если необходимо вернуться на несколько позиций списка меню GO, то используется метод go(), в скобках указывается целочисленный аргумент (отрицательное значение которого соответствует количеству шагов НАЗАД, положительное -ВПЕРЕД). Например, для возврата на три позиции назад указывается go(-3), вперед - go(3).
Обратите внимание: если нет посещенных перед этим URL, то это не будет работать.
Изменение фона документа.
Изменение фона документа при выборе кнопки с названием цвета. При этом используется свойство bgColor объекта Document.Свойство bgColor в Netscape Navigator 2.0 содержит ошибки.
<html>
<head>
<title>bgcolor</title>
</head>
<body text=000000 bgcolor=ffffff>
<table align=center>
<tr><td><form>
<input type=button value="красный" onClick="document.bgColor='ff0000'">
<input type=button value="желтый" onClick="document.bgColor='ffff00'">
<input type=button value="синий" onClick="document.bgColor='0000ff'">
<input type=button value="голубой" onClick="document.bgColor='87ceeb'">
<input type=button value="коралловый" onClick="document.bgColor='ff7f50'">
</form></td>
</table>
</body>
</html>
Документ с изменяющимся фоном.
<html>
<head>
<title>Изменение фона документа</title>
<script>
function bg_Array() {
this.length = bg_Array.arguments.length
for (var i = 0; i< this.length; i++)
this[i+1] = bg_Array.arguments[i]
}
var bg_Chars = "0123456789ABCDEF";
function Dec2Hex (Dec) {
var a = Dec % 16;
var b = (Dec - a)/16;
hex = "" + bg_Chars.charAt(b) + bg_Chars.charAt(a);
return hex;
}
function bg_Changer (begin, end, steps) {
steps = steps -1 ;
redA = begin.charAt(0) + begin.charAt(1);
red_valA = parseInt(redA,'16');
redB = end.charAt(0) + end.charAt(1);
red_valB = parseInt(redB,'16');
red_int = ((red_valB - red_valA) / steps) * -1;
grnA = begin.charAt(2) + begin.charAt(3);
grn_valA = parseInt(grnA,'16');
grnB = end.charAt(2) + end.charAt(3);
grn_valB = parseInt(grnB,'16');
grn_int = ((grn_valB - grn_valA) / steps) * -1;
bluA = begin.charAt(4) + begin.charAt(5);
blu_valA = parseInt(bluA,'16');
bluB = end.charAt(4) + end.charAt(5);
blu_valB = parseInt(bluB,'16');
blu_int = ((blu_valB - blu_valA) / steps) * -1;
step = 2;
red = red_valA;
grn = grn_valA;
blu = blu_valA;
document.bgColor = begin;
while ( steps >= step ) {
red -= red_int;
red_round = Math.round(red);
red_hex = Dec2Hex(red);
grn -= grn_int;
grn_round = Math.round(grn);
grn_hex = Dec2Hex(grn);
blu -= blu_int;
blu_round = Math.round(blu);
blu_hex = Dec2Hex(blu);
document.bgColor = red_hex + grn_hex + blu_hex;
step++;
}
document.bgColor = end;
}
for (j=0;j<5;j++) {
bg_Changer("ffff00","00ff00",50);
bg_Changer("00ff00","ff0000",50);
bg_Changer("ff0000","0000ff",50);
bg_Changer("0000ff","f0ffff",50);
bg_Changer("f0ffff","7fff00",50);
bg_Changer("7fff00","ff00ff",50);
bg_Changer("ff00ff","00ffff",50);
bg_Changer("00ffff","eee8aa",50);
bg_Changer("eee8aa","ffb6c1",50);
bg_Changer("ffb6c1","98fb98",50);
bg_Changer("98fb98","afeeee",50);
}
</script>
</head>
<body>
</body>
</html>
Изменение картинки
В данном примере для этого используется свойство images[ ] объекта Document.
<html>
<head>
</head>
<script language="JavaScript">
<!-- анализируется версия броузера:--> browserName=navigator.appName; browserVer=parseInt(navigator.appVersion); if (browserName=="Netscape" && browserVer >= 3) version="n3"; else version="n2";
if (version=="n3") { graph1green=new Image(20,20); graph1green.src="lgcit.gif"; graph1red=new Image(20,20); graph1red.src="logo.gif"; } function graphON(graphName) { if (version=="n3") { green_red=eval(graphName + "green.src"); document.images[graphName].src=green_red; } } function graphOFF(graphName) { if (version=="n3") { red_green=eval(graphName + "red.src"); document.images[graphName].src=red_green; } } </script>
<body bgcolor=ffffff>
<a href="http://www.cit-forum.com" onMouseOver="graphON('graph1')" onMouseOut="graphOFF('graph1')"><img src="logo.gif" name="graph1" border=0></a>
</body>
</html>
В предыдущем примере изменение происходило при попадании курсора мыши в область картинки и при выходе курсора из нее. В данном примере это организовано в цикле для двух картинок с использованием метода setTimeout.
Работает только в Netscape Navigator 3.0 и выше!
<html>
<head>
<title>Баннер</title>
</head>
<script language="JavaScript">
i=0; img_a=new Array() img_a[0]=new Image() img_a[1]=new Image() img_a[0].src="logo.gif" img_a[1].src="lgcit.gif"
function img_b() { document.images[0].src=img_a[i].src document.images[0].src=img_a[i].src i++ if(i>1) i=0; setTimeout("img_b()", 2000) }
</SCRIPT>
</head>
<body bgcolor="#ffffff" onLoad=img_b()>
<img src="logo.gif">
</body></html>
Данный пример аналогичен предыдущему, но сам скрипт написан несколько иначе.
<html>
<head>
<title>Мультипликация по событию onLoad</title>
</head>
<script language="JavaScript">
pictures = new Array() for(i=0;i<3;i++) { pictures[i] = new Image() if(i==0) pictures[i].src = "/pictures/it/javascript/3.gif" if(i==1) pictures[i].src = "/pictures/it/javascript/2.gif" if(i==2) pictures[i].src = "/pictures/it/javascript/1.gif" } n=1; flag=1; function scroll_image() { if(flag==1) { n++;if(n>2) n=0; document.images[0].src = pictures[n].src } setTimeout("scroll_image()",1500); } </SCRIPT>
</head>
<body bgcolor="#FFF5EE" text="#000000" link="#FF0000" alink="#FF0000" vlink="#A52A2A" onLoad=scroll_image()>
<center><IMG SRC="/pictures/it/javascript/1.gif" NAME="tool">
</center>
</body></html>
Этот пример иллюстрирует возможность изменения картинки при выборе из списка.
<html>
<head>
<META NAME="Key Words" CONTENT="Информационные технологии, Примеры JavaScript">
<html>
<head>
<title>Изменение картинки при выборе из списка</title>
</head>
<script language="JavaScript">
pictures = new Array() for(i=0;i<3;i++) { pictures[i] = new Image() if(i==0) pictures[i].src = "/pictures/it/javascript/3.gif" if(i==1) pictures[i].src = "/pictures/it/javascript/2.gif" if(i==2) pictures[i].src = "/pictures/it/javascript/1.gif" } function l_image() { document.images[0].src = pictures[document.form1.item.selectedIndex].src } </SCRIPT>
</head>
<body bgcolor="#FFF5EE" text="#000000" link="#FF0000" alink="#FF0000" vlink="#A52A2A">
<center><TABLE COLS=2 WIDTH="100%" >
<TR>
<th>
<form name=form1>
<select name=item onChange=l_image()>
<option>рисунок 1 <option>рисунок 2 <option selected>рисунок 3 </select>
</form>
</th>
</tr>
<tr>
<th ALIGN=CENTER VALIGN=CENTER>
<IMG SRC="/pictures/it/javascript/1.gif" NAME="tool"></th>
</TR>
</TABLE>
</center>
</body></html>
Изменение картинки при выборе гиперссылки.
<html>
<head>
<title>Изменение картинки при выборе гиперссылки</title>
</head>
<script language="JavaScript">
function l_image(a) { document.images[0].src=a } </SCRIPT>
</head>
<body bgcolor="#FFF5EE" text="#000000" link="#FF0000" alink="#FF0000" vlink="#A52A2A">
<center><TABLE COLS=2 WIDTH="100%" >
<TR><TD>
<UL>
<LI><A HREF="javascript:l_image('/pictures/it/javascript/1.gif')">рисунок 1</A>
<LI><A HREF="javascript:l_image('/pictures/it/javascript/2.gif')">рисунок 2</A>
<LI><A HREF="javascript:l_image('/pictures/it/javascript/3.gif')">рисунок 3</A>
</UL></TD>
<TD ALIGN=CENTER VALIGN=CENTER>
<IMG SRC="/pictures/it/javascript/3.gif" NAME="tool" > </TD>
</TR>
</TABLE>
</center>
</body></html>
Изменение картинки при загрузке документа в зависимости от текущего времени осуществляется с использованием объекта Date.
Работает во всех броузерах, поддерживающих JavaScript.
<html>
<head>
<title>Баннер</title>
</head>
<script language="JavaScript">
function ban() { j=(new Date()).getSeconds()%2 this[0]="logo.gif" this[2]="lgcit.gif" document.write("<img src=",this[2*j],">")
return (" ");
}
</script>
</head>
<body bgcolor="#ffffff">
<SCRIPT>
document.write(ban()) </SCRIPT>
</body></html>
Изменения в методах объекта Date
Методы объекта Date в версии 1.3 получили дополнительные параметры:
setMonth(month[, date]) setHours(hours[, min[, sec[, ms]]]) setMinutes(min[, sec[, ms]]) setSeconds(sec[, ms])
Теперь эти методы по своей форме полностью эквивалентны методам setUTC*.
Изменения в объекте Array
Свойство length
Длина массива ( свойство length ) теперь задается беззнаковым 32-битным целым. Значение свойства length может лежать в пределах от 0 до 232-1.
Конструктор
В JavaScript 1.3 при использовании конструктора с единичным параметром ( new Array(len) ) конструктор проверяет тип параметра. Если это число конструктор конвертирует его в 32-битное беззнаковое целое и создает массив со свойством length ( размер массива ), установленное в integer. Начальные значения элементов массива - undifined.
Метод push
В JavaScript 1.2 метод push возвращал последний элемент, добавленный к массиву. В версии 1.3 метод возвращает новую длину массива.
Метод splice
В JavaScript 1.2 метод splice возвращал удаленный элемент, если удалялся только один элемент ( параметр howMany равен 1 ). В JavaScript 1.3 splice всегда возвращает массив, содержащий удаленные элементы. Если удаляется только один элемент, то splice вернет массив, содержащий один единственный элемент.
Изменения в операторах == и !=
Если операнды разного типа просходит преобразование. Как результат возвращается значение типа Boolean. Если типы операндов одинаковы, то операторы == и != эквивалентны === и !==. Значения null и undifined считаются одинаковыми, NaN считается не равным ни одному значению, включая NaN.
Пример:
10=='10'
возвращает true
Java/JavaScript
Илья Кантор, javascript.ru
, ведущий программист Red Graphic Systems
Вячеслав Шуранов,
Вячеслав Шуранов,
Олег Никитенко,
Владимир Дригалкин,
Наталия Елманова
Статья была опубликована в журнале КомпьютерПресс 8'2003 и на сайте компании Interface
, 23.07.2003
Дмитрий Брязгин,
Тотоев Александр, Корхова Ольга
Евгений Игумнов, Геокад Плюс (Новосибирск)
Сергей Посохов, 24.11.1999,
Кен МакКрэри, перевод: ,
,
Сергей Астахов,
С. Б. Дунаев
Степанищев Евгений, Web-программист казанского центра интернет
Степанищев Евгений, Web-программист казанского центра интернет
Павел Храмцов, Центр Информационных Технологий
Валерий Коржов, журнал #02/97
© 1996, 1997 Стефан Кох (Stefan Koch)
Перевод на русский язык с разрешения Стефана Коха -
Наталия Бельтикова, Ирина Кузина (РНЦ "Курчатовский институт")
Наталия Бельтикова, Ирина Кузина (РНЦ "Курчатовский институт")
Наталия Бельтикова, Ирина Кузина (РНЦ "Курчатовский институт")
Наталия Бельтикова, РНЦ "Курчатовский институт"
Павел Храмцов, статья из ComputerWorld
Павел Храмцов, статья из ComputerWorld
Павел Храмцов, Центр Информационных Технологий, ComputerWorld #6/96
Материалы конференции,
Материалы конференции,
Java: Русские буквы и не только...
Сергей Астахов (),
Здесь я попытался собрать информацию по поводу написания русскоязычных программ на языке Java. Если Вам известно что-либо помимо того, что я тут понаписал, напишите мне, ваши добавления будут кстати.
Не забудьте закрыть
Как заставить AJAX читать между строк
, ведущий программист Red Graphic Systems
На страницах вашего сайта содержится множество специализированных терминов. Когда пользователь просматривает сайт, у него могут возникать вопросы касательно этих терминов. Как сделать так, чтобы посетитель сайта по мере возникновения вопросов мог незамедлительно получать на них ответы? Раньше термины на страницах сайта оформлялись как ссылки и пользователь при желании мог кликать по ним и получать окно с контекстной подсказкой. Это подход достаточно неуклюжий, он отнимает у пользователя слишком много времени - на то, чтобы кликнуть по ссылке, дождаться загрузки окна и затем закрыть окно. В эпоху AJAX мы можем быть ближе к пожеланиям пользователей. Мы можем сделать так, чтобы уже при наведении мыши на термин незамедлительно появлялось сообщение с подсказкой и как только курсор мыши сдвинут с термина, сообщение исчезало. Наличие этого сервиса не отразится на объеме страниц сайта. При запросе контекстной подсказки Java Script будет обращаться к внешнему словарю, получать содержание и отображать его.
Метод получения информации по неявному запросу может найти применение не только в словаре терминов. Обращали ли вы внимание на ссылки с двойным подчеркиванием в таких проектах как hotscripts.com и devarticles.com? Это контекстная реклама на основе движка IntelliTXT компании Vibrant Media. При наведении курсора мыши на подобную ссылку появляется окно с рекламным предложением на соответствующую тему. Эта технология уже получила название in-text advertising.
Все чаще и чаще подобный метод применяется и на новостных порталах. Посетители видят на главной странице портала лишь заголовки новостей. Однако при наведении курсора мыши на заголовок новости они получают ее краткое описание. Таким образом, на главной странице портала можно вместить куда как больше новостей. Посетитель портала увидит заголовки и для того, чтобы получить анонсы новостей, ему будет достаточно пробежаться курсором мыши по заголовкам.
Давайте теперь рассмотрим, каким образом реализуется контекстная подсказка с помощью AJAX. Программисту, освоившему этот метод, не составит труда заставить портал комментировать новости по запросу или же написать модуль in-text advertising.
Итак, очевидно нам следует позаботиться об окне сообщения, того самого, которое будет появляться каждый раз, когда посетитель наводит курсор на термин. Для того, чтобы окно появлялось и исчезало мгновенно, следует поместить его на скрытом DIV.
<div id="InstantMessage" class="instant_message"> </div>
Для простоты эксперимента мы можем оформить его в стиле системных сообщений MS Windows.
<style> .instant_message { padding: 5px; font-size: 12px; font-family: Arial; visibility: hidden;
position: absolute; width: 240px; border: outset 2px #FFFFFF; background: #D4D0C8} .instant_message a { width: 240px; padding: 2px 17px; color: black; text-decoration: none;
cursor: default} .instant_message a:hover {color: #ffffff; background: #0A246A} </style>
Окно должно появиться в тот момент, когда посетитель навел курсор мыши на термин и исчезнуть, когда курсор мыши будет за пределами термина. Причем, в тот самый момент окно должно содержать уже не пробел, а текст определения термина. Таким образом, мы должны поместить термины в тексте документа в inline тег, поддерживающий события onMouseOver и onMouseOut. Первому событию следует назначить функцию JavaScript, которая получит определение термина, поместит его в окно сообщения и покажет окно. Второму событию требуется назначить функцию, которая просто скроет окно сообщения.
<a onmouseover="getDefinition('термин', event);"
onmouseout="hideMessage();">термин</a>
В параметре функции, отображающей окно (getDefenition) сообщения надо указать термин. Этот термин будет использован для запроса текста определения посредством AJAX. Так как при показе окна нам потребуется его позиционировать под курсором мыши для поддержки Gecko-базированых браузеров, в эту функцию также следует передать параметр event. Функция для сокрытия окна (hideMessage) не требует каких-либо параметров.
Теперь наша задача - при вызове функции getDefinition заставить JavaScript позиционировать окно сообщения.
function adjustMessage(evt) { MessageObj = document.getElementById('InstantMessage'); if (isThisMozilla) event=evt;
var rightedge = document.body.clientWidth-event.clientX; var bottomedge = document.body.clientHeight-event.clientY; if (rightedge < MessageObj.offsetWidth) MessageObj.style.left = document.body.scrollLeft + event.clientX - MessageObj.offsetWidth; else MessageObj.style.left = document.body.scrollLeft + event.clientX; if (bottomedge < MessageObj.offsetHeight) MessageObj.style.top = document.body.scrollTop + event.clientY - MessageObj.offsetHeight; else MessageObj.style.top = document.body.scrollTop + event.clientY;
MessageObj.innerHTML = 'Loading...'; MessageObj.style.visibility = "visible"; }
Итак, мы имеем окно сообщения, рапортующее о загрузке данных. Теперь следует выполнить запрос к контроллеру за определением термина. Вы можете написать собственные функции для обслуживания AJAX запросов. Но если вы только начинаете работать с AJAX, я могу порекомендовать вам готовую библиотеку от Yahoo. В этом случае запрос будет выглядеть так:
function getDefinition(term,evt){ adjustMessage(evt); var request = YAHOO.util.Connect.asyncRequest('POST',
'http://адрес_контроллера', callback, 'term='+term); }
Раз мы запрашиваем контроллер, очевидно, нам надлежит его написать. В общем случае, это самая простая часть. Задача контроллера - вернуть описание термина, переданного в POST. Каким бы языком программирования мы не пользовались при написании контроллера, нам достаточно выполнить несколько простейших операций.
соединиться с базой данных выполнить SQL запрос для получения определения термина отобразить на консоль результат в следующем виде:
{ "errormsg" : "в случае ошибки ее код", "content" : "текст определения" }
Это структура данных, известная как JSON. Она воспринимается JavaScript в явном виде, как «родная». В случае использования AJAX-библиотеки YAHOO ответ контроллера обслуживается следующей конструкцией
var handleSuccess = function(o){ if(o.responseText !== undefined){ showMessage(o.responseText); } };
var handleFailure = function(o){ if(o.responseText !== undefined){ showMessage("Connection Error"); } };
var callback = { success:handleSuccess, failure:handleFailure, argument:['foo','bar'] };
Нам осталось лишь описать функцию showMessage(), которая помещает принятый текст определения в окно сообщения
function showMessage(json) { var respondStructure = eval( '(' + json + ')' ); MessageObj.innerHTML = respondStructure.content; return false; }
Как вы понимаете, для сокрытия окна сообщения потребуется лишь изменить атрибут объекта
function hideMessage(){ var MessageObj=document.getElementById('InstantMessage'); MessageObj.style.visibility="hidden"; }
Когда вы будете опробовать этот пример, едва ли вы встретитесь с проблемами под браузером MS IE, однако, в FireFox вы можете обнаружить мерцание окна сообщения. Это связано с тем, что FireFox своеобразно обслуживает события onMouseOver/onMouseOut. Впрочем, эту проблему можно решить путем расстановки флагов задержки в функциях обслуживания этих событий.
Скрипты приведенного здесь примера можно загрузить здесь
Работу примера можно увидеть здесь
Информация об авторе.
Дмитрий Шейко
www.cmsdevelopment.com
Ведущий программист
Занят разработкой программного обеспечения с 1987 года. Начиная с 1998 года опубликовал более 50 технических статей в специализированных изданиях. С 2001 года разрабатывает архитектурные решения и инструментальные средства для управления содержанием (Content Management, CMF, ECM). В 2004 году разработал и опубликовал спецификацию универсального языка для разработчиков CMS XML Sapiens
Литература
Mark Johnson, A beginner's guide to Enterprise JavaBeans, JavaWorld, October 1998. Sun Microsystems, Enterprise JavaBeans Specification version 1.0, 1998. Sun Microsystems, JavaBeans Component Specification. Anne Thomas, Enterprise JavaBeans Server Component Model for Java (Whitepaper), 1997.
Массив anchors
Вы можете ссылаться на объекты anchor в вашей программе, используя массив anchors. Этот массив содержит запись для каждого тага <a>, содержащего атрибут NAME по порядку встречаемости в документе. Например, если документ содержит три поименованных якоря, то эти якоря представлены как document.anchor[0], document.anchor[1], document.anchor[2].
Использование массива anchors:
document.anchors[index]
document.anchors.length
index целое число, представляющее якорь в документе.
Для получения количества якорей в документе используется свойство length: document.anchors.length.
Хотя массив anchors представляет собой поименованные якоря, значение anchors[index] является всегда нулевым. Но если в документе якоря именуются по порядку натуральными числами, вы можете использовать массив anchors и его свойство length для употребления имени якоря перед использованием его в операторах, таких как установка location.hash.
Элементы массива anchors окрыты открыты только для чтения. Например, выражение document.anchors[0]="anchor1" не имеет эффекта.
Массив elements
Массив объектов, содержащий элементы формы (такие как объекты checkbox, radio и text) по порядку встречаемости.
Массив forms
Вы можете ссылаться на формы в вашей программе, используя массив forms (вы можете также использовать имя формы). Этот массив содержит запись для каждого объекта form (тага <FORM>) по порядку встречаемости в документе. Например, если документ содержит три формы, то эти формы представлены так document.forms[0], document.forms[1] и document.forms[2].
Использование массива forms:
document.forms[index]
document.forms.length
index целое число, представляющее форму в документе.
Для получения количества форм в документе используется свойство length: document.forms.length.
Вы можете также обращаться к элементам формы, используя массив forms. Например, вы обращаетесь к объекту text с именем quantity во второй форме так:
document.forms[1].quantity.
Элементы массива forms открыты только для чтения. Например, выражение document.forms[0]="music" не имеет эффекта.
Значение каждого элемента в массиве forms является <object nameAttribute>, где nameAttribute является атрибутом NAME формы.
Массив frames
Вы можете ссылаться на объекты frame в вашей программе, используя массив frames. Этот массив содержит запись для каждого фрейма-потомка (тага <FRAME>) в окне, содержащем таг <FRAMESET> по порядку встречаемости. Например, если окно содержит три фрейма-потомка, эти фреймы отображаются как parent.frames[0], parent.frames[1], parent.frames[2].
Использование массива frames:
[frameReference.]frames[index]
[frameReference.]frames.length
[windowReference.]frames[index]
[windowReference.]frames.length
frameReference действительный путь ссылки на фрейм, описанный в объекте .
windowReference переменная windowVar из определения окна (смотрите объект ) или один из синонимов top или parent.
index целое число, представляющее количество фреймов в родительском окне.
Для получения количества фреймов-потомков в окне или фрейме используется свойство length:
[windowReference.]frames.length
[frameReference.]frames.length
Элементы в массиве frames открыты только для чтения. Например, выражение [windowReference.]frames[0]="frame1" не имеет эффекта.
Значение каждого элемента в массиве frames является <object nameAttribute>, nameAttribute является атрибутом NAME фрейма.
Массив links
Вы можете ссылаться на объекты link в вашей программе, используя массив links. Этот массив содержит запись для каждого объекта link (тага <A HREF="">) по порядку встречаемости в документе. Например, если документ содержит три объекта link, то эти ссылки представлены так document.links[0], document.links[1] и document.links[2].
Использование массива links:
document.links[index]
document.links.length
index целое число, представляющее ссылку в документе.
Для получения количества ссылок в документе используется свойство length: document.links.length.
Элементы в массиве links открыты только для чтения. Например, выражение document.links[0]="link1" не имеет эффекта.
Метод alert
Отображает диалоговое окно Alert с сообщением и кнопкой OK.
Метод anchor
Создает HTML якорь, который используется как гипертекстовая ссылка.
Метод back
Позволяет вернуться на предыдущий URL в списке посещенных URL'ей.
Метод big
Вызывает строку, отображаемою большим шрифтом, как если установить ей таг <BIG>.
Метод blink
Вызывает мигающую строку, как если установить ей таг <BLINK>.
Метод blur
Изменен в Navigator 3.0.
Убирает фокус с указанного объекта.
Метод bold
Вызывает строку, отображаемую жирным шрифтом, как если установить ей таг <B>.
Метод ceil
Возвращает ближайшее целое числа, округленного в большую сторону или равное числу.