Window - это самый старший класс в иерархии объектов JavaScript. Объект window, относящийся к текущему окну (т.е. в котором выполняется скрипт), является объектом класса Window. содержится в классе Window, т.е. каждый Window.
О window. Объект window создается только в момент открытия окна. Все остальные объекты, которые порождаются при загрузке страницы, есть свойства объекта window. Более того, все window. Таким образом, у объекта window могут быть разные свойства при загрузке разных страниц. Кроме того, в разных браузерах свойства объектов и поведение объектов и браузера при window:
| Свойства | Методы | События |
|---|---|---|
status defaultStatus location history navigator document frames[] opener parent self top |
open() close() focus() blur() alert() confirm() prompt() setTimeout() setInterval() clearTimeout() clearInterval() |
Load Unload Focus Blur Resize Error |
Поскольку объект window является самым старшим, то в большинстве случаев при обращении к его свойствам и методам приставку " window." можно опускать (разумеется, в случае, если вы хотите обратиться к свойству или методу текущего окна, где работает скрипт; если же это другое окно, то необходимо указать его идентификатор). Так, например, можно писать вместо window., или вместо window.. Исключениями из этого правила являются вызовы методов open() и close(), у которых нужно указывать , self, и top будут рассмотрены в разделе, посвященном фреймам. Свойство opener будет рассмотрено при описании метода window.close().
Поле статуса - это первое, что начали использовать авторы HTML-страниц из арсенала JavaScript. Калькуляторы, игры, математические вычисления и другие элементы выглядели слишком искусственно. На их фоне бегущая строка в поле статуса была изюминкой, которая могла действительно привлечь внимание пользователей к Web-узлу. Постепенно ее популярность сошла на нет. Бегущие строки стали редкостью, но программирование поля статуса встречается на многих Web-узлах.
(рис 4.1) Поле статусаПолем статуса (
window.status - значение поля статуса;window.defaultStatus - значение поля статуса по умолчанию.Значение свойства можно изменить - и оно тут же будет отображено в поле статуса. Свойство defaultStatus тоже можно менять - и сразу по его изменении оно отображается в поле статуса.
Разница между этими двумя свойствами заключается в их поведении: если свойству присвоить пустую строку: window., то в поле статуса автоматически будет отображено значение defaultStatus. Обратного же не происходит: при присвоении пустой строки свойству defaultStatus оно и отобразится в поле статуса, независимо от значения свойства . Следует отметить, что реакция браузеров на описываемые ниже действия со свойствами и defaultStatus может быть разной в различных браузерах.
Свойство связано с отображением сообщений о событиях, отличных от простой загрузки страницы.
Например, в onMouseOver помещает в поле статуса значение URL, указанное в атрибуте этой ссылки (при этом никак не меняя значения свойств и defaultStatus ). При попадании же курсора мыши на область, свободную от ссылок, обработчик onMouseOut возвращает в поле статуса значение defaultStatus, при условии, что оно не есть пустая строка (опять же никак не меняя значений обоих свойств). Мы можем изменить это поведение, например, как в следующем примере:
<A onMouseOver="window.status='Мышь над ссылкой';return true;"
onMouseOut="window.status='Мышь увели со ссылки';"
HREF="http://site.com/">Наведите мышь на ссылку и следите за полем статуса</A>
Обратите внимание на оператор return true в конце обработчика событий onMouseOver. Он необходим для того, чтобы , onKeyDown, onKeyPress, onMouseDown, onMouseUp, onSubmit, onReset ), с той лишь разницей, что для перечисленных обработчиков отмена выполняется оператором return false.
Для обработчика onMouseOut такого способа отменить действие по умолчанию не существует (к сожалению). Но в данном конкретном случае это не требуется - как уже было сказано, при уводе курсора со ссылки в поле статуса восстанавливается значение defaultStatus только в случае, если это значение не есть пустая строка. Но в нашем случае (по умолчанию при загрузке страницы в IE) оно равно именно пустой строке. Поэтому, уводя курсор с нашей ссылки, мы продолжаем видеть в поле статуса строку "Мышь увели со ссылки". Ситуация изменится в следующем примере, когда мы предварительно зададим свое (непустое) значение defaultStatus.
Свойство defaultStatus определяет текст, отображаемый в поле статуса, когда никаких событий не происходит. Дополним предыдущий пример изменением этого свойства в момент окончания загрузки документа, т.е. в обработчике onLoad:
<BODY onLoad="window.defaultStatus='Значение по умолчанию';">
<A onMouseOver="window.status='Мышь над ссылкой';return true;"
onMouseOut="window.status='Мышь увели со ссылки'; alert('Ждем');"
HREF="http://site.com/">Наведите мышь на ссылку и следите за полем статуса</A>
</BODY>
Сразу после загрузки документа в поле статуса будет "Значение по умолчанию". При наведении указателя мыши на ссылку в поле статуса появится надпись "Мышь над ссылкой", при этом URL ссылки ( http://site.com/ ) в поле статуса не появится, т.к. мы подавили его вывод оператором return true.
При убирании указателя мыши со ссылки пользователь бы не успел увидеть строку "Мышь увели со ссылки", поскольку действие по умолчанию (вывод значения defaultStatus в поле статуса) не подавлено (и не может быть подавлено - у обработчика onMouseOut нет такой возможности). Однако мы ввели оператор вывода (он рассматривается ниже) - и теперь пользователь будет видеть в поле статуса строку "Мышь увели со ссылки" до тех пор, пока не нажмет OK в этом окне.
Поле адреса в браузере обычно располагается в верхней части окна и отображает URL загруженного документа. Если пользователь хочет вручную перейти к какой-либо странице (набрать ее URL), он делает это в поле адреса.
(рис 4.2) Поле адреса (location)Свойство объекта window само является объектом класса . Класс , в свою очередь, является URL, к которому относятся также объекты классов и Link. Объекты наследуют все свойства объектов URL, что позволяет получить доступ к любой части URL мы расскажем в лекции 6.
В целях совместимости с прежними версиями JavaScript, в языке поддерживается также свойство window.document., которое в настоящее время полностью дублирует свойство window. со всеми его свойствами и методами. Рассмотрим теперь свойства и методы объекта window. (событий, связанных с этим объектом, нет).
Их проще продемонстрировать на примере. Предположим, что браузер отображает страницу, расположенную по адресу:
http://www.site.ru:80/dir/page.cgi?product=phoneid=3#mark
Тогда свойства объекта примут следующие значения:
window.location.href = "http://www.site.ru:80/dir/page.cgi?product=phoneid=3#mark" 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=phoneid=3" window.location.hash = "#mark"
Как уже говорилось в предыдущих лекциях, к свойствам объектов можно обращаться как с помощью window..
Методы объекта предназначены для управления загрузкой и перезагрузкой страницы. Это управление заключается в том, что можно либо перезагрузить текущий документ (метод ), либо загрузить новый (метод ).
window.location.reload(true);
Метод полностью моделирует поведение браузера при нажатии на кнопку true, то браузер проверит время последней модификации документа и загрузит его либо из false, то браузер перезагрузит текущий документ с сервера, несмотря ни на что. Такое поведение соответствует одновременному нажатию клавиши Shift и кнопки браузера
Используя объект , перейти на новую страницу можно двумя способами:
window.location.href="http://www.newsite.ru/";
window.location.replace("http://www.newsite.ru/");
Разница между ними - в отображении этого действия в истории посещений страниц window.. В первом случае в историю посещений добавится новый элемент, содержащий адрес " http://www.newsite.ru/ ", так что при желании можно будет нажать кнопку Back на панели браузера, чтобы вернуться к прежней странице. Во втором случае новый адрес " http://www.newsite.ru/ " заместит прежний в истории посещений, и вернуться к прежней странице нажатием кнопки Back уже будет невозможно.
История посещений страниц World Wide Web позволяет пользователю вернуться к странице, которую он просматривал ранее в данном окне браузера. История посещений в JavaScript трансформируется в объект window.. Этот объект указывает на массив URL-страниц, которые пользователь посещал и которые он может получить, выбрав из меню браузера режим Go. Методы объекта позволяют загружать страницы, используя URL из этого массива.
Чтобы не возникло проблем с безопасностью браузера, путешествовать по
<FORM><INPUT TYPE="button" VALUE="Назад" onClick="history.back()"></FORM>
Данный код отображает кнопку "Назад", нажав на которую, мы вернемся на предыдущую страницу. Аналогичным образом действует метод , перенося нас на следующую посещенную страницу.
Существует также метод go(), имеющий целочисленный аргумент и позволяющий перескакивать на несколько шагов вперед или назад по истории посещений. Например, перенесет нас на 3 шага назад в истории просмотра. При этом методы back() и равносильны методу go() с аргументами -1 и 1, соответственно. Вызов приведет к перезагрузке текущей страницы.
Часто возникает задача настройки страницы на конкретную программу просмотра (браузер). При этом возможны два варианта: определение типа браузера на стороне сервера, либо на стороне клиента. Для последнего варианта в арсенале объектов JavaScript существует объект window.. Важнейшие из свойств этого объекта перечислены ниже.
| Свойство | Описание |
|---|---|
userAgent |
Основная информация о браузере. Передается серверу в HTTP-заголовке при открытии пользователем страниц |
appName |
Название браузера |
appCodeName |
Кодовое название браузера |
appVersion |
Данные о версии браузера и совместимости |
Рассмотрим простой пример определения типа программы просмотра:
<FORM><INPUT TYPE=button VALUE="Тип навигатора" onClick="alert(window.navigator.userAgent);"></FORM>
При нажатии на кнопку отображается . Если это значение разобрать по компонентам, то может получиться, например, следующее:
navigator.userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1)" navigator.appName = "Microsoft Internet Explorer" navigator.appCodeName = "Mozilla" navigator.appVersion = "4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1)"
У объекта есть еще несколько интересных с точки зрения программирования применений. Например, чтобы проверить, поддерживает ли браузер клиента язык Java, достаточно вызвать метод , возвращающий значение true, если поддерживает, и false в противном случае.
Можно проверить, какие форматы графических файлов поддерживает браузер, воспользовавшись свойством (оно представляет собой массив всех типов
<SCRIPT>
if(navigator.mimeTypes['image/gif']!=null)
document.write('Ваш браузер поддерживает GIF<BR>');
if(navigator.mimeTypes['image/tiff']==null)
document.write('Ваш браузер не поддерживает TIFF');
</SCRIPT>
К сожалению, такая проверка не позволяет определить наличие возможности автоматической подгрузки графики.
Что можно сделать с окном? Открыть (создать), закрыть (удалить), положить его поверх всех других открытых окон (передать фокус). Кроме того, можно управлять свойствами окна и свойствами подчиненных ему объектов. Сосредоточимся на простых и наиболее популярных
Метод позволяет выдать
<A HREF="javascript:window.alert('Внимание')">
Повторите запрос!</A>
Нужно лишь иметь в виду, что сообщения выводятся
Метод позволяет задать пользователю вопрос, на который тот может ответить либо положительно (нажав кнопку "OK"), либо отрицательно (нажав кнопку "Отмена" или " возвращает значение true либо false. Пример:
<FORM NAME=f>
<INPUT TYPE=button NAME=b VALUE="Нажмите эту кнопку"
onClick="if(window.confirm('Вы знаете JavaScript?'))
document.f.b.value='Да. Спросить еще?';
else document.f.b.value='Нет. Спросить еще?';">
</FORM>
Все ограничения для сообщений на русском языке, которые были описаны для метода , справедливы и для метода .
Метод prompt() позволяет принять от пользователя cтроку текста. Синтаксис его таков:
prompt("Строка вопроса","Строка ответа по умолчанию")
Когда пользователь введет свой ответ (либо оставит неизменным ответ по умолчанию) и нажмет кнопку OK, метод prompt() возвратит полученную строчку в качестве значения, которое можно далее присвоить любой переменной и потом разбирать ее в JavaScript-программе.
<FORM NAME=f>
<INPUT TYPE=button VALUE="Открыть окно ввода"
onClick="document.f.e.value=
window.prompt('Введите сообщение','Сюда');">
<INPUT SIZE=30 NAME=e>
</FORM>
предназначен для создания новых
myWin = window.open("URL","имя_окна","параметр=значение,параметр=значение,...", заменить);
Первый аргумент задает адрес страницы, загружаемой в новое окно (можно оставить пустую строку, тогда окно останется пустым). Второй аргумент задает контейнеров <A> и <FORM>. В качестве значений допустимы также зарезервированные имена _blank, _parent, _self, _top, смысл которых такой же, как у аналогичных значений атрибута . Если имя_окна совпадает с именем уже существующего окна (или myWin будут применяться к этому окну (или
Третий аргумент есть не содержащая пробелов строка, представляющая собой список параметров и их значений, перечисленных через запятую. Указание каждого из параметров необязательно, однако значения по умолчанию могут зависеть от браузера, поэтому всегда указывайте явно те параметры, на которые рассчитываете. Возможные параметры перечислены в таблице 4.3.
Вместо значений yes и no можно использовать 1 и 0.
Последний аргумент " заменить " является необязательным, принимает значения true и false и означает: следует ли новый URL добавить в в качестве нового элемента или заменить им последний элемент .
Метод window.open() возвращает ссылку на вновь открытое окно, т.е. объект класса Window. Его можно присвоить переменной (что мы и сделали выше), с тем чтобы потом можно было управлять открытым окном (писать в него, читать из него, передавать и убирать фокус, закрывать).
| Параметр | Значения | Описание |
|---|---|---|
width |
число | Ширина окна в пикселах (не менее 100 ) |
height |
число | Высота окна в пикселах (не менее 100 ) |
left |
число | Расстояние от левого края экрана до левой границы окна в пикселах |
top |
число | Расстояние от верхнего края экрана до |
directories |
yes / no |
Наличие у окна панели папок ( |
|
yes / no |
Наличие у окна поля адреса |
menubar |
yes / no |
Наличие у окна панели меню |
|
yes / no |
Сможет ли пользователь менять размер окна |
scrollbars |
yes / no |
Наличие у окна |
|
yes / no |
Наличие у окна поля статуса |
|
yes / no |
Наличие у окна панели инструментов |
Приведем два примера открытия нового окна:
<FORM>
<INPUT TYPE=button VALUE="Простое окно"
onClick="window.open('', 'test1',
'directories=no,height=200,location=no,'+
'menubar=no,resizable=no,scrollbars=no,'+
'status=no,toolbar=no,width=200');">
<INPUT TYPE=button VALUE="Сложное окно"
onClick="window.open('', 'test2',
'directories=yes,height=200,location=yes,'+
'menubar=yes,resizable=yes,scrollbars=yes,'+
'status=yes,toolbar=yes,width=200');">
</FORM>
При нажатии кнопки "Простое окно" получаем окно со следующими параметрами:
directories=no - окно без панели папокheight=200 - высота 200 pxlocation =no - поле адреса отсутствуетmenubar=no - без менюresizable =no - размер окна изменять нельзяscrollbars=no - status =no - статусная строка отсутствуетtoolbar =no - системные кнопки браузера отсутствуютwidth=200 - ширина 200 pxПри нажатии кнопки "Сложное окно" получаем окно, где:
directories=yes - окно с панелью папокheight=200 - высота 200 pxlocation =yes - поле адреса естьmenubar=yes - меню естьresizable =yes - размер изменять можноscrollbars=yes - есть status =yes - статусная строка естьtoolbar =yes - системные кнопки браузера естьwidth=200 - ширина 200 px позволяет закрыть окно
window.close(); self.close();
Если мы открыли окно с помощью метода window.open(), то из скрипта, работающего в новом окне, сослаться на окно-родитель можно с помощью window.opener (обратите внимание, здесь window ссылается на объект нового, созданного окна, т.к. оно использовано в скрипте, работающем в новом окне). Поэтому, если необходимо закрыть родительское окно, т.е. окно, из которого было открыто текущее, то:
window.opener.close();
Если необходимо закрыть произвольное окно, то тогда сначала нужно получить его идентификатор:
id=window.open(); ... id.close();
Как видно из последнего примера, закрывают окно не по имени (значение атрибута тут ни при чем), а используют указатель на объект.
Метод применяется для передачи фокуса в окно, с которым он использовался. Передача фокуса полезна как при открытии окна, так и при его закрытии, не говоря уже о случаях, когда нужно выбирать окна. Рассмотрим пример.
Открываем окно и, не закрывая его, снова откроем окно с таким же именем, но с другим текстом. Новое окно не появилось поверх основного окна, так как фокус ему не был передан. Теперь повторим открытие окна, но уже с передачей фокуса:
<HTML>
<HEAD>
<SCRIPT>
function myfocus(a)
{
myWin = window.open('','example','width=300,height=200');
// открываем окно и заводим переменную с указателем на него.
// Если окно с именем 'example' существует, то новое окно не создается,
// а открывается поток для записи в имеющееся окно с именем 'example'
if(a==1)
{
myWin.document.open(); //открываем поток ввода в уже созданное окно
myWin.document.write('<H1>Открыли окно в первый раз'); //Пишем в этот поток
}
if(a==2)
{
myWin.document.open();
myWin.document.write('<H1>Открыли окно во второй раз');
}
if(a==3)
{
myWin.focus(); // передаем фокус, а затем выполняем те же действия,
// что и в предыдущем случае
myWin.document.open();
myWin.document.write('<H1>Открыли окно в третий раз');
}
myWin.document.write('</H1>');
myWin.document.close();
}
</SCRIPT>
</HEAD>
<BODY>
<a href="javascript:myfocus(1);">Откроем окно и напишем в него что-то</a>,
<BR><BR>
<a href="javascript:myfocus(2);">напишем в него же что-то другое, но фокус не передадим</a>,
<BR><BR>
<a href="javascript:myfocus(3);">опять что-то напишем в него, но сперва передав ему фокус</a>.
</BODY>
</HTML>
Поскольку мы пишем содержание нового окна из окна старого (родителя), то в качестве указателя на объект используем значение переменной myWin.
Чтобы увести фокус из определенного окна в правом верхнем углу окна.
используется для создания нового потока вычислений, исполнение которого откладывается на время (в миллисекундах), указанное вторым аргументом
idt = setTimeout("JavaScript_код",Time);
Типичное применение этой функции - организация периодического изменения свойств объектов. Например, можно запустить часы в поле формы:
<HTML><HEAD><SCRIPT>
var Chasy_idut=false;
function myclock()
{
if(Chasy_idut)
{
d = new Date();
document.f.c.value =
d.getHours()+':'+
d.getMinutes()+':'+
d.getSeconds();
}
setTimeout("myclock();",500);
}
function FlipFlag()
{
Chasy_idut = !Chasy_idut;
document.f.b.value = (Chasy_idut)?
'Остановить' : 'Запустить';
}
</SCRIPT></HEAD>
<BODY onLoad="myclock();">
<FORM NAME=f>
Текущее время:<INPUT NAME=c size=8>
<INPUT TYPE=button name=b VALUE="Запустить"
onClick="FlipFlag();">
</FORM></BODY></HTML>
Обратите внимание, что поток порождается (т.е. вызывается ) всегда, даже в том случае, когда мы остановили показ часов. Если бы он создавался только при значении переменной Chasy_idut = true, то часы бы просто не запустились, так как в самом начале исполнения скрипта мы установили var Chasy_idut = false. Но даже если бы мы установили в начале var Chasy_idut = true, то часы бы запустились при загрузке страницы, а после остановки поток бы исчез, и при последующем нажатии кнопки "Запустить" часы продолжали бы стоять.
Метод clearTimeout() позволяет уничтожить поток, вызванный методом . Очевидно, что его применение позволяет более эффективно распределять ресурсы вычислительной установки. Для того чтобы использовать этот метод в примере с часами, нам нужно модифицировать функции и форму:
<HTML><HEAD><SCRIPT>
var Chasy_idut=false;
var potok;
function StartClock()
{
d = new Date();
document.f.c.value =
d.getHours()+':'+
d.getMinutes()+':'+
d.getSeconds();
potok = setTimeout('StartClock();',500);
Chasy_idut=true;
}
function StopClock()
{
clearTimeout(potok);
Chasy_idut=false;
}
</SCRIPT></HEAD><BODY>
<FORM NAME=f>
Текущее время:<INPUT NAME=c size=8>
<INPUT TYPE=button VALUE="Запустить" onClick="if(!Chasy_idut) StartClock();">
<INPUT TYPE=button VALUE="Остановить" onClick="if(Chasy_idut) StopClock();">
</FORM></BODY></HTML>
В данном примере для остановки часов используется метод clearTimeout(). При этом, чтобы не порождалось множество потоков, проверяется значение указателя на объект потока.
В предыдущих примерах для того, чтобы поток запускался снова и снова, мы помещали в функцию в качестве последнего оператора . Однако в JavaScript для этих целей имеются специальные методы. Метод выполняет код_JavaScript с периодом раз в time миллисекунд. clearInterval(поток).
Остановимся вкратце на событиях, связанных с объектом window. Обработчики этих событий обычно помещают как атрибут контейнера <BODY>.
Load - событие происходит в момент, когда загрузка документа в данном окне полностью закончилась. Если текущим окном является Load его объекта window происходит, когда в данном фрейме загрузка документа закончилась, независимо от состояния загрузки документов в других <BODY onLoad="alert('Документ полностью загружен.');">
Unload - событие происходит в момент выгрузки страницы из окна. Например, когда пользователь закрывает окно, либо переходит с данной Web-страницы на другую, кликнув ссылку или набрав адрес в адресной строке, либо при изменении адреса страницы (свойства window.location ) скриптом. Например, при уходе пользователя с нашей страницы мы можем позаботиться о его удобстве и закрыть открытое ранее нашим скриптом окно:<BODY onUnload="myWin.close();">
Error - событие происходит при возникновении ошибки в процессе загрузки страницы. Если это событие произошло, можно, например, вывести сообщение пользователю с помощью alert () или попытаться перезагрузить страницу с помощью window.location .reload (). В следующем примере мы назначаем обработчиком события Error функцию ff(), которая будет выдавать сообщение. В тексте программы мы допустили ошибку: слово Alert написано с заглавной буквы (помните, что в JavaScript это недопустимо?). Поэтому при открытии этого примера возникнет ошибка и пользователь получит об этом "дружественное" сообщение.<SCRIPT>
function ff()
{ alert('Произошла ошибка. Свяжитесь с Web-мастером.'); }
window.onerror = ff;
Alert('Привет');
</SCRIPT>
Focus - событие происходит в момент, когда окну передается фокус. Например, когда пользователь "раскрывает" свернутое ранее окно, либо (в Windows) выбирает это окно браузера с помощью Alt+window.focus (). Пример использования:<BODY onFocus="alert('Спасибо, что снова вернулись!');">
Blur - событие, противоположное предыдущему, происходит в момент, когда данное окно теряет фокус. Это может произойти в результате действий пользователя либо window.blur ().Resize - событие происходит при изменении размеров окна пользователем либо сценарием.window. В следующем примере мы открываем окно с идентификатором , заводим в нем t и затем пользуемся ею в окне-родителе, ссылаясь на нее как :
<HTML><HEAD>
<SCRIPT>
wid = window.open('','','width=750,height=100,status=yes');
wid.document.open(); R = wid.document.write;
R('<HTML><HEAD><SCRIPT>var t;<\/SCRIPT></HEAD>');
R('<BODY><H1>Новое окно</H1></BODY></HTML>');
wid.document.close();
</SCRIPT>
</HEAD>
<BODY>
<A HREF="javascript:
wid.t=window.prompt('Новое состояние:','');
wid.document.write(wid.t); wid.focus(); void(0);"
>Изменим значение переменной t в новом окне</A>
</BODY></HTML>
Обратите внимание на нюанс: внутри скрипта мы написали <\/SCRIPT>. Комбинация " \/ " выдает на выходе " / ". Сделали мы это для того, чтобы браузер (точнее, его HTML-</SCRIPT> как завершающий тэг нашего (внешнего) скрипта. Подробнее этот аспект обсуждался во вводной лекции. Также обратите внимание на R, который мы дали методу , чтобы иметь возможность кратко вызывать его как R(...).
Аналогичным образом (с приставкой , указывающей на объект окна) можно обращаться ко всем элементам, находящимся в открытом нами окне, например, к формам. В качестве примера рассмотрим изменение поля ввода в окне-потомке из окна-предка. Создадим дочернее окно с помощью функции okno(), в нем создадим форму, а затем обратимся к полю этой формы из окна-предка:
<HTML>
<HEAD>
<SCRIPT>
var wid; // Объявляем глобальную переменную
function okno()
{
wid = window.open('','okoshko','width=500,height=200');
wid.document.open(); R = wid.document.write;
R('<HTML><BODY><H1>Меняем текст в окне-потомке:</H1>');
R('<FORM NAME=f><INPUT SIZE=40 NAME=t VALUE=Текст>');
R('</FORM></BODY></HTML>');
wid.document.close();
}
</SCRIPT>
</HEAD>
<BODY>
<INPUT TYPE=button VALUE="Открыть окно примера" onClick="okno()">
<INPUT TYPE=button VALUE="Написать текущее время в поле ввода"
onClick="window.wid.document.f.t.value=new Date();
window.wid.focus();">
</BODY>
</HTML>
Открывая окно- указатель на окно: . Теперь мы можем использовать как идентификатор Window. window. в нашем случае обязателен, поскольку при нажатии на кнопку "Написать текущее время в
Переменная должна быть window, поэтому мы обращаемся к ней в обработчике посредством window.. Если бы мы поместили ее внутри описания функции okno(), написав var , то мы не смогли бы к ней обратиться из обработчика события , находящегося вне функции okno().
Объект document является важнейшим свойством объекта window (т.е. полностью к нему нужно обращаться как window.document ). Все элементы HTML-разметки, присутствующие на web-странице - текст, абзацы, гиперссылки, картинки, списки, таблицы, формы и т.д. - являются свойствами объекта document. Можно сказать, что технология document (не считая работы с окнами и
| Свойства | Методы | События |
|---|---|---|
URL domain title lastModified referrer cookie linkColor alinkColor vlinkColor |
open() close() write() writeln() getSelection() getElementById() getElementsByName() getElementsByTagName() |
Load Unload Click DblClick MouseDown MouseUp KeyDown KeyUp KeyPress |
Помимо перечисленных в этой таблице свойств, объект document имеет свойства, являющиеся коллекциями (форм, картинок, ссылок и т.п.); таблица 3.1 предыдущей лекции содержит их описание. Кроме того, можно формировать требуемые коллекции "на лету" с помощью указанных выше методов. Так, document.getElementsByTagName('P') есть коллекция всех HTML-элементов (точнее, соответствующих им объектов) вида <P>, т.е. абзацев. Аналогично, document.getElementsByName('important') выдаст NAME="important". Наконец, document. выдаст тот HTML-элемент (если их несколько, то первый), у которого был задан атрибут ID="id5".
С одним методом мы уже часто работали: document.write() - он пишет в текущий HTML-документ. Его модификация document.writeln() делает то же самое, но дополнительно добавляет в конце window.open(), то перед записью в него нужно открыть поток на запись с помощью метода document.open(), а по окончании записи закрыть поток методом document.close(). После выполнения последнего действия произойдет событие (и вызовется соответствующий обработчик события onLoad ) у документа, а затем у окна.
События объекта document аналогичны одноименным событиям объекта window (только у document они происходят раньше), либо их смысл понятен из их названия, поэтому мы не будем детально их разбирать.
Остановимся вкратце на свойствах объекта document. Свойства linkColor, alinkColor и vlinkColor задают цвет гиперссылок - непосещенных, активных и посещенных, соответственно. Свойство URL хранит адрес текущего документа (т.е. строковый window., если страница состоит из единственного документа, а не является набором выдает домен (оно аналогично window. ). Свойство title выдает <TITLE> ), lastModified указывает на дату и время последней модификации файла, в котором содержится данный HTML-документ (без учета времени модификации referrer выдает адрес страницы, с которой пользователь пришел на данную web-страницу, кликнув по гиперссылке. Наконец, свойству посвящен целый раздел в лекции 8.
Если окно имеет фреймовую структуру (т.е. вместо контейнера <BODY> в нем присутствует контейнер < со вложенными в него контейнерами < и быть может другими контейнерами < ), то объект window соответствует внешнему контейнеру <, а с каждым вложенным контейнером < ассоциирован свой собственный объект класса Window.
Каждому окну или NAME контейнера , либо вторым аргументом метода window.open(). Используется оно в качестве значения атрибута контейнеров A и FORM, чтобы открыть ссылку или отобразить результаты работы формы в определенном окне или фрейме. Есть несколько зарезервированных имен окон: _self (имя текущего окна или _blank (новое окно), _parent (окно-родитель для данного _top (самый старший предок данного
У каждого объекта класса Window, будь то окно или window ; кроме того, на него же ссылается свойство self объекта window (а также свойство window объекта window - есть и такое!). Ссылку на объект окна, открываемого методом window.open(), выдает сам этот метод. Ссылка на объект-NAME контейнера . Наконец, у объектов-window. ) и на окно браузера, частью которого является данный window.top ).
Таким образом, для того, чтобы правильно обращаться к нужным фреймам, нам нужно знать лишь их
Рассмотрим сначала простой пример. Разделим экран на две вертикальные колонки:
<HTML>
<HEAD>
<TITLE>Левый и правый</TITLE>
</HEAD>
<FRAMESET COLS="50%,*">
<FRAME NAME=leftframe SRC=left.htm>
<FRAME NAME=rightframe SRC=right.htm>
</FRAMESET>
</HTML>
(рис 4.3) Окно с двумя вертикальными фреймамиИерархия
windowleftframerightframeИз основного окна (из скрипта, который можно было поместить в контейнер <HEAD> ) обратиться к левому window.leftframe, к правому - window.rightframe. Из каждого window. либо window.top (что в данном случае равносильно) или даже просто и top (так как приставку window можно опускать). Наконец, из левого или top.rightframe.
<HTML>
<HEAD>
<TITLE>Левый, верх и низ</TITLE>
</HEAD>
<FRAMESET COLS="50%,*">
<FRAME NAME=leftframe SRC=left.htm>
<FRAMESET ROWS="50%,*">
<FRAME NAME=topframe SRC=top.htm>
<FRAME NAME=botframe SRC=bottom.htm>
</FRAMESET>
</FRAMESET>
</HTML>
(рис 4.4) Правый фрейм разбит на два по горизонталиrightframe теперь не существует. Более того, все три
windowleftframetopframebotframeСледовательно, мы можем поместить в контейнер <HEAD> следующий скрипт, устанавливающий
<SCRIPT>
window.onload=f;
function f()
{
window.leftframe.document.bgColor='blue';
window.topframe.document.bgColor='red';
window.botframe.document.bgColor='green';
}
</SCRIPT>
Для того чтобы rightframe все же появился в иерархии и ему подчинялись два правых rightframe мы должны загрузить отдельный фреймовый документ.
| Основной документ | Документ в правом фрейме ( right. ) |
|---|---|
<HTML> <HEAD> </HEAD> <FRAMESET COLS="50%,*"> <FRAME NAME=leftframe SRC=left.htm> <FRAME NAME=rightframe SRC=right.htm> </FRAMESET> </HTML> |
<HTML>
<HEAD>
</HEAD>
<FRAMESET ROWS="50%,*">
<FRAME NAME=topframe SRC=top.htm>
<FRAME NAME=botframe SRC=bottom.htm>
</FRAMESET>
</HTML>
|
В этом случае иерархия
windowleftframerightframetopframebotframeТеперь чтобы из главного окна обратиться ко всем трем фреймам и установить в них те же
window.leftframe.document.bgColor='blue'; window.rightframe.topframe.document.bgColor='red'; window.rightframe.botframe.document.bgColor='green';
Таким образом, визуально на Web-странице мы получили тот же результат, что и с тремя rightframe в отдельном файле.
Выше мы обращались к , которая является свойством объекта window.
В качестве иллюстрации предположим, что в примере из двух SRC ) третьего изображения с помощью скрипта, находящегося в левом фрейме. Правый
top.frames[1].document.images[2].src = 'pic.gif'; top.frames['rightframe'].document.images[2].src = 'pic.gif'; top.frames.rightframe.document.images[2].src = 'pic.gif'; top.rightframe.document.images[2].src = 'pic.gif';
Обычной задачей при разработке типового Web-узла является загрузка результатов исполнения формы. Сложнее, если результат работы должен быть загружен в разные фреймы (например, в зависимости от выбранной кнопки).
Применим полученные нами знания для решения этой задачи. Сначала заготовим следующие файлы. Основной файл, например, index., содержит левый left. содержит форму, в которой пользователю предоставляется возможность выбрать верхний или нижний right. содержит простой текст; он будет загружаться в верхний или нижний
| Основной файл с тремя |
Файл с формой left. в левом фрейме |
Файл right. |
|---|---|---|
<HTML>
<HEAD>
<TITLE>Три фрейма</TITLE>
</HEAD>
<FRAMESET COLS="50%,*">
<FRAME NAME=leftframe
SRC=left.htm>
<FRAMESET ROWS="50%,*">
<FRAME NAME=topframe SRC="">
<FRAME NAME=botframe SRC="">
</FRAMESET>
</FRAMESET>
</HTML>
|
<HTML>
<HEAD>
<SCRIPT SRC="loadframe.js"></SCRIPT>
</HEAD>
<BODY>
<FORM METHOD=post ACTION=right.htm
NAME=f onSubmit="return load();">
<SELECT NAME=s>
<OPTION>верхний</OPTION>
<OPTION>нижний</OPTION>
</SELECT>
<INPUT TYPE=submit VALUE="Загрузить">
</FORM>
</BODY>
</HTML>
|
<HTML> <BODY> Этот документ мы загружаем при выборе фрейма из списка </BODY> </HTML> |
Для того, чтобы пример заработал, остается в файле loadframe.js описать функцию . Функция должна делать так, чтобы в зависимости от выбора пользователем значения селектора "верхний" или "нижний" файл right. загружался бы либо в правый верхний, либо в правый нижний left. у формы не был указан целевой ).
Нашу задачу динамического выбора , с него мы и начнем (открыть).
function load()
{
if(document.f.s.selectedIndex==0)
{
document.f.target = "topframe";
top.frames[2].document.open();
top.frames[2].document.close();
}
else
{
document.f.target = "botframe";
top.frames[1].document.open();
top.frames[1].document.close();
}
return true;
}
Функция всегда возвращает true, а поскольку она вызывается из обработчика события onSubmit, это означает, что всегда будет происходить отправка формы (событие Submit ), т.е. загрузка страницы right., указанной в атрибуте данной формы. Обратите внимание также на следующие строки в функции :
top.frames[1].document.open(); top.frames[1].document.close();
Смысл их таков: когда пользователь выбирает значение верхний или нижний в форме, то файл right. загружается в соответствующий ...document.open(), при этом всё его содержимое очищается) и закрывается (методом ...document.close() ), тем самым
Теперь рассмотрим второй подход - открытие окна с именем, совпадающим с именем topframe или botframe. Его идея состоит в том, что при попытке открыть окно с именем существующего окна новое окно не открывается, а используется уже открытое.
function load()
{
if(document.f.s.selectedIndex==0)
{
window.open("right.htm","topframe");
top.frames[2].document.open();
top.frames[2].document.close();
}
else
{
window.open("right.htm","botframe");
top.frames[1].document.open();
top.frames[1].document.close();
}
return false;
}
В этом подходе функция всегда возвращает false. Это необходимо, чтобы отменить window.open(), в right., уже нет надобности.
Window - это самый старший класс в иерархии объектов JavaScript. Объект window, относящийся к текущему окну (т.е. в котором выполняется скрипт), является объектом класса Window. содержится в классе Window, т.е. каждый Window.
О window. Объект window создается только в момент открытия окна. Все остальные объекты, которые порождаются при загрузке страницы, есть свойства объекта window. Более того, все window. Таким образом, у объекта window могут быть разные свойства при загрузке разных страниц. Кроме того, в разных браузерах свойства объектов и поведение объектов и браузера при window:
| Свойства | Методы | События |
|---|---|---|
status defaultStatus location history navigator document frames[] opener parent self top |
open() close() focus() blur() alert() confirm() prompt() setTimeout() setInterval() clearTimeout() clearInterval() |
Load Unload Focus Blur Resize Error |
Поскольку объект window является самым старшим, то в большинстве случаев при обращении к его свойствам и методам приставку " window." можно опускать (разумеется, в случае, если вы хотите обратиться к свойству или методу текущего окна, где работает скрипт; если же это другое окно, то необходимо указать его идентификатор). Так, например, можно писать вместо window., или вместо window.. Исключениями из этого правила являются вызовы методов open() и close(), у которых нужно указывать , self, и top будут рассмотрены в разделе, посвященном фреймам. Свойство opener будет рассмотрено при описании метода window.close().
Поле статуса - это первое, что начали использовать авторы HTML-страниц из арсенала JavaScript. Калькуляторы, игры, математические вычисления и другие элементы выглядели слишком искусственно. На их фоне бегущая строка в поле статуса была изюминкой, которая могла действительно привлечь внимание пользователей к Web-узлу. Постепенно ее популярность сошла на нет. Бегущие строки стали редкостью, но программирование поля статуса встречается на многих Web-узлах.
(рис 4.1) Поле статусаПолем статуса (
window.status - значение поля статуса;window.defaultStatus - значение поля статуса по умолчанию.Значение свойства можно изменить - и оно тут же будет отображено в поле статуса. Свойство defaultStatus тоже можно менять - и сразу по его изменении оно отображается в поле статуса.
Разница между этими двумя свойствами заключается в их поведении: если свойству присвоить пустую строку: window., то в поле статуса автоматически будет отображено значение defaultStatus. Обратного же не происходит: при присвоении пустой строки свойству defaultStatus оно и отобразится в поле статуса, независимо от значения свойства . Следует отметить, что реакция браузеров на описываемые ниже действия со свойствами и defaultStatus может быть разной в различных браузерах.
Свойство связано с отображением сообщений о событиях, отличных от простой загрузки страницы.
Например, в onMouseOver помещает в поле статуса значение URL, указанное в атрибуте этой ссылки (при этом никак не меняя значения свойств и defaultStatus ). При попадании же курсора мыши на область, свободную от ссылок, обработчик onMouseOut возвращает в поле статуса значение defaultStatus, при условии, что оно не есть пустая строка (опять же никак не меняя значений обоих свойств). Мы можем изменить это поведение, например, как в следующем примере:
<A onMouseOver="window.status='Мышь над ссылкой';return true;"
onMouseOut="window.status='Мышь увели со ссылки';"
HREF="http://site.com/">Наведите мышь на ссылку и следите за полем статуса</A>
Обратите внимание на оператор return true в конце обработчика событий onMouseOver. Он необходим для того, чтобы , onKeyDown, onKeyPress, onMouseDown, onMouseUp, onSubmit, onReset ), с той лишь разницей, что для перечисленных обработчиков отмена выполняется оператором return false.
Для обработчика onMouseOut такого способа отменить действие по умолчанию не существует (к сожалению). Но в данном конкретном случае это не требуется - как уже было сказано, при уводе курсора со ссылки в поле статуса восстанавливается значение defaultStatus только в случае, если это значение не есть пустая строка. Но в нашем случае (по умолчанию при загрузке страницы в IE) оно равно именно пустой строке. Поэтому, уводя курсор с нашей ссылки, мы продолжаем видеть в поле статуса строку "Мышь увели со ссылки". Ситуация изменится в следующем примере, когда мы предварительно зададим свое (непустое) значение defaultStatus.
Свойство defaultStatus определяет текст, отображаемый в поле статуса, когда никаких событий не происходит. Дополним предыдущий пример изменением этого свойства в момент окончания загрузки документа, т.е. в обработчике onLoad:
<BODY onLoad="window.defaultStatus='Значение по умолчанию';">
<A onMouseOver="window.status='Мышь над ссылкой';return true;"
onMouseOut="window.status='Мышь увели со ссылки'; alert('Ждем');"
HREF="http://site.com/">Наведите мышь на ссылку и следите за полем статуса</A>
</BODY>
Сразу после загрузки документа в поле статуса будет "Значение по умолчанию". При наведении указателя мыши на ссылку в поле статуса появится надпись "Мышь над ссылкой", при этом URL ссылки ( http://site.com/ ) в поле статуса не появится, т.к. мы подавили его вывод оператором return true.
При убирании указателя мыши со ссылки пользователь бы не успел увидеть строку "Мышь увели со ссылки", поскольку действие по умолчанию (вывод значения defaultStatus в поле статуса) не подавлено (и не может быть подавлено - у обработчика onMouseOut нет такой возможности). Однако мы ввели оператор вывода (он рассматривается ниже) - и теперь пользователь будет видеть в поле статуса строку "Мышь увели со ссылки" до тех пор, пока не нажмет OK в этом окне.
Поле адреса в браузере обычно располагается в верхней части окна и отображает URL загруженного документа. Если пользователь хочет вручную перейти к какой-либо странице (набрать ее URL), он делает это в поле адреса.
(рис 4.2) Поле адреса (location)Свойство объекта window само является объектом класса . Класс , в свою очередь, является URL, к которому относятся также объекты классов и Link. Объекты наследуют все свойства объектов URL, что позволяет получить доступ к любой части URL мы расскажем в лекции 6.
В целях совместимости с прежними версиями JavaScript, в языке поддерживается также свойство window.document., которое в настоящее время полностью дублирует свойство window. со всеми его свойствами и методами. Рассмотрим теперь свойства и методы объекта window. (событий, связанных с этим объектом, нет).
Их проще продемонстрировать на примере. Предположим, что браузер отображает страницу, расположенную по адресу:
http://www.site.ru:80/dir/page.cgi?product=phoneid=3#mark
Тогда свойства объекта примут следующие значения:
window.location.href = "http://www.site.ru:80/dir/page.cgi?product=phoneid=3#mark" 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=phoneid=3" window.location.hash = "#mark"
Как уже говорилось в предыдущих лекциях, к свойствам объектов можно обращаться как с помощью window..
Методы объекта предназначены для управления загрузкой и перезагрузкой страницы. Это управление заключается в том, что можно либо перезагрузить текущий документ (метод ), либо загрузить новый (метод ).
window.location.reload(true);
Метод полностью моделирует поведение браузера при нажатии на кнопку true, то браузер проверит время последней модификации документа и загрузит его либо из false, то браузер перезагрузит текущий документ с сервера, несмотря ни на что. Такое поведение соответствует одновременному нажатию клавиши Shift и кнопки браузера
Используя объект , перейти на новую страницу можно двумя способами:
window.location.href="http://www.newsite.ru/";
window.location.replace("http://www.newsite.ru/");
Разница между ними - в отображении этого действия в истории посещений страниц window.. В первом случае в историю посещений добавится новый элемент, содержащий адрес " http://www.newsite.ru/ ", так что при желании можно будет нажать кнопку Back на панели браузера, чтобы вернуться к прежней странице. Во втором случае новый адрес " http://www.newsite.ru/ " заместит прежний в истории посещений, и вернуться к прежней странице нажатием кнопки Back уже будет невозможно.
История посещений страниц World Wide Web позволяет пользователю вернуться к странице, которую он просматривал ранее в данном окне браузера. История посещений в JavaScript трансформируется в объект window.. Этот объект указывает на массив URL-страниц, которые пользователь посещал и которые он может получить, выбрав из меню браузера режим Go. Методы объекта позволяют загружать страницы, используя URL из этого массива.
Чтобы не возникло проблем с безопасностью браузера, путешествовать по
<FORM><INPUT TYPE="button" VALUE="Назад" onClick="history.back()"></FORM>
Данный код отображает кнопку "Назад", нажав на которую, мы вернемся на предыдущую страницу. Аналогичным образом действует метод , перенося нас на следующую посещенную страницу.
Существует также метод go(), имеющий целочисленный аргумент и позволяющий перескакивать на несколько шагов вперед или назад по истории посещений. Например, перенесет нас на 3 шага назад в истории просмотра. При этом методы back() и равносильны методу go() с аргументами -1 и 1, соответственно. Вызов приведет к перезагрузке текущей страницы.
Часто возникает задача настройки страницы на конкретную программу просмотра (браузер). При этом возможны два варианта: определение типа браузера на стороне сервера, либо на стороне клиента. Для последнего варианта в арсенале объектов JavaScript существует объект window.. Важнейшие из свойств этого объекта перечислены ниже.
| Свойство | Описание |
|---|---|
userAgent |
Основная информация о браузере. Передается серверу в HTTP-заголовке при открытии пользователем страниц |
appName |
Название браузера |
appCodeName |
Кодовое название браузера |
appVersion |
Данные о версии браузера и совместимости |
Рассмотрим простой пример определения типа программы просмотра:
<FORM><INPUT TYPE=button VALUE="Тип навигатора" onClick="alert(window.navigator.userAgent);"></FORM>
При нажатии на кнопку отображается . Если это значение разобрать по компонентам, то может получиться, например, следующее:
navigator.userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1)" navigator.appName = "Microsoft Internet Explorer" navigator.appCodeName = "Mozilla" navigator.appVersion = "4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1)"
У объекта есть еще несколько интересных с точки зрения программирования применений. Например, чтобы проверить, поддерживает ли браузер клиента язык Java, достаточно вызвать метод , возвращающий значение true, если поддерживает, и false в противном случае.
Можно проверить, какие форматы графических файлов поддерживает браузер, воспользовавшись свойством (оно представляет собой массив всех типов
<SCRIPT>
if(navigator.mimeTypes['image/gif']!=null)
document.write('Ваш браузер поддерживает GIF<BR>');
if(navigator.mimeTypes['image/tiff']==null)
document.write('Ваш браузер не поддерживает TIFF');
</SCRIPT>
К сожалению, такая проверка не позволяет определить наличие возможности автоматической подгрузки графики.
Что можно сделать с окном? Открыть (создать), закрыть (удалить), положить его поверх всех других открытых окон (передать фокус). Кроме того, можно управлять свойствами окна и свойствами подчиненных ему объектов. Сосредоточимся на простых и наиболее популярных
Метод позволяет выдать
<A HREF="javascript:window.alert('Внимание')">
Повторите запрос!</A>
Нужно лишь иметь в виду, что сообщения выводятся
Метод позволяет задать пользователю вопрос, на который тот может ответить либо положительно (нажав кнопку "OK"), либо отрицательно (нажав кнопку "Отмена" или " возвращает значение true либо false. Пример:
<FORM NAME=f>
<INPUT TYPE=button NAME=b VALUE="Нажмите эту кнопку"
onClick="if(window.confirm('Вы знаете JavaScript?'))
document.f.b.value='Да. Спросить еще?';
else document.f.b.value='Нет. Спросить еще?';">
</FORM>
Все ограничения для сообщений на русском языке, которые были описаны для метода , справедливы и для метода .
Метод prompt() позволяет принять от пользователя cтроку текста. Синтаксис его таков:
prompt("Строка вопроса","Строка ответа по умолчанию")
Когда пользователь введет свой ответ (либо оставит неизменным ответ по умолчанию) и нажмет кнопку OK, метод prompt() возвратит полученную строчку в качестве значения, которое можно далее присвоить любой переменной и потом разбирать ее в JavaScript-программе.
<FORM NAME=f>
<INPUT TYPE=button VALUE="Открыть окно ввода"
onClick="document.f.e.value=
window.prompt('Введите сообщение','Сюда');">
<INPUT SIZE=30 NAME=e>
</FORM>
предназначен для создания новых
myWin = window.open("URL","имя_окна","параметр=значение,параметр=значение,...", заменить);
Первый аргумент задает адрес страницы, загружаемой в новое окно (можно оставить пустую строку, тогда окно останется пустым). Второй аргумент задает контейнеров <A> и <FORM>. В качестве значений допустимы также зарезервированные имена _blank, _parent, _self, _top, смысл которых такой же, как у аналогичных значений атрибута . Если имя_окна совпадает с именем уже существующего окна (или myWin будут применяться к этому окну (или
Третий аргумент есть не содержащая пробелов строка, представляющая собой список параметров и их значений, перечисленных через запятую. Указание каждого из параметров необязательно, однако значения по умолчанию могут зависеть от браузера, поэтому всегда указывайте явно те параметры, на которые рассчитываете. Возможные параметры перечислены в таблице 4.3.
Вместо значений yes и no можно использовать 1 и 0.
Последний аргумент " заменить " является необязательным, принимает значения true и false и означает: следует ли новый URL добавить в в качестве нового элемента или заменить им последний элемент .
Метод window.open() возвращает ссылку на вновь открытое окно, т.е. объект класса Window. Его можно присвоить переменной (что мы и сделали выше), с тем чтобы потом можно было управлять открытым окном (писать в него, читать из него, передавать и убирать фокус, закрывать).
| Параметр | Значения | Описание |
|---|---|---|
width |
число | Ширина окна в пикселах (не менее 100 ) |
height |
число | Высота окна в пикселах (не менее 100 ) |
left |
число | Расстояние от левого края экрана до левой границы окна в пикселах |
top |
число | Расстояние от верхнего края экрана до |
directories |
yes / no |
Наличие у окна панели папок ( |
|
yes / no |
Наличие у окна поля адреса |
menubar |
yes / no |
Наличие у окна панели меню |
|
yes / no |
Сможет ли пользователь менять размер окна |
scrollbars |
yes / no |
Наличие у окна |
|
yes / no |
Наличие у окна поля статуса |
|
yes / no |
Наличие у окна панели инструментов |
Приведем два примера открытия нового окна:
<FORM>
<INPUT TYPE=button VALUE="Простое окно"
onClick="window.open('', 'test1',
'directories=no,height=200,location=no,'+
'menubar=no,resizable=no,scrollbars=no,'+
'status=no,toolbar=no,width=200');">
<INPUT TYPE=button VALUE="Сложное окно"
onClick="window.open('', 'test2',
'directories=yes,height=200,location=yes,'+
'menubar=yes,resizable=yes,scrollbars=yes,'+
'status=yes,toolbar=yes,width=200');">
</FORM>
При нажатии кнопки "Простое окно" получаем окно со следующими параметрами:
directories=no - окно без панели папокheight=200 - высота 200 pxlocation =no - поле адреса отсутствуетmenubar=no - без менюresizable =no - размер окна изменять нельзяscrollbars=no - status =no - статусная строка отсутствуетtoolbar =no - системные кнопки браузера отсутствуютwidth=200 - ширина 200 pxПри нажатии кнопки "Сложное окно" получаем окно, где:
directories=yes - окно с панелью папокheight=200 - высота 200 pxlocation =yes - поле адреса естьmenubar=yes - меню естьresizable =yes - размер изменять можноscrollbars=yes - есть status =yes - статусная строка естьtoolbar =yes - системные кнопки браузера естьwidth=200 - ширина 200 px позволяет закрыть окно
window.close(); self.close();
Если мы открыли окно с помощью метода window.open(), то из скрипта, работающего в новом окне, сослаться на окно-родитель можно с помощью window.opener (обратите внимание, здесь window ссылается на объект нового, созданного окна, т.к. оно использовано в скрипте, работающем в новом окне). Поэтому, если необходимо закрыть родительское окно, т.е. окно, из которого было открыто текущее, то:
window.opener.close();
Если необходимо закрыть произвольное окно, то тогда сначала нужно получить его идентификатор:
id=window.open(); ... id.close();
Как видно из последнего примера, закрывают окно не по имени (значение атрибута тут ни при чем), а используют указатель на объект.
Метод применяется для передачи фокуса в окно, с которым он использовался. Передача фокуса полезна как при открытии окна, так и при его закрытии, не говоря уже о случаях, когда нужно выбирать окна. Рассмотрим пример.
Открываем окно и, не закрывая его, снова откроем окно с таким же именем, но с другим текстом. Новое окно не появилось поверх основного окна, так как фокус ему не был передан. Теперь повторим открытие окна, но уже с передачей фокуса:
<HTML>
<HEAD>
<SCRIPT>
function myfocus(a)
{
myWin = window.open('','example','width=300,height=200');
// открываем окно и заводим переменную с указателем на него.
// Если окно с именем 'example' существует, то новое окно не создается,
// а открывается поток для записи в имеющееся окно с именем 'example'
if(a==1)
{
myWin.document.open(); //открываем поток ввода в уже созданное окно
myWin.document.write('<H1>Открыли окно в первый раз'); //Пишем в этот поток
}
if(a==2)
{
myWin.document.open();
myWin.document.write('<H1>Открыли окно во второй раз');
}
if(a==3)
{
myWin.focus(); // передаем фокус, а затем выполняем те же действия,
// что и в предыдущем случае
myWin.document.open();
myWin.document.write('<H1>Открыли окно в третий раз');
}
myWin.document.write('</H1>');
myWin.document.close();
}
</SCRIPT>
</HEAD>
<BODY>
<a href="javascript:myfocus(1);">Откроем окно и напишем в него что-то</a>,
<BR><BR>
<a href="javascript:myfocus(2);">напишем в него же что-то другое, но фокус не передадим</a>,
<BR><BR>
<a href="javascript:myfocus(3);">опять что-то напишем в него, но сперва передав ему фокус</a>.
</BODY>
</HTML>
Поскольку мы пишем содержание нового окна из окна старого (родителя), то в качестве указателя на объект используем значение переменной myWin.
Чтобы увести фокус из определенного окна в правом верхнем углу окна.
используется для создания нового потока вычислений, исполнение которого откладывается на время (в миллисекундах), указанное вторым аргументом
idt = setTimeout("JavaScript_код",Time);
Типичное применение этой функции - организация периодического изменения свойств объектов. Например, можно запустить часы в поле формы:
<HTML><HEAD><SCRIPT>
var Chasy_idut=false;
function myclock()
{
if(Chasy_idut)
{
d = new Date();
document.f.c.value =
d.getHours()+':'+
d.getMinutes()+':'+
d.getSeconds();
}
setTimeout("myclock();",500);
}
function FlipFlag()
{
Chasy_idut = !Chasy_idut;
document.f.b.value = (Chasy_idut)?
'Остановить' : 'Запустить';
}
</SCRIPT></HEAD>
<BODY onLoad="myclock();">
<FORM NAME=f>
Текущее время:<INPUT NAME=c size=8>
<INPUT TYPE=button name=b VALUE="Запустить"
onClick="FlipFlag();">
</FORM></BODY></HTML>
Обратите внимание, что поток порождается (т.е. вызывается ) всегда, даже в том случае, когда мы остановили показ часов. Если бы он создавался только при значении переменной Chasy_idut = true, то часы бы просто не запустились, так как в самом начале исполнения скрипта мы установили var Chasy_idut = false. Но даже если бы мы установили в начале var Chasy_idut = true, то часы бы запустились при загрузке страницы, а после остановки поток бы исчез, и при последующем нажатии кнопки "Запустить" часы продолжали бы стоять.
Метод clearTimeout() позволяет уничтожить поток, вызванный методом . Очевидно, что его применение позволяет более эффективно распределять ресурсы вычислительной установки. Для того чтобы использовать этот метод в примере с часами, нам нужно модифицировать функции и форму:
<HTML><HEAD><SCRIPT>
var Chasy_idut=false;
var potok;
function StartClock()
{
d = new Date();
document.f.c.value =
d.getHours()+':'+
d.getMinutes()+':'+
d.getSeconds();
potok = setTimeout('StartClock();',500);
Chasy_idut=true;
}
function StopClock()
{
clearTimeout(potok);
Chasy_idut=false;
}
</SCRIPT></HEAD><BODY>
<FORM NAME=f>
Текущее время:<INPUT NAME=c size=8>
<INPUT TYPE=button VALUE="Запустить" onClick="if(!Chasy_idut) StartClock();">
<INPUT TYPE=button VALUE="Остановить" onClick="if(Chasy_idut) StopClock();">
</FORM></BODY></HTML>
В данном примере для остановки часов используется метод clearTimeout(). При этом, чтобы не порождалось множество потоков, проверяется значение указателя на объект потока.
В предыдущих примерах для того, чтобы поток запускался снова и снова, мы помещали в функцию в качестве последнего оператора . Однако в JavaScript для этих целей имеются специальные методы. Метод выполняет код_JavaScript с периодом раз в time миллисекунд. clearInterval(поток).
Остановимся вкратце на событиях, связанных с объектом window. Обработчики этих событий обычно помещают как атрибут контейнера <BODY>.
Load - событие происходит в момент, когда загрузка документа в данном окне полностью закончилась. Если текущим окном является Load его объекта window происходит, когда в данном фрейме загрузка документа закончилась, независимо от состояния загрузки документов в других <BODY onLoad="alert('Документ полностью загружен.');">
Unload - событие происходит в момент выгрузки страницы из окна. Например, когда пользователь закрывает окно, либо переходит с данной Web-страницы на другую, кликнув ссылку или набрав адрес в адресной строке, либо при изменении адреса страницы (свойства window.location ) скриптом. Например, при уходе пользователя с нашей страницы мы можем позаботиться о его удобстве и закрыть открытое ранее нашим скриптом окно:<BODY onUnload="myWin.close();">
Error - событие происходит при возникновении ошибки в процессе загрузки страницы. Если это событие произошло, можно, например, вывести сообщение пользователю с помощью alert () или попытаться перезагрузить страницу с помощью window.location .reload (). В следующем примере мы назначаем обработчиком события Error функцию ff(), которая будет выдавать сообщение. В тексте программы мы допустили ошибку: слово Alert написано с заглавной буквы (помните, что в JavaScript это недопустимо?). Поэтому при открытии этого примера возникнет ошибка и пользователь получит об этом "дружественное" сообщение.<SCRIPT>
function ff()
{ alert('Произошла ошибка. Свяжитесь с Web-мастером.'); }
window.onerror = ff;
Alert('Привет');
</SCRIPT>
Focus - событие происходит в момент, когда окну передается фокус. Например, когда пользователь "раскрывает" свернутое ранее окно, либо (в Windows) выбирает это окно браузера с помощью Alt+window.focus (). Пример использования:<BODY onFocus="alert('Спасибо, что снова вернулись!');">
Blur - событие, противоположное предыдущему, происходит в момент, когда данное окно теряет фокус. Это может произойти в результате действий пользователя либо window.blur ().Resize - событие происходит при изменении размеров окна пользователем либо сценарием.window. В следующем примере мы открываем окно с идентификатором , заводим в нем t и затем пользуемся ею в окне-родителе, ссылаясь на нее как :
<HTML><HEAD>
<SCRIPT>
wid = window.open('','','width=750,height=100,status=yes');
wid.document.open(); R = wid.document.write;
R('<HTML><HEAD><SCRIPT>var t;<\/SCRIPT></HEAD>');
R('<BODY><H1>Новое окно</H1></BODY></HTML>');
wid.document.close();
</SCRIPT>
</HEAD>
<BODY>
<A HREF="javascript:
wid.t=window.prompt('Новое состояние:','');
wid.document.write(wid.t); wid.focus(); void(0);"
>Изменим значение переменной t в новом окне</A>
</BODY></HTML>
Обратите внимание на нюанс: внутри скрипта мы написали <\/SCRIPT>. Комбинация " \/ " выдает на выходе " / ". Сделали мы это для того, чтобы браузер (точнее, его HTML-</SCRIPT> как завершающий тэг нашего (внешнего) скрипта. Подробнее этот аспект обсуждался во вводной лекции. Также обратите внимание на R, который мы дали методу , чтобы иметь возможность кратко вызывать его как R(...).
Аналогичным образом (с приставкой , указывающей на объект окна) можно обращаться ко всем элементам, находящимся в открытом нами окне, например, к формам. В качестве примера рассмотрим изменение поля ввода в окне-потомке из окна-предка. Создадим дочернее окно с помощью функции okno(), в нем создадим форму, а затем обратимся к полю этой формы из окна-предка:
<HTML>
<HEAD>
<SCRIPT>
var wid; // Объявляем глобальную переменную
function okno()
{
wid = window.open('','okoshko','width=500,height=200');
wid.document.open(); R = wid.document.write;
R('<HTML><BODY><H1>Меняем текст в окне-потомке:</H1>');
R('<FORM NAME=f><INPUT SIZE=40 NAME=t VALUE=Текст>');
R('</FORM></BODY></HTML>');
wid.document.close();
}
</SCRIPT>
</HEAD>
<BODY>
<INPUT TYPE=button VALUE="Открыть окно примера" onClick="okno()">
<INPUT TYPE=button VALUE="Написать текущее время в поле ввода"
onClick="window.wid.document.f.t.value=new Date();
window.wid.focus();">
</BODY>
</HTML>
Открывая окно- указатель на окно: . Теперь мы можем использовать как идентификатор Window. window. в нашем случае обязателен, поскольку при нажатии на кнопку "Написать текущее время в
Переменная должна быть window, поэтому мы обращаемся к ней в обработчике посредством window.. Если бы мы поместили ее внутри описания функции okno(), написав var , то мы не смогли бы к ней обратиться из обработчика события , находящегося вне функции okno().
Объект document является важнейшим свойством объекта window (т.е. полностью к нему нужно обращаться как window.document ). Все элементы HTML-разметки, присутствующие на web-странице - текст, абзацы, гиперссылки, картинки, списки, таблицы, формы и т.д. - являются свойствами объекта document. Можно сказать, что технология document (не считая работы с окнами и
| Свойства | Методы | События |
|---|---|---|
URL domain title lastModified referrer cookie linkColor alinkColor vlinkColor |
open() close() write() writeln() getSelection() getElementById() getElementsByName() getElementsByTagName() |
Load Unload Click DblClick MouseDown MouseUp KeyDown KeyUp KeyPress |
Помимо перечисленных в этой таблице свойств, объект document имеет свойства, являющиеся коллекциями (форм, картинок, ссылок и т.п.); таблица 3.1 предыдущей лекции содержит их описание. Кроме того, можно формировать требуемые коллекции "на лету" с помощью указанных выше методов. Так, document.getElementsByTagName('P') есть коллекция всех HTML-элементов (точнее, соответствующих им объектов) вида <P>, т.е. абзацев. Аналогично, document.getElementsByName('important') выдаст NAME="important". Наконец, document. выдаст тот HTML-элемент (если их несколько, то первый), у которого был задан атрибут ID="id5".
С одним методом мы уже часто работали: document.write() - он пишет в текущий HTML-документ. Его модификация document.writeln() делает то же самое, но дополнительно добавляет в конце window.open(), то перед записью в него нужно открыть поток на запись с помощью метода document.open(), а по окончании записи закрыть поток методом document.close(). После выполнения последнего действия произойдет событие (и вызовется соответствующий обработчик события onLoad ) у документа, а затем у окна.
События объекта document аналогичны одноименным событиям объекта window (только у document они происходят раньше), либо их смысл понятен из их названия, поэтому мы не будем детально их разбирать.
Остановимся вкратце на свойствах объекта document. Свойства linkColor, alinkColor и vlinkColor задают цвет гиперссылок - непосещенных, активных и посещенных, соответственно. Свойство URL хранит адрес текущего документа (т.е. строковый window., если страница состоит из единственного документа, а не является набором выдает домен (оно аналогично window. ). Свойство title выдает <TITLE> ), lastModified указывает на дату и время последней модификации файла, в котором содержится данный HTML-документ (без учета времени модификации referrer выдает адрес страницы, с которой пользователь пришел на данную web-страницу, кликнув по гиперссылке. Наконец, свойству посвящен целый раздел в лекции 8.
Если окно имеет фреймовую структуру (т.е. вместо контейнера <BODY> в нем присутствует контейнер < со вложенными в него контейнерами < и быть может другими контейнерами < ), то объект window соответствует внешнему контейнеру <, а с каждым вложенным контейнером < ассоциирован свой собственный объект класса Window.
Каждому окну или NAME контейнера , либо вторым аргументом метода window.open(). Используется оно в качестве значения атрибута контейнеров A и FORM, чтобы открыть ссылку или отобразить результаты работы формы в определенном окне или фрейме. Есть несколько зарезервированных имен окон: _self (имя текущего окна или _blank (новое окно), _parent (окно-родитель для данного _top (самый старший предок данного
У каждого объекта класса Window, будь то окно или window ; кроме того, на него же ссылается свойство self объекта window (а также свойство window объекта window - есть и такое!). Ссылку на объект окна, открываемого методом window.open(), выдает сам этот метод. Ссылка на объект-NAME контейнера . Наконец, у объектов-window. ) и на окно браузера, частью которого является данный window.top ).
Таким образом, для того, чтобы правильно обращаться к нужным фреймам, нам нужно знать лишь их
Рассмотрим сначала простой пример. Разделим экран на две вертикальные колонки:
<HTML>
<HEAD>
<TITLE>Левый и правый</TITLE>
</HEAD>
<FRAMESET COLS="50%,*">
<FRAME NAME=leftframe SRC=left.htm>
<FRAME NAME=rightframe SRC=right.htm>
</FRAMESET>
</HTML>
(рис 4.3) Окно с двумя вертикальными фреймамиИерархия
windowleftframerightframeИз основного окна (из скрипта, который можно было поместить в контейнер <HEAD> ) обратиться к левому window.leftframe, к правому - window.rightframe. Из каждого window. либо window.top (что в данном случае равносильно) или даже просто и top (так как приставку window можно опускать). Наконец, из левого или top.rightframe.
<HTML>
<HEAD>
<TITLE>Левый, верх и низ</TITLE>
</HEAD>
<FRAMESET COLS="50%,*">
<FRAME NAME=leftframe SRC=left.htm>
<FRAMESET ROWS="50%,*">
<FRAME NAME=topframe SRC=top.htm>
<FRAME NAME=botframe SRC=bottom.htm>
</FRAMESET>
</FRAMESET>
</HTML>
(рис 4.4) Правый фрейм разбит на два по горизонталиrightframe теперь не существует. Более того, все три
windowleftframetopframebotframeСледовательно, мы можем поместить в контейнер <HEAD> следующий скрипт, устанавливающий
<SCRIPT>
window.onload=f;
function f()
{
window.leftframe.document.bgColor='blue';
window.topframe.document.bgColor='red';
window.botframe.document.bgColor='green';
}
</SCRIPT>
Для того чтобы rightframe все же появился в иерархии и ему подчинялись два правых rightframe мы должны загрузить отдельный фреймовый документ.
| Основной документ | Документ в правом фрейме ( right. ) |
|---|---|
<HTML> <HEAD> </HEAD> <FRAMESET COLS="50%,*"> <FRAME NAME=leftframe SRC=left.htm> <FRAME NAME=rightframe SRC=right.htm> </FRAMESET> </HTML> |
<HTML>
<HEAD>
</HEAD>
<FRAMESET ROWS="50%,*">
<FRAME NAME=topframe SRC=top.htm>
<FRAME NAME=botframe SRC=bottom.htm>
</FRAMESET>
</HTML>
|
В этом случае иерархия
windowleftframerightframetopframebotframeТеперь чтобы из главного окна обратиться ко всем трем фреймам и установить в них те же
window.leftframe.document.bgColor='blue'; window.rightframe.topframe.document.bgColor='red'; window.rightframe.botframe.document.bgColor='green';
Таким образом, визуально на Web-странице мы получили тот же результат, что и с тремя rightframe в отдельном файле.
Выше мы обращались к , которая является свойством объекта window.
В качестве иллюстрации предположим, что в примере из двух SRC ) третьего изображения с помощью скрипта, находящегося в левом фрейме. Правый
top.frames[1].document.images[2].src = 'pic.gif'; top.frames['rightframe'].document.images[2].src = 'pic.gif'; top.frames.rightframe.document.images[2].src = 'pic.gif'; top.rightframe.document.images[2].src = 'pic.gif';
Обычной задачей при разработке типового Web-узла является загрузка результатов исполнения формы. Сложнее, если результат работы должен быть загружен в разные фреймы (например, в зависимости от выбранной кнопки).
Применим полученные нами знания для решения этой задачи. Сначала заготовим следующие файлы. Основной файл, например, index., содержит левый left. содержит форму, в которой пользователю предоставляется возможность выбрать верхний или нижний right. содержит простой текст; он будет загружаться в верхний или нижний
| Основной файл с тремя |
Файл с формой left. в левом фрейме |
Файл right. |
|---|---|---|
<HTML>
<HEAD>
<TITLE>Три фрейма</TITLE>
</HEAD>
<FRAMESET COLS="50%,*">
<FRAME NAME=leftframe
SRC=left.htm>
<FRAMESET ROWS="50%,*">
<FRAME NAME=topframe SRC="">
<FRAME NAME=botframe SRC="">
</FRAMESET>
</FRAMESET>
</HTML>
|
<HTML>
<HEAD>
<SCRIPT SRC="loadframe.js"></SCRIPT>
</HEAD>
<BODY>
<FORM METHOD=post ACTION=right.htm
NAME=f onSubmit="return load();">
<SELECT NAME=s>
<OPTION>верхний</OPTION>
<OPTION>нижний</OPTION>
</SELECT>
<INPUT TYPE=submit VALUE="Загрузить">
</FORM>
</BODY>
</HTML>
|
<HTML> <BODY> Этот документ мы загружаем при выборе фрейма из списка </BODY> </HTML> |
Для того, чтобы пример заработал, остается в файле loadframe.js описать функцию . Функция должна делать так, чтобы в зависимости от выбора пользователем значения селектора "верхний" или "нижний" файл right. загружался бы либо в правый верхний, либо в правый нижний left. у формы не был указан целевой ).
Нашу задачу динамического выбора , с него мы и начнем (открыть).
function load()
{
if(document.f.s.selectedIndex==0)
{
document.f.target = "topframe";
top.frames[2].document.open();
top.frames[2].document.close();
}
else
{
document.f.target = "botframe";
top.frames[1].document.open();
top.frames[1].document.close();
}
return true;
}
Функция всегда возвращает true, а поскольку она вызывается из обработчика события onSubmit, это означает, что всегда будет происходить отправка формы (событие Submit ), т.е. загрузка страницы right., указанной в атрибуте данной формы. Обратите внимание также на следующие строки в функции :
top.frames[1].document.open(); top.frames[1].document.close();
Смысл их таков: когда пользователь выбирает значение верхний или нижний в форме, то файл right. загружается в соответствующий ...document.open(), при этом всё его содержимое очищается) и закрывается (методом ...document.close() ), тем самым
Теперь рассмотрим второй подход - открытие окна с именем, совпадающим с именем topframe или botframe. Его идея состоит в том, что при попытке открыть окно с именем существующего окна новое окно не открывается, а используется уже открытое.
function load()
{
if(document.f.s.selectedIndex==0)
{
window.open("right.htm","topframe");
top.frames[2].document.open();
top.frames[2].document.close();
}
else
{
window.open("right.htm","botframe");
top.frames[1].document.open();
top.frames[1].document.close();
}
return false;
}
В этом подходе функция всегда возвращает false. Это необходимо, чтобы отменить window.open(), в right., уже нет надобности.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.