Свойством какого объекта является status
Аннотация: Рассматриваются вопросы программирования свойств окна браузера, управление окнами, а также работа с фреймами.
Объект window
Класс объектов Window — это самый старший класс в иерархии объектов JavaScript. Объект window, относящийся к текущему окну (т.е. в котором выполняется скрипт), является объектом класса Window. Класс объектов Frame содержится в классе Window, т.е. каждый фрейм — это тоже объект класса Window.
О фреймах речь пойдет ниже, а пока вернемся к объекту window. Объект window создается только в момент открытия окна. Все остальные объекты, которые порождаются при загрузке страницы, есть свойства объекта window. Более того, все глобальные переменные, определенные в данном окне, тоже являются свойствами объекта window. Таким образом, у объекта window могут быть разные свойства при загрузке разных страниц. Кроме того, в разных браузерах свойства объектов и поведение объектов и браузера при обработке событий может быть различным. При программировании на JavaScript чаще всего используют следующие свойства, методы и события объекта window:
Свойства | Методы | События |
---|---|---|
status defaultStatus location history navigator document opener | open() close() focus() blur() alert() setTimeout() | Load Unload Focus Resize |
Поскольку объект window является самым старшим, то в большинстве случаев при обращении к его свойствам и методам приставку » window.» можно опускать (разумеется, в случае, если вы хотите обратиться к свойству или методу текущего окна, где работает скрипт; если же это другое окно, то необходимо указать его идентификатор). Так, например, можно писать alert(‘Привет’) вместо window.alert(‘Привет’), или location вместо window.location. Исключениями из этого правила являются вызовы методов open() и close(), у которых нужно указывать имя окна, с которым работаем (родительское в первом случае и дочернее во втором). Свойства frames[], self, parent и top будут рассмотрены в разделе, посвященном фреймам. Свойство opener будет рассмотрено при описании метода window.close().
Свойства объекта window
Поле статуса и свойство window.status
Поле статуса — это первое, что начали использовать авторы HTML-страниц из арсенала JavaScript. Калькуляторы, игры, математические вычисления и другие элементы выглядели слишком искусственно. На их фоне бегущая строка в поле статуса была изюминкой, которая могла действительно привлечь внимание пользователей к Web-узлу. Постепенно ее популярность сошла на нет. Бегущие строки стали редкостью, но программирование поля статуса встречается на многих Web-узлах.
Рис.
4.1.
Поле статуса
Полем статуса (status bar) называют поле нижней части окна браузера сразу под областью отображения HTML-страницы. В поле статуса отображается информация о состоянии браузера (загрузка документа, загрузка графики, завершение загрузки, запуск апплета и т.п.). Программа на JavaScript имеет возможность работать с этим полем как с изменяемым свойством окна. При этом фактически с ним связаны два разных свойства:
- window.status — значение поля статуса;
- window.defaultStatus — значение поля статуса по умолчанию.
Значение свойства status можно изменить — и оно тут же будет отображено в поле статуса. Свойство defaultStatus тоже можно менять — и сразу по его изменении оно отображается в поле статуса.
Разница между этими двумя свойствами заключается в их поведении: если свойству status присвоить пустую строку: window.status=»», то в поле статуса автоматически будет отображено значение defaultStatus. Обратного же не происходит: при присвоении пустой строки свойству defaultStatus оно и отобразится в поле статуса, независимо от значения свойства status. Следует отметить, что реакция браузеров на описываемые ниже действия со свойствами status и defaultStatus может быть разной в различных браузерах.
Программируем status
Свойство status связано с отображением сообщений о событиях, отличных от простой загрузки страницы.
Например, в Internet Explorer при наведении указателя мыши на ссылку обработчик onMouseOver помещает в поле статуса значение URL, указанное в атрибуте HREF этой ссылки (при этом никак не меняя значения свойств status и defaultStatus ). При попадании же курсора мыши на область, свободную от ссылок, обработчик onMouseOut возвращает в поле статуса значение defaultStatus, при условии, что оно не есть пустая строка (опять же никак не меняя значений обоих свойств). Мы можем изменить это поведение, например, как в следующем примере:
onMouseOut=»window.status=’Мышь увели со ссылки’;»
HREF=»https://site.com/»>Наведите мышь на ссылку и следите за полем статуса</A>
Обратите внимание на оператор return true в конце обработчика событий onMouseOver. Он необходим для того, чтобы отменить действие по умолчанию (в данном случае — вывод URL в поле статуса), которое, в отсутствие этого оператора, браузер выполнил бы сразу после вывода нами своей строки в поле статуса, и пользователь не успел бы увидеть нашу строку. Аналогичный трюк отмены действия по умолчанию годится и для некоторых других событий ( onClick, onKeyDown, onKeyPress, onMouseDown, onMouseUp, onSubmit, onReset ), с той лишь разницей, что для перечисленных обработчиков отмена выполняется оператором return false.
Для обработчика onMouseOut такого способа отменить действие по умолчанию не существует (к сожалению). Но в данном конкретном случае это не требуется — как уже было сказано, при уводе курсора со ссылки в поле статуса восстанавливается значение defaultStatus только в случае, если это значение не есть пустая строка. Но в нашем случае (по умолчанию при загрузке страницы в IE) оно равно именно пустой строке. Поэтому, уводя курсор с нашей ссылки, мы продолжаем видеть в поле статуса строку «Мышь увели со ссылки». Ситуация изменится в следующем примере, когда мы предварительно зададим свое (непустое) значение defaultStatus.
Программируем defaultStatus
Свойство defaultStatus определяет текст, отображаемый в поле статуса, когда никаких событий не происходит. Дополним предыдущий пример изменением этого свойства в момент окончания загрузки документа, т.е. в обработчике onLoad:
<A onMouseOver=»window.status=’Мышь над ссылкой’;return true;»
onMouseOut=»window.status=’Мышь увели со ссылки’; alert(‘Ждем’);»
HREF=»https://site.com/»>Наведите мышь на ссылку и следите за полем статуса</A>
</BODY>
Сразу после загрузки документа в поле статуса будет «Значение по умолчанию». При наведении указателя мыши на ссылку в поле статуса появится надпись «Мышь над ссылкой», при этом URL ссылки ( https://site.com/ ) в поле статуса не появится, т.к. мы подавили его вывод оператором return true.
При убирании указателя мыши со ссылки пользователь бы не успел увидеть строку «Мышь увели со ссылки», поскольку действие по умолчанию (вывод значения defaultStatus в поле статуса) не подавлено (и не может быть подавлено — у обработчика onMouseOut нет такой возможности). Однако мы ввели оператор вывода окна предупреждения alert(‘Ждем’) (он рассматривается ниже) — и теперь пользователь будет видеть в поле статуса строку «Мышь увели со ссылки» до тех пор, пока не нажмет OK в этом окне.
Поле адреса и свойство window.location
Поле адреса в браузере обычно располагается в верхней части окна и отображает URL загруженного документа. Если пользователь хочет вручную перейти к какой-либо странице (набрать ее URL), он делает это в поле адреса.
Рис.
4.2.
Поле адреса (location)
Свойство location объекта window само является объектом класса Location. Класс Location, в свою очередь, является подклассом класса URL, к которому относятся также объекты классов Area и Link. Объекты Location наследуют все свойства объектов URL, что позволяет получить доступ к любой части схемы URL. Подробнее о классе объектов URL мы расскажем в
«Программируем гипертекстовые переходы»
.
В целях совместимости с прежними версиями JavaScript, в языке поддерживается также свойство window.document.location, которое в настоящее время полностью дублирует свойство window.location со всеми его свойствами и методами. Рассмотрим теперь свойства и методы объекта window.location (событий, связанных с этим объектом, нет).
Свойства объекта location
Их проще продемонстрировать на примере. Предположим, что браузер отображает страницу, расположенную по адресу:
Тогда свойства объекта location примут следующие значения:
window.location.protocol = «http:»
window.location.hostname = «www.site.ru»
window.location.port = 80
window.location.host = «www.site.ru:80»
window.location.pathname = «dir/page.cgi»
window.location.search = «?product=phone&id=3»
window.location.hash = «#mark»
Как уже говорилось в предыдущих лекциях, к свойствам объектов можно обращаться как с помощью точечной нотации (как выше), так и с помощью скобочной нотации, например: window.location[‘host’].
Методы объекта location
Методы объекта location предназначены для управления загрузкой и перезагрузкой страницы. Это управление заключается в том, что можно либо перезагрузить текущий документ (метод reload() ), либо загрузить новый (метод replace() ).
Метод reload() полностью моделирует поведение браузера при нажатии на кнопку Reload в панели инструментов. Если вызывать метод без аргумента или указать его равным true, то браузер проверит время последней модификации документа и загрузит его либо из кеша (если документ не был модифицирован), либо с сервера. Такое поведение соответствует простому нажатию кнопки Reload браузера (клавиши F5 в Internet Explorer). Если в качестве аргумента указать false, то браузер перезагрузит текущий документ с сервера, несмотря ни на что. Такое поведение соответствует одновременному нажатию клавиши Shift и кнопки браузера Reload (или Ctrl+F5 в Internet Explorer).
Используя объект location, перейти на новую страницу можно двумя способами:
window.location.replace(«https://www.newsite.ru/»);
Разница между ними — в отображении этого действия в истории посещений страниц window.history. В первом случае в историю посещений добавится новый элемент, содержащий адрес » https://www.newsite.ru/ «, так что при желании можно будет нажать кнопку Back на панели браузера, чтобы вернуться к прежней странице. Во втором случае новый адрес » https://www.newsite.ru/ » заместит прежний в истории посещений, и вернуться к прежней странице нажатием кнопки Back уже будет невозможно.
История посещений (history)
История посещений страниц World Wide Web позволяет пользователю вернуться к странице, которую он просматривал ранее в данном окне браузера. История посещений в JavaScript трансформируется в объект window.history. Этот объект указывает на массив URL-страниц, которые пользователь посещал и которые он может получить, выбрав из меню браузера режим Go. Методы объекта history позволяют загружать страницы, используя URL из этого массива.
Чтобы не возникло проблем с безопасностью браузера, путешествовать по History можно, только используя индекс. При этом URL, как текстовая строка, программисту недоступен. Чаще всего этот объект используют в примерах или страницах, на которые могут быть ссылки из нескольких разных страниц, предполагая, что можно вернутся к странице, из которой пример будет загружен:
Данный код отображает кнопку «Назад», нажав на которую, мы вернемся на предыдущую страницу. Аналогичным образом действует метод history.forward(), перенося нас на следующую посещенную страницу.
Существует также метод go(), имеющий целочисленный аргумент и позволяющий перескакивать на несколько шагов вперед или назад по истории посещений. Например, history.go(-3) перенесет нас на 3 шага назад в истории просмотра. При этом методы back() и forward() равносильны методу go() с аргументами -1 и 1, соответственно. Вызов history.go(0) приведет к перезагрузке текущей страницы.
Тип браузера (navigator)
Часто возникает задача настройки страницы на конкретную программу просмотра (браузер). При этом возможны два варианта: определение типа браузера на стороне сервера, либо на стороне клиента. Для последнего варианта в арсенале объектов JavaScript существует объект window.navigator. Важнейшие из свойств этого объекта перечислены ниже.
Свойство | Описание |
---|---|
userAgent | Основная информация о браузере. Передается серверу в HTTP-заголовке при открытии пользователем страниц |
appName | Название браузера |
appCodeName | Кодовое название браузера |
appVersion | Данные о версии браузера и совместимости |
Рассмотрим простой пример определения типа программы просмотра:
onClick=»alert(window.navigator.userAgent);»></FORM>
При нажатии на кнопку отображается окно предупреждения, содержащее значение свойства navigator.userAgent. Если это значение разобрать по компонентам, то может получиться, например, следующее:
navigator.appName = «Microsoft Internet Explorer»
navigator.appCodeName = «Mozilla»
navigator.appVersion = «4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1)»
У объекта navigator есть еще несколько интересных с точки зрения программирования применений. Например, чтобы проверить, поддерживает ли браузер клиента язык Java, достаточно вызвать метод navigator.javaEnabled(), возвращающий значение true, если поддерживает, и false в противном случае.
Можно проверить, какие форматы графических файлов поддерживает браузер, воспользовавшись свойством navigator.mimeTypes (оно представляет собой массив всех типов MIME, которые поддерживаются данным браузером):
if(navigator.mimeTypes[‘image/gif’]!=null)
document.write(‘Ваш браузер поддерживает GIF<BR>’);
if(navigator.mimeTypes[‘image/tiff’]==null)
document.write(‘Ваш браузер не поддерживает TIFF’);
</SCRIPT>
К сожалению, такая проверка не позволяет определить наличие возможности автоматической подгрузки графики.
Объекты
Объект — это главный тип данных JavaScript. Любой другой тип данных имеет объектовую «обертку» (wrapper). Это означает, что прежде чем можно будет получить доступ к значению переменной того или иного типа, происходит конвертирование переменной в объект, и только после этого выполняются действия над значением. Тип данных Object сам определяет объекты.
В сценарии JavaScript могут использоваться объекты нескольких видов:
- клиентские объекты, входящие в модель DOM, т.е. отвечающие тому, что содержится или происходит на Web-странице в окне браузера. Они создаются браузером при разборе (парсинге) HTML-страницы. Примеры: window, document, location, navigator и т.п.
- серверные объекты, отвечающие за взаимодействие клиент-сервер. Примеры: Server, Project, Client, File и т.п. Серверные объекты в этом курсе рассматриваться не будут.
- встроенные объекты. Они представляют собой различные типы данных, свойства, методы, присущие самому языку JavaScript, независимо от содержимого HTML-страницы. Примеры: встроенные классы объектов Array, String, Date, Number, Function, Boolean, а также встроенный объект Math.
- пользовательские объекты. Они создаются программистом в процессе написания сценария с использованием конструкторов типа объектов (класса). Например, можно создать свои классы Cat и Dog. Создание и использование таких объектов будет рассмотрено далее в этой лекции.
Операторы работы с объектами
for … in …
Оператор for(переменная in объект) позволяет «пробежаться» по свойствам объекта. Рассмотрим пример (об объекте document см. ниже):
document.write(«document.»+v+» = <B>»+ document[v]+»</B><BR>»);
Результатом работы этого скрипта будет длинный список свойств объекта document, мы приведем лишь его начало (полностью получите его самостоятельно):
bgColor = #ffffff
mimeType = HTML Document
defaultCharset = windows-1251
lastModified = 07/16/2002 21:22:53
onclick = null
links = [object]
…
Примечание Попробуйте запустить этот скрипт в разных браузерах — и Вы увидите, что набор свойств у объекта document различный в различных браузерах. Аналогичная ситуация со многими объектами модели DOM, о которой пойдет речь ниже. Именно поэтому приходится постоянно заботиться о так называемой кроссбраузерной совместимости при программировании динамических HTML-документов.
with
Оператор with задает объект по умолчанию для блока операторов, определенных в его теле. Синтаксис его таков:
Все встречающиеся в теле этого оператора свойства и методы должны быть либо записанными полностью, либо они будут считаться свойствами и методами объекта, указанного в операторе with. Например, если в документе есть форма с именем anketa, а в ней есть поля ввода с именами age и speciality, то мы можем воспользоваться оператором with для сокращения записи:
{
age.value=35;
speciality.value=’программист’;
window.alert(length);
submit();
}
Здесь age.value есть сокращенное обращение к document.anketa.age.value, length есть краткая запись свойства document.anketa.length (означающего число полей в форме), submit() есть краткая запись метода document.anketa.submit() (отсылающего введенные в форму данные на сервер), тогда как метод window.alert() записан полностью и не относится к объекту document.anketa.
Оператором with полезно пользоваться при работе с объектом Math, используемым для доступа к математическим функциям и константам. Например, внутри тела оператора with(Math) можно смело писать: sin(f)*cos(h+PI/2) ; без оператора with пришлось бы указывать Math три раза: Math.sin(f)*Math.cos(h+Math.PI/2)
Клиентские объекты
Для создания механизма управления страницами на клиентской стороне используется объектная модель документа (DOM — Document Object Model). Суть модели в том, что каждому HTML-контейнеру соответствует объект, который характеризуется тройкой:
- свойства
- методы
- события
Объектную модель можно представить как способ связи между страницами и браузером. Объектная модель документа — это представление объектов, их методов, свойств и событий, которые присутствуют и происходят в программном обеспечении браузера, в виде, удобном для работы с ними из кода HTML и исходного текста сценария на странице. Мы можем с ее помощью сообщать наши пожелания браузеру и далее — посетителю страницы. Браузер выполнит наши команды и соответственно изменит страницу на экране.
Объекты с одинаковым набором свойств, методов и событий объединяются в классы однотипных объектов. Классы — это описания возможных объектов . Сами объекты появляются только после загрузки документа браузером или как результат работы программы. Об этом нужно всегда помнить, чтобы не обратиться к объекту, которого нет.
Иерархия классов DOM
Объектно-ориентированный язык программирования предполагает наличие иерархии классов объектов. В JavaScript такая иерархия начинается с класса объектов window, т.е. каждый объект приписан к тому или иному окну. Для обращения к любому объекту или его свойству указывают полное или частичное имя этого объекта или свойства объекта, начиная с имени объекта, старшего в иерархии, в который входит данный объект:
Рис.
3.1.
Иерархия объектов DOM (фрагмент)
Сразу оговоримся, что приведенная нами схема объектной модели верна для Netscape Navigator версии 4 и выше, а также для Microsoft Internet Explorer версии 4 и выше. Еще раз отметим, что объектные модели у Internet Explorer и Netscape Navigator совершенно разные, а приведенная схема составлена на основе их общей части.
Вообще говоря, JavaScript не является классическим объектным языком (его еще называют облегченным объектным языком). В нем нет наследования и полиморфизма. Имеется лишь отношение «объект A содержит объект B » (которое и проиллюстрировано на рис. 3.1). Оно не является иерархией классов в буквальном смысле. Действительно, нахождение класса window в этой иерархии выше класса history не означает, что всякий объект типа history является объектом типа window и наследует все его свойства и методы, как это понималось бы в стандартных объектно-ориентированных языках. В JavaScript же это отношение означает лишь то, что объект history является свойством объекта window, а значит, чтобы получить к нему доступ, нужно воспользоваться «точечной нотацией»: window.history.
У объектов DOM некоторые свойства обязательно присутствуют, тогда как наличие других зависит от Web-страницы. Например, объект window всегда имеет в качестве своих свойств объекты location и history, т.е. это обязательные свойства. Если HTML-страница содержит контейнер <BODY>, то у объекта window будет присутствовать в качестве свойства объект document. Если HTML-страница содержит контейнер <FRAMESET> со вложенными в него контейнерами <FRAME>, то у объекта window будут присутствовать в качестве свойств имена фреймов, например window.f1. Последние, как мы увидим в будущих лекциях, сами являются объектами класса window, и для них в свою очередь справедливо все вышесказанное.
Примечание. Строго говоря, каждый браузер, будь то Internet Explorer, Netscape Navigator или Opera, имеет свою объектную модель. Объектные модели разных браузеров (и даже разные версии одного) отличаются друг от друга, но имеют принципиально одинаковую структуру. Поэтому нет смысла останавливаться на каждой из них по отдельности. Мы будем рассматривать общий подход применительно ко всем браузерам, иногда, конечно, заостряя внимание на различиях между ними.