Java

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.

    Бегущая строка

    Бегущая строка в строке статуса


    Бегущая строка




    Бегущая строка в поле form.


    Бегущая строка












    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 + ".
    ");

    Также можно вывести сокращенный вариант для этого используются методы getDate, getMonth, getYear. Обратите внимание, что нумерация месяцев начинается с нуля.
    current_date = new Date();
    document.write("
    Число: " + current_date.getDate() + "." + current_date.getMonth() + "." + current_date.getYear() + ".
    ");

    Или такой вариант:
    current_date = new Date();
    document.write("
    Врем\я: " + current_date.getHours() + "." + current_date.getMinutes() + "." + current_date.getSeconds() + ".
    ");


    Exdiag.shtml

    Гистограмма построена с использованием свойства images[ ] объекта Document.





















































































    Файлы данных, потоки, БД.

    Итак, как все, надеюсь, знают, в языке 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.

    2.

    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 содержит ошибки)

    Первый пример - скрипта, создающего часики в строке статуса при загрузке документа:


    Clock in status bar





    Второй пример - скрипта, создающего часики (в сокращенном варианте) в поле form


    Clock










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


    Clock full












    В четвертом примере часики с "P.M." и "A.M."





    Clock



















    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-теге используется свойство lastModified объекта Document. В данном примере такая информация выводится в строку статуса.


    Информация о документе.

    Такая информация может быть помещена в строке статуса при загрузке документа. Для этого в HTML-тэг добавлен атрибут onLoad="status='Примеры скриптов. Центр Информационных Технологий'"
    Также при попадании указателя мыши в область ссылки вместо имени файла, появляющегося в строке статуса, можно поместить информацию об этом документе.
    Обратите внимание, что при загрузке документа в строке статуса одна информация, при попадании указателя мыши в область ссылки - другая, а после выхода указателя мыши из области ссылки - третья. Для этого в HTML-теге добавлены обработчики событий onMouseOver и onMouseOut и свойство status объекта Window:
    onMouseOver="status='Примеры скриптов' ;return true"
    onMouseOut="status='Центр Информационных Технологий' ;return true"
    Информацию также можно выводить в диалоговое окно, при этом выполнение программы не прерывается. Для этого используется метод alert() объекта Window и обработчик событий onMouseOver, включенные в HTML-тег
    . В окне есть кнопка "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-тег
    включается следующая строка:

    или

    Если необходимо вернуться на несколько позиций списка меню GO, то используется метод go(), в скобках указывается целочисленный аргумент (отрицательное значение которого соответствует количеству шагов НАЗАД, положительное -ВПЕРЕД). Например, для возврата на три позиции назад указывается go(-3), вперед - go(3).
    Обратите внимание: если нет посещенных перед этим URL, то это не будет работать.

    Изменение фона документа.

    Изменение фона документа при выборе кнопки с названием цвета. При этом используется свойство bgColor объекта Document.Свойство bgColor в Netscape Navigator 2.0 содержит ошибки.


    bgcolor













    Документ с изменяющимся фоном.


    Изменение фона документа










    Изменение картинки

    В данном примере для этого используется свойство images[ ] объекта Document.








    В предыдущем примере изменение происходило при попадании курсора мыши в область картинки и при выходе курсора из нее. В данном примере это организовано в цикле для двух картинок с использованием метода setTimeout.
    Работает только в Netscape Navigator 3.0 и выше!


    Баннер







    Данный пример аналогичен предыдущему, но сам скрипт написан несколько иначе.





    Мультипликация по событию onLoad















    Этот пример иллюстрирует возможность изменения картинки при выборе из списка.











    Изменение картинки при выборе из списка








































    Изменение картинки при выборе гиперссылки.





    Изменение картинки при выборе гиперссылки





















  • рисунок 1

  • рисунок 2

  • рисунок 3









  • Изменение картинки при загрузке документа в зависимости от текущего времени осуществляется с использованием объекта Date.
    Работает во всех броузерах, поддерживающих JavaScript.





    Баннер













    Изменения в методах объекта 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. Если Вам известно что-либо помимо того, что я тут понаписал, напишите мне, ваши добавления будут кстати.

    Не забудьте закрыть

    рисунок 1 рисунок 2 рисунок 3

    Не забудьте закрыть

    Не забудьте закрыть окно!

    Как заставить AJAX читать между строк

    , ведущий программист Red Graphic Systems
    На страницах вашего сайта содержится множество специализированных терминов. Когда пользователь просматривает сайт, у него могут возникать вопросы касательно этих терминов. Как сделать так, чтобы посетитель сайта по мере возникновения вопросов мог незамедлительно получать на них ответы? Раньше термины на страницах сайта оформлялись как ссылки и пользователь при желании мог кликать по ним и получать окно с контекстной подсказкой. Это подход достаточно неуклюжий, он отнимает у пользователя слишком много времени - на то, чтобы кликнуть по ссылке, дождаться загрузки окна и затем закрыть окно. В эпоху AJAX мы можем быть ближе к пожеланиям пользователей. Мы можем сделать так, чтобы уже при наведении мыши на термин незамедлительно появлялось сообщение с подсказкой и как только курсор мыши сдвинут с термина, сообщение исчезало. Наличие этого сервиса не отразится на объеме страниц сайта. При запросе контекстной подсказки Java Script будет обращаться к внешнему словарю, получать содержание и отображать его.
    Метод получения информации по неявному запросу может найти применение не только в словаре терминов. Обращали ли вы внимание на ссылки с двойным подчеркиванием в таких проектах как hotscripts.com и devarticles.com? Это контекстная реклама на основе движка IntelliTXT компании Vibrant Media. При наведении курсора мыши на подобную ссылку появляется окно с рекламным предложением на соответствующую тему. Эта технология уже получила название in-text advertising.
    Все чаще и чаще подобный метод применяется и на новостных порталах. Посетители видят на главной странице портала лишь заголовки новостей. Однако при наведении курсора мыши на заголовок новости они получают ее краткое описание. Таким образом, на главной странице портала можно вместить куда как больше новостей. Посетитель портала увидит заголовки и для того, чтобы получить анонсы новостей, ему будет достаточно пробежаться курсором мыши по заголовкам.
    Давайте теперь рассмотрим, каким образом реализуется контекстная подсказка с помощью AJAX. Программисту, освоившему этот метод, не составит труда заставить портал комментировать новости по запросу или же написать модуль in-text advertising.

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

     


    Для простоты эксперимента мы можем оформить его в стиле системных сообщений MS Windows.



    Окно должно появиться в тот момент, когда посетитель навел курсор мыши на термин и исчезнуть, когда курсор мыши будет за пределами термина. Причем, в тот самый момент окно должно содержать уже не пробел, а текст определения термина. Таким образом, мы должны поместить термины в тексте документа в inline тег, поддерживающий события onMouseOver и onMouseOut. Первому событию следует назначить функцию JavaScript, которая получит определение термина, поместит его в окно сообщения и покажет окно. Второму событию требуется назначить функцию, которая просто скроет окно сообщения.

    onmouseout="hideMessage();">термин

    В параметре функции, отображающей окно (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. Этот массив содержит запись для каждого тага , содержащего атрибут 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 (тага
    ) по порядку встречаемости в документе. Например, если документ содержит три формы, то эти формы представлены так 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 является , где nameAttribute является атрибутом NAME формы.

    Массив frames

    Вы можете ссылаться на объекты frame в вашей программе, используя массив frames. Этот массив содержит запись для каждого фрейма-потомка (тага ) в окне, содержащем таг по порядку встречаемости. Например, если окно содержит три фрейма-потомка, эти фреймы отображаются как 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 является , nameAttribute является атрибутом NAME фрейма.

    Массив links

    Вы можете ссылаться на объекты link в вашей программе, используя массив links. Этот массив содержит запись для каждого объекта link (тага ) по порядку встречаемости в документе. Например, если документ содержит три объекта 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

    Вызывает строку, отображаемою большим шрифтом, как если установить ей таг .

    Метод blink

    Вызывает мигающую строку, как если установить ей таг .

    Метод blur

    Изменен в Navigator 3.0.

    Убирает фокус с указанного объекта.

    Метод bold

    Вызывает строку, отображаемую жирным шрифтом, как если установить ей таг .

    Метод ceil

    Возвращает ближайшее целое числа, округленного в большую сторону или равное числу.

    Метод clearTimeout

    Окончание задержки, установленной методом setTimeout.

    Метод click

    Имитирует щелчок мыши на выбранном элементе формы.

    Метод close (объект document)

    Закрывает поток вывода и завершает вывод данных в рабочую область Navigator'а для отображения.

    Метод close (объект window)

    Изменен в Navigator 3.0.

    Закрывает указанное окно.

    Метод confirm

    Отображает диалоговое окно с указанным сообщением и кнопками OK и Cancel.

    Метод exp

    Возвращает enumber, где number является аргументом, а e является экспонентой, основанием натурального логарифма.

    Метод fixed

    Вызывает строку, отображаемую моноширинным шрифтом, как если установить ей таг .

    Метод floor

    Возвращает ближайшее целое числа, округленного в меньшую сторону или равное числу.

    Метод focus

    Изменен в Navigator 3.0.

    Устанавливает фокус на определенный объект.

    Метод fontcolor

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

    Метод fontsize

    Вызывает строку, отображаемую установленным размером шрифта, как если поместить ее в таг .

    Метод forward

    Загружает следующий URL в списке посещенных URL'ей.

    Метод getTime

    Возвращает числовое значение, соответствующее времени для указанной даты.

    Метод getTimezoneOffset

    Возвращает смещение временной зоны в минутах относительно гринвичского меридиана.

    Метод indexOf

    Возвращает индекс позиции впервые встреченного искомого значения в вызванном объекте string. Поиск начинается с fromIndex.

    Метод italics

    Вызывает строку, отображаемую курсивом, как если установить ей таг .

    Метод lastIndexOf

    Возвращает индекс впервые встреченного искомого значения в вызванном объекте string. Поиск по строке осуществляется в обратном направлении, начиная с fromIndex.

    Метод link

    Создает гипертекстовую ссылку HTML, по которой можно перейти на другой URL.

    Метод log

    Возвращает натуральный логарифм числа (по основанию e).

    Метод open (объект document)

    Открывает поток для получения вывода методами write и writeln.

    Метод parse

    Возвращает количество миллисекунд в строковом представлении даты, начиная с 1 января 1970 00:00:00, по местному времени.

    Метод pow

    Возвращает base в степени exponent, т.е. baseexponent.

    Метод prompt

    Отображает диалоговое окно с сообщением и полем ввода.

    Метод random

    Изменен в Navigator 3.0.

    Возвращает случайное число между нулем и единицей. Этот метод применяется только на UNIX платфомах.

    Метод replace объекта String

    Синтаксис
    replace(regexp, newSubStr) replace(regexp, function)
    В JavaScript 1.3 в качестве второго параметра можно использовать функцию. В этом случае заданная функция будет вызвана после метода match и ее результат ( строка ) заменит найденную подстроку. Есть возможность передать найденную подстроку функции. Первый параметр функции содержит найденную подстроку, остальные - подсовпадения в найденной строке. Надеюсь следующий пример разъяснит смысл вышесказанного:
    "XXzzzz".replace(/(X*)(z*)/, function (str, p1, p2) {return str +" - " + p1 +" , " + p2;} )
    вернет XX.zzzz - XX , zzzz


  • Метод setTimeout

    Выполняет выражение по истечении установленного количества миллисекунд.

    Метод small

    Выводит строку, отображаемую маленьким шрифтом, как если установить ей таг .

    Метод strike

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

    Метод sub

    Выводит строку, отображаемую как нижний индекс, как если установить ей таг .

    Метод sup

    Выводит строку, отображаемую как нижний индекс, как если установить ей таг .

    Метод toGMTString

    Переводит дату в строку, используя среднее гринвичское время (GMT).

    Метод toLocaleString

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

    Метод toLowerCase

    Возвращает значение вызванной строки, переведенной в нижний регистр.

    Метод toSource

    Синтаксис
    toSource();
    Это новый метод, определенный для всех встроенных объектов. Большинство объектов наследуют этот метод от Object. Метод toSource базируется на методе toString объектов Object и Array.
    toSource возвращает строку, которой вы создавали объект. Вы можете подставлять это значение в функцию eval, сохранять его и др. Для объекта tools метод eval(tools.toSource()) вернет копию объекта tools. Если tools содержит рекурсивные свойства, то строка, которую вернет функция toSource() может выглядеть странно.
    Пример:
    product = {type: "electronic", value: 500}; myList = ["school", 4, "home", 10]; myBool = new Boolean; myString = new String("my line"); myDate = new Date(); document.write(product.toSource()); document.write(myList.toSource()); document.write(myBool.toSource()); document.write(myString.toSource()); document.write(myDate.toSource());


  • Метод toUpperCase

    Возвращает значение вызванной строки, переведенной в верхний регистр.

    Метод UTC

    Возвращает количество миллисекунд в объект date, начиная с 1 января 1970 00:00:00, GMT.

    Метод write

    Пишет одно или более HTML выражений в документ в указанном окне.

    Метод writeln

    Пишет одно или более HTML выражений в документ в указанном окне, добавляя символ перевода на новую строку в конец выходной информации.

    Методы и функции JavaScript

    Наталия Бельтикова, Ирина Кузина (РНЦ "Курчатовский институт")



    NaN

    Синтаксис
    NaN
    В JavaScript 1.2 значение NaN ( Not-a-Number ) было определено только для объекта Number, в версии 1.3 это значение также определено, и для объекта global. NaN никогда не равно ни одному другому числу, включая NaN. Функции, работающие с числами ( например Number constructor, parseFloat и parseInt ) возвращает NaN, если значение параметра не числовое.

    Новый конструктор объекта Date

    Конструктор объкта Date был расширен для поддержки миллисекунд, его полный формат:
    Date (yr_num, mo_num, day_num, [, hr_num[, min_ num[, sec_num[, ms_num]]]])


  • О методе перекодировки символов

    Этот метод многие используют неправильно, наверное, не совсем понимая его суть и ограничения. Он предназначен для восстановления верных кодов букв, если они были неверно проинтерпретированны. Суть метода проста: из полученных неверных символов, используя соответствующую кодовую страницу, восстанавливается исходный массив байтов. Затем из этого массива байтов, используя уже корректную страницу, получаются нормальные кода символов. Пример: String res = new String( src.getBytes("ISO-8859-1"),"Cp1251");
    Проблем в использовании этого приёма может быть несколько. Например, для восстановления используется неверная страница, или же она может измениться в некоторых ситуациях. Другая проблема может быть в том, что некоторые страницы выполняют неоднозначное преобразование byte <-> char. Смотрите, например, описание ошибки за номером .
    Поэтому пользоваться этим методом стоит только в самом крайнем случае, когда уже ничто другое не помогает, и Вы чётко себе представляете, где именно происходит неверное преобразование символов.

    Об утилите native2ascii

    Эта утилита входит в состав Sun JDK и предназначена для преобразования исходных текстов к ASCII-виду. Эта утилита, при запуске без параметров, работает со стандартным входом (stdin) а не выводит подсказку по ключам, как остальные утилиты. Это приводит к тому, что многие и не догадываются о необходимости указания параметров (кроме, может быть, тех, кто нашёл в себе силы и мужество заглянуть таки в документацию :-). Между тем этой утилите для правильной работы необходимо, как минимум, указать используемую кодировку (ключик -encoding). Если этого не сделать, то будет использована кодировка по умолчанию (file.encoding), что может несколько расходится с ожидаемой. В результате, получив неверные кода букв (из-за неверной кодировки) можно потратить весьма много времени на поиск ошибок в абсолютно верном коде.

    Объект anchor (массив anchors)

    Фрагмент текста, который может быть помещен в гиперссылку.

    Объект Boolean

    В JavaScript 1.2 значение false объекта Boolean трактовалось как ложь в логических выражениях. Если Boolean использовался в операторе if ( if (выражение) ), JavaScript 1.2 использовал значение объекта Boolean. В JavaScript 1.3 все объекты в логических выражениях трактуются, как истина, включая объект Boolean, даже если он имеет значение false.
    Пример:
    x = new Boolean(false); if(x) // значение этого выражения - истина { // Выполнение кода }
  • toString

  • В JavaScript 1.3 метод toString объекта Object возвращает [object type], где type - имя объекта или имя конструктора объекта. Метод toString объекта Array вернет строку, содержащую значения всех элементов, разделенных запятыми.
    Пример:
    var SeaLion=new Image(); alert(SeaLion.toString()); // выдаст [object Image]
  • eval

  • Функцию eval можно вызывать не напрямую. Для примера можно использовать следующий код:
    var x = 2;var y = 4; var myEval = eval; myEval(x + y); eval(x + y);
  • Использование операции присваивания в логических выражениях

  • Ранние версии JavaScript конвертировали операции присваивания в логических выражениях в операции сравнения, другими словами if (x=y) превращалось в if (x==y). В Navigator 4.06 и выше возможно использование присваивания, если воспользоваться следующей конструкцией: if ( (x=y) ).
    Web-программист казанского центра интернет Степанищев Евгений

    Объект button

    Изменен в Navigator 3.0.

    Нажимаемая кнопка в HTML форме.

    Объект checkbox

    Изменен в Navigator 3.0.

    Контрольный переключатель (checkbox) в HTML форме. checkbox является сенсорным переключателем, позволяющим пользователю устанавливать значение on или off.

    Объект Date

    Изменен в Navigator 3.0.

    Позволяет вам работать с датой и временем.

    Объект document

    Изменен в Navigator 3.0.

    Содержит информацию о текущем документе и обеспечен методами отображения HTML-документа.

    Объект form (массив forms)

    Изменен в Navigator 3.0.

    Позволяет пользователям вставлять текст и делать изменения из объектов формы таких как графические опции, селекторные кнопки и списки элементов. Вы можете также использовать форму для отправки данных серверу.

    Объект frame (массив frames)

    Изменен в Navigator 3.0.

    Окно, которое может показывать на одном экране несколько независимо прокручиваемых фреймов, каждый из которых имеет свой собственный URL. Фреймы могут указывать на различные URL'и и быть ссылкой других URL'ей, все внутри одного экрана.

    Объект hidden

    Изменен в Navigator 3.0.

    Текстовый объект формы, который не отображается в HTML форме. Объект hidden используется для передачи пар имя/значение при загрузке формы.

    Объект history

    Содержит информацию о URL'ях, которые клиент посещал внутри окна. Эта информация сохраняется и доступна через меню Go Navigator'а.

    Объект link (массив links)

    Изменен в Navigator 3.0.

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

    Объект location

    Изменен в Navigator 3.0.

    Содержит информацию о текущем URL.

    Объект Math

    Изменен в Navigator 3.0.

    Встроенный объект, имеющий свойства и методы для математических констант и функций. Например, свойство PI объекта Math имеет значение Пи.

    Объект navigator

    Изменен в Navigator 3.0.

    Содержит информацию о используемой версии Navigator'а.

    Объект password

    Изменен в Navigator 3.0.

    Текстовое поле в HTML форме, значение которого на экране отображается звездочками (*). Когда пользователь вводит текст в это поле, звездочки (*) скрывают введенное значение.

    Объект radio

    Изменен в Navigator 3.0.

    Установка статических кнопок (кнопок radio) в HTML форме. Установка кнопок radio позволяет пользователю выбрать один пункт из списка.

    Объект reset

    Изменен в Navigator 3.0.

    Кнопка сброса (кнопка reset)в HTML форме. Кнопка reset сбрасывает все элементы в форме в их значения, установленные по умолчанию.

    Объект submit

    Изменен в Navigator 3.0.

    Кнопка передачи данных (кнопка submit) в HTML форме. Кнопка submit вызывает передачу формы.

    Объект text

    Изменен в Navigator 3.0.

    Поле ввода текста в HTML форме. Текстовое поле позволяет пользователю вводить слова, фразы или числовой ряд.

    Объект textarea

    Изменен в Navigator 3.0.

    Многострочное поле ввода текста в HTML форме. Поле textarea позволяет пользователю вводить слова, фразы или числа.

    Объект window

    Изменен в Navigator 3.0.

    Объект верхнего уровня для групп объектов document, location и history.

    Объекты JavaScript

    Наталия Бельтикова, Ирина Кузина (РНЦ "Курчатовский институт")



    Операторы === и !==

    Операторы === и !== проверяют на соответствие ( и не соответствие ) операнды одинаковых типов ( т.е. например оба операнда должны быть типа String ). При сравнении с помощью этих операторов не происходит преобразования типов. Их использование необходимо, когда нужно убедиться, что оба операнда имеют одинаковый тип и одинаковые ( или разные ) значения.
    Пример:
    10 === '10'
    вернет false, тогда как
    10 == '10'
    вернет true.


  • Описание:

    Метод acos возвращает числовое значение между 0 и Пи. Если значение number находится за пределами данного диапазона, возвращаемое значение всегда будет 0.

    Метод alert используется для отображения сообщения, не требующего решения пользователя. Аргумент message определяет сообщение, которое содержит диалоговое окно.

    Хотя alert является методом объекта window вам не нужно определять windowReference, при его вызове. Например, windowReference.alert() необязательно.


    Метод anchor используется с методами write или writeln для программного создания и отображения якоря в документе. Якорь создается с помощью метода anchor, а write или writeln используется для отображения якоря в документе.

    В синтаксисе строка text представляет собой текст, который увидит пользователь. Строка nameAttribute представляет собой атрибут NAME тага
    .

    Якоря, созданные с помощью метода anchor становятся элементами массива anchors. Информацию о массиве anchors смотрите в объекте .


    Метод asin возвращает числовое значение между -Пи/2 и Пи/2. Если значение number находится за пределами данного диапазона, возвращаемое значение всегда будет 0.


    Метод atan возвращает числовое выражение между -Пи/2 и Пи/2.


    Этот метод выполняет действие равносильное выбору пользователем кнопки Back в окне Navigator'а. Метод back также равносилен history.go(-1).


    Для форматирования и отображения строки в документе метод big используется с методами write или writeln.


    Для форматирования и отображения строки в документе метод blink используется с методами write или writeln.


    Метод blur используется для удаления фокуса с указанного элемента формы.


    Для форматирования и отображения строки в документе метод bold используется с методами write или writeln.


    Символы в строке индексируются слева направо. Индексом первого символа является 0, индексом последнего символа - stringName.length-1. Если вы указали index превышающий количество символов в строке, JavaScript возвратит пустую строку.

    Органайзер



    Разберу первую часть скрипта подробно. Вначале определяется тип браузера пользователя, эта часть нам не интересна - такие скрипты можно найти в Internet повсюду. Для начинающих лучше всего воспользоваться редактором с подсветкой синтаксиса. Итак, первая интересующая нас инструкция: "/*@cc_on" - это инструкция начала "условной трансляции". Обратить внимание стоит только на ее начало - "/*" - это обычный комментарий. Internet Explorer выше пятой версии разбирает даже комментарии, и ищет директивы "условной трансляции" (большой брат следит за тобой!). Теперь присмотримся к следующей строке. Тут есть, на первый взгляд, странная строка: "@if( true )" - условие, которое выполнится в любом случае! Необходимость этого условия не кажется очевидной, но на самом деле все очень просто. Если Internet Explorer прочтет эту инструкцию, он выполнит код, который предназначен только ему одному, а строку идущую после директивы "@else*/" пропустит. А теперь предположим, что условия "@if( true ) ... @else" нет - что получится? Internet Explorer выполнит сразу две инструкции - и мы получим в документе сразу два с разными параметрами! Не очень приятная перспектива. Последняя инструкция @cc_off @*/ завершает "условную трансляцию". Таким образом, мы получили переносимый код, подходящий для браузеров на основе движка Internet Explorer (Avant, Maxthon, etc...) и движка Gecko (Netscape Navigator, Mozilla, Mozilla Firefox, Mozilla Firebird, etc...).

    Наша задача создать не красивый, а понятный код, украсить его вы можете сами! Создаю примитивный лист стилей:



    Он отвечает только за отображение и сокрытие контекстного меню, что нам собственно и надо. Теперь надо определить координаты курсора в момент щелчка правой клавиши мыши по документу. Основная сложность заключается в том, что для Netscape Navigator возникает такая проблема, как обработчик события event.onmousedown. Он перекрывает обработчик, заданный в body (в общем-то вполне логично, поскольку event задается относительно окна, а не документа, как в body). И опять возникает ненавистное браузерное контекстное меню. Я решил эту проблему таким образом:


    if( document.all ) {

    } else if( document.getElementById ) { document.captureEvents( Event.MOUSEMOVE ); document.onmousemove = getCoord; }

    Я стал отслеживать каждое передвижение мыши на экране и записывать координаты курсора в глобальные переменные:

    var mouseX; var mouseY;

    function getCoord( event ) { mouseX = event.pageX; mouseY = event.pageY; }

    Теперь соберу саму функцию отображения меню:

    function myfunction() { if( document.all ) { if( event.button == 2 event.button == 3 ) { if( !document.all.contextmenu ) return; var menu = document.all.contextmenu; menu.style.left = event.offsetX; menu.style.top = event.offsetY; menu.className = menuState ? "hidemenu" : "showmenu"; menuState = !menuState; } } else if ( document.getElementById ) { if( !document.getElementById( "contextmenu" ) ) return; var menu = document.getElementById( "contextmenu" ); menu.style.left = mouseX; menu.style.top = mouseY; menu.className = menuState ? "hidemenu" : "showmenu"; menuState = !menuState; return false; } }

    Чтобы разобраться в Функции, не требуется особых навыков в JavaScript. Устанавливается положение меню на основе координат курсора с ветвлением на два браузера. Разница лишь в том, что Internet Explorer получает координаты из события event, а Netscape Navigator из глобальных переменных. Если вы правильно собрали скрипт - у вас должно получиться нечто подобное:

    Context menu









    Для тех же, кто желает "погорячее", привожу код, полностью основанный на "условной трансляции" Microsoft ©. Изложенного выше материала вполне достаточно, чтобы разобраться в нем самому.

    Context menu


    Java

    Img1.shtml

    Img1.shtml
    Рис. 1. Легкий дизайн, всего 2,8 кБ текста на странице...

    Img2.shtml

    Img2.shtml
    Рис. 2. ...и 95 кБ в результате! Как видим, "КПД" такой страницы - около 3%.

    Img3.shtml

    Img3.shtml
    Рис. 3. Текстовый контент этой страницы - меньше 2 кБ.

    Img4.shtml

    Img4.shtml
    Рис. 4. Пока мы догрузим эти новости - они будут позавчерашними.

    Img5.shtml

    Img5.shtml
    Рис. 5. Та же страница, что на , после упаковки.

    JavaScript: создаем Человека

    Прокомментировать статью можно
    Умудренный опытом читатель, прочитав заголовок статьи, сразу, конечно, поймет, что это - не больше, чем шутка и речь дальше пойдет о какой-нибудь программке на JavaScript, которая поможет вам получить еще одного посетителя на сайт, или создаст интерфейс "с человеческим лицом", или...
    Что я могу ответить такому проницательному читателю? Только одно: вы ошиблись! Именно созданием человека мы сегодня займемся - в самом что ни на есть прямом и нешутейном смысле этого выражения. Не больше, но и не меньше. Конечно, реализация мечты средневековых алхимиков о гомункулюсе - не самая простая программистская задача. Но, согласитесь, скучно заниматься мелочами...
    Кому и верить в чудо, как не программисту? Каждый раз, когда мы пишем новую программу - мы создаем новый мир. А сегодня я обещаю научить вас настоящему волшебству: из обрывков программного кода и пригоршни медной проволоки мы сотворим реального человека. Настоящего, живого, дышащего и мыслящего человека, который до этого никогда не жил на Земле и который появится из ниоткуда по нашей воле. Хотите? Нет ничего проще! Все, что от нас потребуется - вера в свои силы, пару строк заклинаний на JavaScript и полчаса работы. Итак, приступим…
    Позвольте мне начать немного издалека. Сначала сказанное ниже вам может показаться лирическим отступлением, но потом вы увидите, что на самом деле это - постановка задачи.
    Итак, скажите, пожалуйста, какие ассоциации возникают у вас в связи со словом "платить"? Рубли, доллары, фунты? Тогда вы, к сожалению, ошиблись еще раз. В действительности, получая что-либо, мы всегда рассчитываемся за приобретение своей жизнью. Если мы неделю (месяц, год) зарабатывали на цифровую фотокамеру, потом пошли в магазин и вышли оттуда с покупкой в дрожащих от счастья руках - это значит, что неделю (месяц, год) своей жизни мы обменяли на возможность орать: "сейчас вылетит птичка!". Покупая, беря в кредит, обменивая любой товар, мы платим за него определенным количеством часов своей жизни. То же самое можно сказать по-другому: мы уменьшаем продолжительность своей жизни в обмен на приобретенные вещи. Вместо того, чтобы пойти в лес, на пляж, почитать хорошую книгу, мы тратим время на зарабатывание денег, то есть, попросту - добровольно вычеркиваем из жизни оговоренное количество дней, за что нам потом дадут новый компьютер, телевизор или квартиру...
    Согласны, что ситуация катастрофична? Тогда давайте искать из нее выход.
    Для этого разрешите мне нарисовать еще одну картинку (уже не столь апокалипсическую). Что происходит, когда мы открываем страницу какого-нибудь сайта? Если вы на минуту задумаетесь, то поймете, что при этом случаются вещи удивительные. Давайте представим: вы сидите за компьютером с быстродействием в сотни миллионов операций в секунду, который через модем прикручен к Интернету. Вы набрали в браузере нужный адрес и стартовали загрузку страницы. "Пожар!" - кричит ваш компьютер на всю сеть. - "На помощь!".
    Призыв не остается без ответа. Мордатые двухметровые плечистые пожарные - вэб-серверы, маршрутизаторы, роутеры и прокси - сбегаются на зов, выстраиваются друг за другом, и... начинают передавать по цепочке наперстки воды. Да если бы наперстки!.. Если сравнить сотни миллионов операций в секунду с обычной скоростью модема (4-12 КБайт/с), то можно сказать, что между получением соседних байтов для компьютера проходят целые геологические эпохи. А пользователь, сидящий у монитора, отдает каждый раз тридцать секунд, а то и пять минут своей жизни в ожидании загрузки.
    Конечно, вы уже поняли: в наших силах продлить жизнь всех пользователей вашего сайта, ускорив загрузку страниц. Представляете, что будет, если нам удастся сэкономить в среднем по пять секунд на клик на сайте со средним числом хитов - скажем, 15000 в сутки? Тем самым мы с вами вернем человечеству больше, чем двадцать четыре часа времени осмысленной жизни в течение суток. Понимаете, что это значит? Мы вызовем к жизни еще одного жителя Земли! Будем верить, что новый человек, которого мы с вами сотворим таким образом, не окажется крэкером ;) ...
    И теперь, когда вы осознали все величие стоящей перед нами цели, давайте, наконец, закончим вступление и приступим к решению этой благородной задачи. Раз скорость канала от нас не зависит, остается единственный и очевидный путь: уменьшать вес страницы. Тем самым мы, кстати, вдвойне поможем обладателям платного трафика: они будут не только меньше ждать у монитора, но и быстрее зарабатывать на просмотр того же количества страниц сайта. Прямая выгода от этого и нам: при размещении сайта на виртуальном хостинге мы всегда сталкиваемся с такой неприятной штукой, как ограничение на количество одновременно выполняемых процессов. Это значит, что, пока, например, пять юзеров радостно утаскивают ваши страницы к себе домой, остальные в лучшем случае "подвисают" в очереди, а в худшем - получают сообщение об ошибке. И уменьшая вес страницы, мы тем самым уменьшаем вероятность подобной ситуации.
    Итак, что мы можем? Первый и очевидный шаг: ругаемся с дизайнером и выбрасываем всю его графику неземной красоты и непомерного веса. Оставляем простой дизайн, легкие кнопочки и маленькие иконки. Но вот все это сделано. Остается почти голый HTML. На и показана страница с "минималистским" дизайном - вид снаружи и изнутри. Как видно, если ваш сайт - это не простейшая галерея, а, скажем, форум, архив статей или любой другой вариант, где преобладает текстовый контент, и/или вы используете "навороченный" движок, то сам HTML без графики тянет тоже немало - до 500Кб.

    Особенно плохо обстоят дела на новостных порталах. Сопоставьте, к примеру, объем отображаемого текста - меньше 2кБ () с весом загружаемой страницы - 165 кБ только html-кода () для далеко не самого перегруженного портала .

    Что можно предпринять? Конечно, обязательно паковать, по каналу гнать сжатый HTML, и распаковывать его на конечном компьютере! Вопрос только, как это делать и чем.

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

    И вот XML уже применяется на полную катушку. Да только одна незадача: если почитать последние статьи по этому языку, в каждой из них мы наткнемся на довольно неожиданный рефрен: "XML - это великий и могучий язык обработки и форматирования данных, это - один свет в окошке, рай земной и коммунизм в одном флаконе; но, естественно(?!), платой за его неизмеримые достоинства является здорово увеличенный(!) по сравнению с HTML размер результирующего файла." Грустно... Что же, не будем опускать руки. Есть ведь и другой способ: многие современные браузеры умеют работать с упакованными файлами. В числе других заголовков http-запроса браузер посылает серверу и список форматов компрессоров, которые он понимает.

    Но тут опять не все так просто. Во-первых, разные браузеры поддерживают разные форматы (а то и вообще никаких). А во-вторых, если вы достаточно легко можете уговорить свой Apache эти файлы не перекодировать, то, пройдя через прокси, они, как правило, все равно превращаются во что-то, мягко говоря, своеобычное. Стало быть, этого делать нельзя: своими руками отсекать 10-15% потенциальных посетителей сайта - так же непрофессионально и по-детски, как писать сайты, корректно работающие только под Internet Explorer-ом.

    Выходит, и тут мимо. Что же, не будем ждать милости от софтверных монстров и посмотрим, что можем сделать мы сами.

    Есть среди используемых в сайтостроении языков один невзрачный и непритязательный. Да еще и в почтенном возрасте. Но именно к нему мы обратимся за помощью. В отличие от XML, язык JavaScript, предназначенный для обработки информации на стороне клиента, не обещает приносить вам тапочки и кофе в постель и писать за вас сайты в полпинка, но зато и в самом деле делает то, для чего был придуман. А значит, нужен нам именно он.

    Допустимо ли использовать JavaScript в принципе? Я провел небольшое исследование на своем сайте на этот счет. Оказалось, что из более чем восьми тысяч отслеженных хостов JavaScript был отключен только у трех человек! Так что, наверно, вполне достаточно в тэгах