Добавил:
ПОИТ 2016-2020 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Жиляк 2 сем / Лекции / Введение в JavaScript

.pdf
Скачиваний:
136
Добавлен:
29.04.2018
Размер:
1.21 Mб
Скачать

В результате этого создается четыре переменных: x0, y0, x1, y1 это свойства объекта r. К ним можно получить доступ только в контексте объекта данного класса, например:

up_left_x = r.x0;

up_left_y = r.y0;

Кроме свойств, внутри конструктора Rectangle мы определили объект area класса Function(), применив встроенный конструктор языка JavaScript. Это методы объекта класса Rectangle. Вызвать эту функцию можно тоже только в контексте объекта класса Rectangle:

sq = r.area();

Таким образом, объект это совокупность свойств и методов, доступ к которым можно получить, только создав при помощи конструктора объект данного класса и использовав его контекст.

На практике довольно редко приходится иметь дело с объектами, созданными программистом. Дело в том, что объект создается функцией- конструктором, которая определяется на конкретной странице и, следовательно, все, что создается в рамках данной страницы, не может быть унаследовано другими страницами. Нужны очень веские основания, чтобы автор Web-узла занялся разработкой библиотеки пользовательских классов объектов. Гораздо проще писать функции для каждой страницы.

3.7.2 Прототип

Обычно мы имеем дело со встроенными объектами JavaScript, такими как Data, Array и String. Собственно, почти все, что изложено в других разделах курса (кроме иерархии объектов DOM) — это обращение к свойствам и методам встроенных объектов. В этом смысле интересно одно свойство объектов, которое носит название prototype. Прототип это другое название конструктора объекта конкретного класса. Например, если мы хотим добавить метод к объекту класса String, то мы можем это сделать следующим образом:

String.prototype.out = new Function("a", "a.write(this)");

var s = "Привет!";

s.out(document);

// Будет выведено: Привет!

Для объявления нового метода для объектов класса String мы применили конструктор Function. Есть один существенный нюанс: новыми методами и свойствами будут обладать только те объекты, которые порождаются после изменения прототипа объекта. Все встроенные объекты создаются до того, как JavaScript-программа получит управление, что существенно ограничивает применение свойства prototype.

Тем не менее покажем, как можно добавить метод к встроенному в JavaScript классу. Примером будет служить встроенный поименованный Image. Задача состоит в том, чтобы разобрать URL картинки таким же образом, как и URL объекта класса Link, т.е. снабдить объект класса Image дополнительными методами protocol(), host() и т.п.:

function pr()

{

a = this.src.split(':'); return a[0]+':';

}

function ho()

{

a = this.src.split(':'); path = a[1].split('/'); return path[2];

}

function pa()

{

path = this.src.split('/'); path[0]='';

path[2]='';

return path.join('/').split('///').join('/');

}

Image.prototype.protocol = pr;

Image.prototype.host = ho;

Image.prototype.pathname = pa;

document.write("<IMG NAME=i1 SRC='image1.gif'><BR>"); document.write(document.i1.src+"<BR>"); document.write(document.i1.protocol()+"<BR>"); document.write(document.i1.host()+"<BR>"); document.write(document.i1.pathname()+"<BR>");

Пример 3.3. Добавление методов к классу Image

Как известно, HTML-парсер разбирает HTML-документ и создает встроенные объекты раньше, чем запускается JavaScript-интерпретатор. Поэтому основная идея нашего подхода заключается в том, чтобы переопределить конструктор Image раньше, чем он будет использован. Поэтому мы создаем объект Image на странице через JavaScript-код. В этом случае сначала происходит переопределение класса Image, а уже после этого создается встроенный объект данного класса.

Примечание. При работе с Internet Explorer данный пример работать не будет. Причина в том, что хотя свойство prototype имелось в наличии у String (см. предыдущий пример), у Image такого свойства в данном браузере уже не существует. Однако в Mozilla Firefox все работает корректно.

3.7.3 Методы объекта Object

Object это класс, элементами которого являются любые объекты JavaScript. У всех объектов этого класса есть общие методы. Таких методов

мы рассмотрим три: toString(), valueOf() и assign().

Метод toString() осуществляет преобразование объекта в строку символов (строковый литерал). Он используется в JavaScript-программах повсеместно, но в основном неявно. Например, при выводе числа или строковых объектов. Интересно применение toString() к функциям, например, к функции pr() из предыдущего примера:

document.write(pr.toString());

Результат исполнения:

function pr()

{

a = this.src.split(':'); return a[0]+':';

}

Однако, если распечатать таким же образом объект класса Image из того же примера:

document.write(document.i1.toString());

то получим уже следующее: [object] (в Internet Explorer) либо [object Image] (в Netscape Navigator). Таким образом, далеко не всегда метод toString() возвращает строковый эквивалент содержания объекта.

Аналогично ведет себя и метод valueOf(), позволяющий получить значение объекта. В большинстве случаев он работает подобно методу toString(), особенно если нужно выводить значение на страницу. Например,

оператор document.write(pr.valueOf()) выдаст то же самое, что и document.write(pr.toString()) выше.

В отличие от двух предыдущих методов, метод assign() позволяет не прочитать, а переназначить какое-либо свойство и метод объекта. Следует заметить, что этот метод работает не во всех браузерах и не со всеми объектами. В общем случае оператор объект.свойство = значение равносильно оператору объект.свойство.assign(значение). Например, следующие операторы равносильны они перенаправляют пользователя на новую страницу:

window.location = "http://ya.ru/"; window.location.assign("http://ya.ru/");

