|
Динамическое изменение внешнего вида страницыЧтобы динамически изменять вид нашей веб-страницы, необходимо решить один вопрос: каким образом наш сценарий сможет обращаться к отдельным ее элементам? Существует два способа такого доступа: классический и по имени элемента. Чтобы быть последовательными, давайте сначала рассмотрим первый из них.
Доступ к элементам HTML по номеруВозьмем такой пример. Предположим, что мы поместили на веб-страницу графический элемент (картинку), но хотим, чтобы она не сразу возникла в своем реальном размере, а постепенно выросло "из ничего". Для примера можно взять изображение компьютера ATARI-800, которое уже исполь-зовалось нами в главе 3. Карту графических ссылок мы в этом примере на него ставить не будем, хотя это легко сделать, просто перенеся код из последнего примера раздела 3.1. Сначала просто поставим картинку на страницу: <IMG SRC="Images/computer.gif" WIDTH="151" HEIGHT="10" BORDER="0" ALT="Компьютер"> Физический размер этой картинки - 451x310, но мы, как видите, специ-ально уменьшили ее ширину и высоту на 300 пикселов. Теперь давайте попытаемся обратиться к ней из сценария JavaScript. Оказывается, доступ ко всем картинкам на странице можно получить, просто написав метод document.images и указав в квадратных скобках номер картинки на странице. Вообще говоря, такой синтаксис в JavaScript упот-ребляется по отношению к массивам элементов. То есть, если у нас есть массив из пяти элементов под названием MoyMassiv, то к его элементам следует обращаться так: MoyMassiv[0], MoyMassiv[1],..., MoyMassiv[4]. Мас-сив document.images называется коллекцией. Нумерация картинок начинается с нуля. Наша картинка, как первая на странице, будет иметь номер 0. Следовательно, для обращения к ней из сценария следует использовать метод document.images[0]. Если бы мы поместили на страницу еще одну картинку, после первой, то к этой второй кар-тинке мы могли бы обратиться так: document.images[1]. Теперь мы можем написать функцию, которая будет проверять, не дос-тигла
ли еще наша картинка нужного размера, и если нет, то увеличивать ее ширину
и высоту. Проверить размеры можно следующим образом: setTimeout("sizer()", 20); while (document.images[0].width<451) setTimeout("sizer()",
20);
В результате мы получим картинку, постепенно увеличивающуюся в размерах. Кстати, некоторые компьютеры могут "не успевать" так часто перерисовывать изображение, особенно если на странице есть еще какая-нибудь информация, поэтому можно в расчете на них увеличить время задержки перед следующим вызовом функции. При этом лучше во столько же раз увеличить и приращение размеров картинки, иначе она будет расти чересчур медленно, и надоест пользователю еще до того, как приобретет свои истинные размеры. Например, это можно сделать так: document.images[0].width+=10; document.images[0].height+=10; setTimeout("sizer()",
100); Кстати, нашу функцию sizer() легко переделать так, чтобы картинка, достигнув нормальных размеров, снова начала уменьшаться, затем опять увеличилась и так далее. Для этого надо прибавлять к размерам не просто число, а переменную: document.images[0].width+=a; document.images[0].height+=a; var a=2; if (document.images[0].width>=451) a=-2; Посмотрим, как теперь будет выглядеть функция целиком (все остальное на этой странице остается таким же, как в предыдущем примере, поэтому мы не будем повторять текст всей страницы): <SCRIPT LANGUAGE="JavaScript"> Доступ к элементам HTML по имениОднако, во-первых, не очень удобно высчитывать номер элемента на странице, а во-вторых, описанным выше способом мы можем получить доступ не ко всем элементам. Рассмотрим такой пример. Предположим, мы создаем веб-страницу для сайта фирмы, производящей мигалки, и поэтому нам обязательно хочется, чтобы в заголовке соответствующее слово мигало. Мы даже уже написали заготовку:
Результат работы этой заготовки показан на рис. 6.9. Итак, проблема в том, чтобы заставить мигать слово "МИГАЛОК". Ну, разумеется, можно применить стилевое свойство text-decoration: blink; или просто тег <BLINK>, но ни то, ни другое не поддерживается броузером Internet Explorer. Как же быть? Прежде всего, надо выделить слово МИГАЛОК в отдельный элемент. Поскольку оно находится на отдельной строке, можно использовать тег <DIV>: <Н2>Производство <DIV>МИГAЛOK</DIV> и цветомузыкальных
установок.</Н2> Рис. 6. 9. Предварительная заготовка для веб-страницы, с мигающим заголовком Изменение свойств элементовПоскольку Internet Explorer при этом не отобразит мигание, мы можем написать функцию, которая будет делать этот элемент то видимым, то невидимым. Для этого нам пригодится стилевое свойство visibility. Сначала установим его так, чтобы элемент был виден: <Н2>Производство <DIV ID="mig" STYLE="text-decoration: blink; visibility: visible; ">МИГАЛОК</DIV> и цветомузыкальных установок. </Н2> После этого остается проверить тип броузера, и если это не Netscape, вызвать функцию искусственного мигания (которую мы еще не написали): if (navigator. appName!="Netscape") blink_it(); Обратите внимание на то, что символ != означает не равно. Итак, эта функция должна то прятать наш элемент, то наоборот, показывать. Чтобы сделать элемент невидимым, нужно присвоить его свойству visibility значение hidden. Поскольку мы дали элементу уникальное имя (с помощью атрибута ID=), теперь у нас есть возможность получить доступ к нему через коллекцию document. all: document. all. mig. style. visibility="hidden"; Как видите, написав метод document. all, можно после точки просто ука- зать имя элемента и далее любой атрибут, в данном случае STYLE=. После style можно снова поставить точку и указать любое стилевое свойство. Чтобы сделать наше слово опять видимым, нужно присвоить свойству visibility значение visible: document.all.mig.style.visibility="visible"; Теперь осталось только написать условие. Можно было бы просто написать: if (document. all. mig. style. visibility=="hidden") Однако давайте для большей гибкости и наглядности используем переменную-флаг. Пусть она будет равна 1, если элемент видимый, и 0, если нет. Тогда мы можем в условии проверять именно этот флаг. Вся функция при- обретет такой вид: <SCRIPT LANGUAGE="JavaScript"> Как видите, изначально мы присвоили переменной-флагу vis значение 0,
чтобы в первый же момент надпись МИГАЛОК не исчезала (при первом запуске
функции теперь элемент будет видим). В конце функции мы используем задержку
в 400 миллисекунд и рекурсивный вызов той же функции. Давайте посмотрим,
как будет выглядеть вся страница.
Выбор изменяемых свойствКстати, использование переменной-флага дает нам возможность легко переделать это мигание во что-нибудь другое. Например, вместо временного исчезновения надписи можно на это время включать выворотку, то есть взаимно поменять цвет текста и цвет фона. Как мы уже говорили, получив доступ к элементу (например, через метод document. all), мы можем легко изменить любое его свойство. Вот, например, как можно организовать мигание с вывороткой: function blink_it() { Результат (в момент включения выворотки) показан на рис. 6. 10. Обратите внимание на то, что стилевые свойства, которые пишутся через дефис (в нашем примере это background-color), при доступе из сценария необходимо писать без дефиса, но заменив букву, идущую после дефиса, на прописную. Так, background-color превращается в backgroundColor, font-size в fontSize, border-style в borderStyle и т. д. Кстати говоря, чтобы получить тот результат, который показан на рис. 6. 10, нам пришлось добавить еще одна свойство нашему мигающему элементу: <Н2>Производство<DIV id=mig style="VISIBILITY: visible; WIDTH:
7em; TEXT-DECORATION: blink">МИГАЛOK</DIV> и цветомузыкальных установок.
</Н2>
а именно: мы установили ширину элемента. Если этого не
сделать, цвет фона будет меняться на этой строке по всей ширине экрана. Рис. 6. 10. Мигание заголовка может осуществляться
разными способами, в том числе и вывороткой
Доступ к элементам страницы через метод document. all — вещь очень удобная. К сожалению, такая возможность на 100% поддерживается только в броузере Internet Explorer. Что касается броузеров Netscape, то доступ к любому элементу там появился только в шестой версии, но синтаксис его отличается от рассмотренного выше. Вместо document. all. имя_элемента для Netscape 6 нужно писать document. getElementByld("имя_элемента"). А в более ранних версиях Netscape доступ обеспечивается только к некоторым элементам страницы: рисункам (document. images), ссылкам (document. links), якорям (document. anchors), элементам управления и внедренным объектам (document. applets), формам (document. forms), объектам, внедренным с помощью тега <embed>(document. embeds), а также слоям, которые в Netscape организовывались с помощью тега <LAYER left="373" top="8711">(через document. layers). При этом, правда, все равно можно присваивать этим элементам уникальные имена и затем использовать их для обращений, например, так: <А NAME="colored">Kaкой-то текст<А> При этом некоторые версии Netscape позволяют опустить слово style, а при доступе к слоям — и слово layers. Эти отличия несколько затрудняют создание страниц, которые бы хорошо смотрелись и в Internet Explorer, и в Netscape, Однако всегда можно прове- рить из сценария тип и версию броузера, после чего написать различные блоки кода для разных броузеров. В некоторых особо сложных случаях можно даже написать отдельные страницы для разных типов броузеров, и организовать перенаправление на них (пример такого перенаправления был приведен в разделе 6. 1). В любом случае не забывайте проверять, как веб-страница смотрится в броузерах других типов. Сложно, конечно, под- держивать совместимость со всеми броузерами, но даже если ориентироваться на какой-нибудь один из них, все равно иногда стоит немного подкорректировать код так, чтобы пользователи других броузеров увидели хоть что-то более или менее похожее. Кстати, в этой книге большинство примеров ориентированы на броузер Internet Explorer версии 4 и выше. |