4 ЛЕКЦИЯ: ПРОГРАММИРУЕМ СВОЙСТВА ОКНА БРАУЗЕРА

Рассматриваются вопросы программирования свойств окна браузера, управление окнами, а также работа с фреймами.

4.1 Объект window

Класс объектов Window это самый старший класс в иерархии объектов JavaScript. Объект window, относящийся к текущему окну (т.е. в котором выполняется скрипт), является объектом класса Window. Класс объектов Frame содержится в классе Window, т.е. каждый фрейм это тоже объект класса

Window.

О фреймах речь пойдет ниже, а пока вернемся к объекту window. Объект window создается только в момент открытия окна. Все остальные объекты, которые порождаются при загрузке страницы, есть свойства объекта window. Более того, все глобальные переменные, определенные в данном окне, тоже являются свойствами объекта window. Таким образом, у объекта window могут быть разные свойства при загрузке разных страниц. Кроме того, в разных

браузерах свойства объектов и поведение объектов и браузера при обработке событий может быть различным. При программировании на JavaScript чаще всего используют следующие свойства, методы и события объекта window:

Таблица 4.1 - Свойства, методы и события объекта window

Свойства

Методы

События

 

 

 

status

open()

 

defaultStatus

close()

Load

location

focus()

Unload

history

blur()

 

navigator

 

Focus

 

alert()

 

Blur

document

confirm()

 

frames[]

prompt()

Resize

 

 

opener

setTimeout()

Error

 

parent

setInterval()

 

 

 

 

self

clearTimeout()

 

top

clearInterval()

 

 

 

 

Поскольку объект window является самым старшим, то в большинстве случаев при обращении к его свойствам и методам приставку "window." можно опускать (разумеется, в случае, если вы хотите обратиться к свойству или методу текущего окна, где работает скрипт; если же это другое окно, то необходимо указать его идентификатор). Так, например, можно писать

alert('Привет') вместо window.alert('Привет'), или location вместо

window.location. Исключениями из этого правила являются вызовы методов open() и close(), у которых нужно указывать имя окна, с которым работаем (родительское в первом случае и дочернее во втором). Свойства frames[], self, parent и top будут рассмотрены в разделе, посвященном фреймам. Свойство opener будет рассмотрено при описании метода window.close().

4.2 Свойства объекта window

4.2.1 Поле статуса и свойство window.status

Поле статуса это первое, что начали использовать авторы HTML- страниц из арсенала JavaScript. Калькуляторы, игры, математические вычисления и другие элементы выглядели слишком искусственно. На их фоне бегущая строка в поле статуса была изюминкой, которая могла действительно привлечь внимание пользователей к Web-узлу. Постепенно ее популярность сошла на нет. Бегущие строки стали редкостью, но программирование поля статуса встречается на многих Web-узлах.

Поле статуса

(Status Bar)

Рисунок 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, при условии, что оно не есть пустая строка (опять же никак не меняя значений обоих свойств). Мы можем изменить это поведение, например, как в следующем примере:

<A onMouseOver="window.status='Мышь

над ссылкой';return true;"

onMouseOut="window.status='Мышь

увели со ссылки';"

HREF="http://site.com/">Наведите

мышь на ссылку и следите за полем

статуса</A>

 

Обратите внимание на оператор return true в конце обработчика событий onMouseOver. Он необходим для того, чтобы отменить действие по умолчанию (в данном случае вывод URL в поле статуса), которое, в отсутствие этого оператора, браузер выполнил бы сразу после вывода нами своей строки в поле статуса, и пользователь не успел бы увидеть нашу строку. Аналогичный трюк отмены действия по умолчанию годится и для

некоторых других событий (onClick, onKeyDown, onKeyPress, onMouseDown,

onMouseUp, onSubmit, onReset), с той лишь разницей, что для перечисленных обработчиков отмена выполняется оператором return false.

Для обработчика onMouseOut такого способа отменить действие по умолчанию не существует (к сожалению). Но в данном конкретном случае это не требуется как уже было сказано, при уводе курсора со ссылки в поле статуса восстанавливается значение defaultStatus только в случае, если это значение не есть пустая строка. Но в нашем случае (по умолчанию при

загрузке страницы в IE) оно равно именно пустой строке. Поэтому, уводя курсор с нашей ссылки, мы продолжаем видеть в поле статуса строку "Мышь увели со ссылки". Ситуация изменится в следующем примере, когда мы предварительно зададим свое (непустое) значение defaultStatus.

Программируем 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 нет такой возможности). Однако мы ввели оператор вывода окна предупреждения alert('Ждем') (он рассматривается ниже) — и теперь пользователь будет видеть в поле статуса строку "Мышь увели со ссылки" до тех пор, пока не нажмет OK на этом окне.

4.2.2 Поле адреса и свойство window.location

Поле адреса в браузере обычно располагается в верхней части окна и отображает URL загруженного документа. Если пользователь хочет вручную перейти к какой-либо странице (набрать ее URL), он делает это в поле адреса.

Поле location

Рисунок 4.2 - Поле адреса (location)

Свойство location объекта window само является объектом класса Location. Класс Location, в свою очередь, является подклассом класса URL, к которому относятся также объекты классов Area и Link. Объекты Location наследуют все свойства объектов URL, что позволяет получить доступ к любой части схемы URL. Подробнее о классе объектов URL мы расскажем в лекции 6.

В целях совместимости с прежними версиями JavaScript, в языке поддерживается также свойство window.document.location, которое в

настоящее время полностью дублирует свойство window.location со всеми его свойствами и методами. Рассмотрим теперь свойства и методы объекта window.location (событий, связанных с этим объектом, нет).

Соседние файлы в папке Лекции