События в DOM

Изменение содержимого таблицы стилей

Операции с таблицами стилей

Таблицы стилей

Средства DOM для таблиц стилей в документе HTML позволяют выполнять как операции над таблицами как объектами, так и операции над содержимым таблиц (правилами и свойствами).

Таблица стилей задается в документе HTML либо как внутренняя (внедренная) таблица стилей (с помощью элемента style) (см. 4.3.12.1) или заданием ссылки на внешнюю (связываемую) таблицу (с помощью элемента link) (см. 4.3.12.2). Кроме этого, в элементе с помощью правила @import может быть задана ссылка на вставляемую (импортируемую) внешнюю таблицу стилей (см. 4.3.12.3).

Чтобы иметь возможность выполнять операции с таблицами стилей, для объекта document введена коллекция styleSheets, которая содержит все элементы style и link в порядке их появления в документе HTML. Индексация элементов в коллекции начинается с индекса 0. Свойство length этой коллекции, доступное только для чтения, содержит количество элементов в коллекции.

Отдельный элемент коллекции является объектом styleSheet. Для этого объекта определены следующие основные свойства (только для чтения):

· href – содержит значение атрибута href элемента link; для элемента style равно пустой строке или null;

· id – содержит значение атрибута id элемента style или link;

· media – содержит значение атрибута media элемента style или link;

· title – содержит значение атрибута title элемента style или link;

· type – содержит значение атрибута type элемента style;

· parentStyleSheet – для импортированной (с помощью правила @import) таблицы стилей содержит объект типа styleSheet, в котором задано правило @import; в противном случае содержит null.

Свойство media в Internet Explorer имеет строковый тип и доступна не только для чтения, но и модификации, а в остальных Web-браузерах (Firefox, Opera и Safari) является коллекцией MediaList, элементами которой являются имена отдельных устройств в значении атрибута media элемента style или link.

Коллекция MediaList имеет два свойства:

· mediaText – содержит строковое представление атрибута media (свойство доступно как для чтения, так и модификации);

· length – содержит количество имен устройств в списке значений атрибута media (только для чтения).

Для операций с именами устройств в списке в коллекции MediaList определено три метода:

· item(индекс) – получение имени устройства с заданным индексом в списке (индексация элементов списка начинается с индекса 0);

· appendMedium(новое-имя) – добавление в список нового устройства с именем новое-имя;

· deleteMedium(имя) – удаление из списка устройства с заданным именем.

Для объекта styleSheet определено также свойство owningElement в Internet Explorer и свойство ownerNode в остальных Web-браузерах (Firefox, Opera и Safari). Эти свойства содержат узел (объект типа Node) для элемента style или link и доступны только для чтения.

Кроме перечисленных выше свойств, для объекта styleSheet определено свойство disabled, определяющее состояние таблицы стилей: выключена (значение true) или включена (значение false). Правила в выключенной таблицу стилей игнорируются. Свойство disabled доступно как для чтения, так и для модификации.

Если в документе HTML определено несколько элементов style и/или link, то по умолчанию:

· в Internet Explorer и Opera все элементы коллекции включены;

· в Firefox включенным является только первый элемент коллекции, остальные выключены;

· в Safari коллекция styleSheets состоит только из одного (первого) элемента, остальные элементы style или link игнорируются.

Пример 4.5.39. Вывод и изменение свойств объекта styleSheet:

В заголовке документа HTML заданы следующие элементы link и style:

<link title="Внешняя таблица стилей" type="text/css"

rel="stylesheet" href="styles/cssExt.css" media="screen"/>

<style type="text/css" title="Внутренняя таблица стилей"

media="screen">

h2 {

font-weight: bold; color: red

}

span.obj {

font-family:"Courier New";

font-weight: bold; color: navy

}

</style>

Внешняя таблица стилей cssExt.css содержит следующие правила:

h2 { text-align: center; font-weight: bold; color: blue}

p {text-align: justify; color: green}

span.en { font-style: italic; color: black}

В теле документа HTML определен следующий текст:

<h2>Стили в DOM</h2>

<h3>Операции с таблицами стилей</h3>

<p>Для операций над таблицами стилей, объект

<span class="obj">document</span> в

<span class="en">DOM Level 2 Style</span>

содержит <span class="select">коллекцию</span>

<span class="obj">styleSheets</span>, элементами

которой являются таблицы стилей документа (в том

числе и внешние таблицы стилей). Каждая таблица стилей

представляется <span class="select">объектом</span>

<span class="obj">styleSheet</span>.</p>

Для добавления имени устройства "print" в атрибут media элемента link необходимо выполнить следующие предложения:

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

// Добавление имени устройства в строку media

document.styleSheets[0].media += ",print";

else

// Добавление имени устройства в коллекцию

// MediaList

document.styleSheets[0].media.appendMedium("print");

Для включения таблицы стилей, заданной в элементе style, в Firefox, необходимо выполнить следующие предложения:

// Если Web-браузер - Firefox

if(navigator.userAgent.indexOf("Firefox")!= -1)

// Включение второй таблицы стилей

document.styleSheets[1].disabled = false;

Вывод Web-страницы в различных Web-браузерах будет иметь следующий вид:

(в Internet Explorer, аналогично в Firefox и Opera) (в Safari)

Для вывода значений свойств объекта styleSheet можно использовать следующую функцию:

function showSheetChars() {

// Определение и вывод количества объектов

// styleSheet в коллекции styleSheets

styleSheetListLength = document.styleSheets.length;

alert("styleSheetListLength = " +

styleSheetListLength);

// Вывод свойств объектов styleSheet в цикле

for(i = 0; i < styleSheetListLength; i++)

{

// Получение текущего объекта styleSheet

styleSheetElement = document.styleSheets[i];

// Задание начального значения строки media

mediaString = "";

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

{

// Получение имени текущего элемента

elementName =

styleSheetElement.owningElement.nodeName;

// Преобразование значения свойства

// media в массив

mediaArray =

styleSheetElement.media.split(",");

// Вывод элементов массива mediaArray

// в виде строки

for(j = 0; j < mediaArray.length; j++)

mediaString += (j+1) + ". " +

mediaArray[j] + " ";

}

else

{

// Получение имени текущего элемента

elementName =

styleSheetElement.ownerNode.nodeName;

// Вывод элементов коллекции MediaList

// в виде строки

for(j = 0;

j < styleSheetElement.media.length; j++)

mediaString += (j+1) + ". " +

styleSheetElement.media.item(j) + " ";

}

// Вывод значений свойств объекта styleSheet

alert("elementName='" + elementName + "'" +

"\ndisabled='" + styleSheetElement.disabled +

"'" + "\ntype='" + styleSheetElement.type + "'" +

"\nhref='" + styleSheetElement.href + "'" +

"\nmedia='" + mediaString + "'" +

"\ntitle='" + styleSheetElement.title + "'");

}

}

При вызове этой функции для элементов link и style в Internet Explorer будут выведены следующие сообщения:

Аналогичным образом будут выглядеть сообщения в Firefox и Opera, однако в Safari будут выведены следующие сообщения:

Наряду с заданием таблиц в документе HTML с использованием элементов link и style можно, используя средства DOM, динамически создавать таблицы стилей в сценариях JavaScript. Однако следует иметь в виду, что операция создания таблицы стилей по-разному выполняется в Internet Explorer и в остальных Web-браузерах (Firefox, Opera и Safari).

В Web-браузере Internet Explorer таблица стилей создается с помощью метода

createStyleSheet(URL, индекс)

интерфейса Document.

Если первый параметр URL задает ссылку на внешнюю таблицу стилей, то создается элемент link со значением атрибута href, равным значению URL. В противном случае, а также, если первый параметр не задан, создается элемент style.

Второй параметр индекс задает индекс в последовательности элементов style и link, по которому будет вставлена создаваемая таблица стилей. Если второй параметр не указан, вставляемый элемент style или link станет последним в последовательности.

В Web-браузерах Firefox, Opera и Safari таблица стилей создается с помощью метода

createElement(имя-тега)

интерфейса Document (см. 4.5.3.5). В качестве имени-тега задаются значения "style" или "link".

Для задания атрибутов, изменения значений атрибутов и удаления атрибутов как созданных так и существующих элементов во всех Web-браузерах необходимо использовать методы setAttribute() и removeAttribute()(см. 4.5.3.8).

Существующие в документе HTML таблицы стилей, заданные с помощью элемента style, могут конфликтовать с создаваемыми внутренними таблицами. Поэтому документ должен содержать либо только существующие внутренние (статические) таблицы стилей, либо только создаваемые внутренние (динамические) таблицы стилей. Внешние таблицы стилей в документе могут быть как статическими, так и динамическими. В Safari для создаваемых таблиц стилей коллекция styleSheets будет содержать все созданные элементы style и link.

Пример 4.5.40. Создание таблиц стилей:

Для текста документа HTML в примере 4.5.39 вместо заданных в заголовке элементов link и style создадим новые таблицы стилей с использованием средств DOM и сценариев JavaScript.

Следующий фрагмент сценария создает элемент link со ссылкой на внешнюю таблицу стилей cssExt.css:

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

// Создание элемента link как первого

// элемента коллекции styleSheets

newExtleSheet =

document.createStyleSheet(sheetName, 0);

else

{

// Получение элемента head

headElement =

document.getElementsByTagName("head")[0];

// Создание новой ссылки

// на внешнюю таблицу (элемента link)

newExtStyleSheet = document.createElement("link");

// Установка атрибута href для элемента link

newExtStyleSheet.setAttribute("href", sheetName);

// Установка атрибута rel для элемента link

newExtStyleSheet.setAttribute("rel", "stylesheet");

// Добавление элемента link как первого

// дочернего узла элемента head

headElement.insertBefore(newExtStyleSheet,

headElement.childNodes[0]);

}

// Получение элемента link

newExtStyleSheet =

document.getElementsByTagName("link")[0];

// Установка атрибута type для элемента link

newExtStyleSheet.setAttribute("type", "text/css");

// Установка атрибута media для элемента link

newExtStyleSheet.setAttribute("media", "screen,print");

// Установка атрибута title для элемента link

newExtStyleSheet.setAttribute("title",

"Новая таблица стилей - 1");

Этот фрагмент сценария создает внутреннюю таблицу стилей (элемент style):

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

// Создание таблицы стилей

newIntStyleSheet = document.createStyleSheet("",-1);

else

{

// Получение элемента head

headElement = document.getElementsByTagName("head")[0];

// Создание новой таблицы (элемента style)

newIntStyleSheet = document.createElement("style");

// Добавление новой таблицы стилей

// к дочерним узлам элемента head

headElement.appendChild(newIntStyleSheet);

}

// Получение элемента style

newIntStyleSheet =

document.getElementsByTagName("style")[0];

// Установка атрибута type для элемента style

newIntStyleSheet.setAttribute("type", "text/css");

// Установка атрибута media для элемента style

newIntStyleSheet.setAttribute("media", "screen");

// Установка атрибута title для элемента style

newIntStyleSheet.setAttribute("title",

"Новая таблица стилей - 2");

// Включение внутренней таблицы

newIntStyleSheet.disabled = false;

В результате выполнения этих фрагментов вывод Web-страницы из примера 4.5.39 будет иметь следующий вид:

(в Internet Explorer, аналогично в Firefox, Opera и Safari)

При использовании определенной в примере 4.5.39 функции вывод количества и свойств созданных таблиц стилей будет иметь следующий вид:

Работа с содержимым таблиц стилей, как и создание таблиц, по-разному организована в Internet Explorer и в остальных Web-браузерах, поддерживающих спецификацию DOM Level 2 Style: Firefox, Opera и Safari.

В Internet Explorer для объекта styleSheet заданы следующие коллекции:

· rules – содержит правила стилей таблицы;

· imports – содержит правила @import;

· pages – содержит правила @page;

Коллекция rules имеет свойство length, содержащее количество элементов в коллекции (свойство доступно как для чтения, так и модификации). Элементами коллекции являются объекты rule (правило стилей).

Объект rule имеет два свойства:

· selectorText – значение селектора правила (только для чтения);

· объект style – содержит набор стилей правила.

Операции с объектом style в Internet Explorer выполняются теми же способами, что и для атрибута style (см. 4.5.8.1).

Элементами коллекции imports являются правила @import для стилей, импортируемых в таблицу (см. 4.3.12.3). Свойством коллекции является переменная length, содержащая количество элементов в коллекции (свойство доступно как для чтения, так и модификации). Доступ к элементу коллекции выполняется с помощью выражения imports(индекс).

Коллекция pages содержит объекты page, содержащие правило @page (см. 4.3.26.2). Общее количество элементов в коллекции задается свойством length, доступным только для чтения.

Объект page имеет два свойства (только для чтения):

· pseudoClass – содержит наименование псевдокласса (:first,:left или:right);

· selector – содержит список стилей для заданного псевдокласса.

Операции с объектами коллекций rules, imports и pages выполняются с помощью следующих методов объекта styleSheet:

· addRule(селектор, список-свойств, индекс) – добавление элемента с заданным индексом в коллекцию rules (элемент содержит правило стилей с заданным селектором и заданным списком-свойств) (если индекс не задан, элемент добавляется после последнего элемента коллекции);

· removeRule(индекс) – удаление элемента с заданным индексом из коллекции rules (если индекс не задан, удаляется первый элемент коллекции);

· addImport(URL, индекс) – добавление элемента с заданным индексом в коллекцию imports (элемент содержит URL импортируемой таблицы стилей) (если индекс не задан, элемент добавляется после последнего элемента коллекции);

· removeImport(индекс) – удаление элемента с заданным индексом из коллекции imports;

· addPageRule(псевдокласс, список-свойств, индекс) – добавление объекта page с заданным индексом в коллекцию pages (элемент содержит правило стилей для заданного псевдокласса с заданным списком-свойств) (если индекс не задан, объект добавляется после последнего элемента коллекции).

В спецификации DOM Level 2 Style для объекта styleSheet задана коллекция cssRules, содержащая все правила данной таблицы стилей (объекты cssRule). Количество объектов в коллекции cssRules можно определить с помощь свойства length.

Для коллекции cssRules также определены два метода:

· insertRule(правило, индекс) – для вставки нового правила (объекта cssRule) перед правилом с указанным индексом;

· deleteRule(индекс)– для удаления правила (объекта cssRule) с указанным индексом.

Параметр правило в функции insertRule() должен содержать либо правило стилей (селектор и перечень стилей в фигурных скобках), либо правила с префиксом "@" (наименование правила, например @import, и параметры правила).

Перед началом добавления правил в созданную таблицу, она должна быть включена (свойство disabled должно быть установлено в false).

Объект cssRule, в свою очередь, имеет следующие свойства (доступны только для чтения):

· type – тип правила;

· cssText – строка, содержащая правило;

· parentStyleSheet – таблица стилей (объект styleSheet), содержащая данное правило.

Значение свойства type – целое число (при операциях сравнения можно использовать его символьный эквивалент). Это свойство может принимать следующие значения:

· UNKNOWN_RULE (0) – неизвестное правило;

· STYLE_RULE (1) – правило стилей (селектор и набор свойств);

· CHARSET_RULE (2) – правило @charset;

· IMPORT_RULE (3) – правило @import;

· MEDIA_RULE (4) – правило @media;

· FONT_FACE_RULE (5) – правило @font-face (в Web-браузерах Firefox, Opera и Safari не поддерживается);

· PAGE_RULE (6) – правило @page.

Дальнейшие операции с правилами зависят от типа правила.

Для объекта cssRule – правила стилей определены два свойства:

· selectorText – строка, содержащая селекторы;

· style – объект, содержащий список объявлений стилей.

Объект style, в свою очередь, содержит следующие свойства:

· cssText – строковое представление объявлений стилей;

· length – количество свойств в объявлении;

· parentRule – родительское правило для данного списка.

Операции с объектом style в DOM Level 2 выполняются теми же способами, что и для атрибута style (см. 4.5.8.1).

Для объекта cssRule – правила @charset (см. 4.3.12.2) определено свойство encoding, задающее кодировку таблицы, например "UTF-8" или "Windows-1251". Это свойство доступно и для чтения и для модификации.

Для объекта cssRule – правила @import (см. 4.3.12.3) определены три свойства (доступны только для чтения):

· href – URL в правиле @import;

· media – список имен устройств в правиле @import (коллекция MediaList – см. 4.5.8.2.1);

· styleSheet – таблица стилей (объект styleSheet), импортируемая в правиле @import (в Safari свойство не поддерживается и его значение равно null).

Для объекта cssRule – правила @media (см. 4.3.26.1) определены два свойства (доступны только для чтения):

· cssRules – коллекция правил стилей (объектов cssRule), которые определены для данного правила @media;

· media – список имен устройств, на которые распространяются действия правила @media (коллекция MediaList – см. 4.5.8.2.1).

Для правила @media также определены два метода:

· insertRule(правило, индекс) – для вставки нового правила (объекта cssRule) перед правилом с указанным индексом;

· deleteRule(индекс)– для удаления правила (объекта cssRule) с указанным индексом.

Для объекта cssRule – правила @page (см. 4.3.26.2) определены два свойства:

· selectorText – селектор правила @page (свойство доступно как для чтения, так и модификации);

· style – блок описания правила @page (только для чтения).

Пример 4.5.41. Модификация таблиц стилей:

В примере 4.5.40 были созданы две таблицы стилей: внешняя таблица (элемент link) из файла cssExt.css и внутренняя таблица стилей (элемент style), являющиеся элементами коллекции с индексами соответственно 0 и 1. Внутренняя таблица стилей пока не содержит никаких правил.

Добавим во внутреннюю таблицу следующие компоненты:

· импортируемую таблицу стилей cssImp.css с помощью правила @import;

· правило стилей для элемента h2;

· правило стилей для элемента h3.

Эти добавления выполняются с помощью следующего фрагмента сценария:

// Получение элемента коллекции

// для внутренней таблицы (элемента style)

intStyleSheet = document.styleSheets[1];

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

{

// Добавление импортируемой таблицы стилей

intStyleSheet.addImport("styles/cssImp.css");

// Добавление во внутреннюю таблицу стилей

// первого правила стилей для заголовка h2

intStyleSheet.addRule("h2",

"font-weight:bold;color:red");

// Добавление во внутреннюю таблицу стилей

// второго правила стилей для заголовка h3

intStyleSheet.addRule("h3","color:fuchsia");

// Установка для первого правила шрифта Georgia

intStyleSheet.rules(0).style.fontFamily = "Georgia";

// Установка для второго правила шрифта Verdana

intStyleSheet.rules(1).style.fontFamily = "Verdana";

}

else

{

// Активизация внутренней таблицы стилей

intStyleSheet.disabled = false;

//Добавление импортируемой таблицы стилей

intStyleSheet.insertRule(

"@import url(styles/cssImp.css);",0);

// Добавление во внутреннюю таблицу стилей

// первого правила стилей для заголовка h2

intStyleSheet.insertRule(

"h2 {font-weight:bold;color:red}",1);

// Добавление во внутреннюю таблицу стилей

// второго правила стилей для заголовка h3

intStyleSheet.insertRule("h3 {color:fuchsia}",2);

// Установка для первого правила шрифта Georgia

intStyleSheet.cssRules[1].style.fontFamily = "Georgia";

// Установка для второго правила шрифта Verdana

intStyleSheet.cssRules[2].style.fontFamily = "Verdana";

}

После этих добавлений вывод Web-страницы примет следующий вид:

Изменение цвета английских слов (для класса en) во внешней таблице стилей выполняется с помощью следующего фрагмента сценария:

// Получение элемента коллекции

// для внешней таблицы (элемента link)

extStyleSheet = document.styleSheets[0];

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

// Изменение цвета текста для английских слов

extStyleSheet.rules(2).style.color = "purple";

else

// Изменение цвета текста для английских слов

extStyleSheet.cssRules[2].style.color = "purple";

Вывод Web-страницы изменится следующим образом:

После удаления свойства color для элемента p и правила для элемента h2 во внешней таблице стилей с помощью следующего фрагмента сценария:

// Получение элемента коллекции

// для внешней таблицы (элемента link)

extStyleSheet = document.styleSheets[0];

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

{

// Удаление цвета текста для абзацев

extStyleSheet.rules(1).style.color = "";

// Удаление первого правила из внешней таблицы

extStyleSheet.removeRule(0);

}

else

{

// Удаление цвета текста для абзацев

extStyleSheet.cssRules[1].style.color = "";

// Удаление первого правила из внешней таблицы

extStyleSheet.deleteRule(0);

}

В результате Web-страница примет окончательный вид:

Получить значения цвета для элементов span класса en, h3 и span класса select можно с помощью следующего фрагмента сценария:

// Получение элемента коллекции

// для внешней таблицы (элемента link)

extStyleSheet = document.styleSheets[0];

// Получение элемента коллекции

// для внутренней таблицы (элемента style)

intStyleSheet = document.styleSheets[1];

// Если Web-браузер - Internet Explorer

if(navigator.userAgent.indexOf("MSIE")!= -1)

{

// Вывод цвета текста в абзацах

// (внешняя таблица стилей)

alert("Английские слова:\n selector='" +

extStyleSheet.rules(1).selectorText +

"'\n color='" +

extStyleSheet.rules(1).style.color + "'");

// Вывод цвета текста в заголовке h2

// (внутренняя таблица стилей)

alert("Заголовок второго уровня:\n selector='" +

intStyleSheet.rules(0).selectorText +

"'\n color='" +

intStyleSheet.rules(0).style.color + "'");

// Вывод цвета выделенного текста

// (импортируемая таблица стилей)

alert("Выделенный текст:\n selector='" +

intStyleSheet.imports(0).rules(0).selectorText +

"'\n color='" +

intStyleSheet.imports(0).rules(0).style.color + "'");

}

else

{

// Вывод цвета текста английских слов

// (внешняя таблица стилей)

alert("Английские слова:\n selector='" +

extStyleSheet.cssRules[1].selectorText +

"'\n color='" +

extStyleSheet.cssRules[1].style.color + "'");

// Вывод цвета текста в заголовке h2

// (внутренняя таблица стилей)

alert("Заголовок второго уровня:\n selector='" +

intStyleSheet.cssRules[1].selectorText +

"'\n color='" +

intStyleSheet.cssRules[1].style.color + "'");

// Если Web-браузер - не Safari

if(navigator.userAgent.indexOf("Safari") == -1)

{

// Получение импортируемой таблицы

// (объекта styleSheet)

impStyleSheet =

intStyleSheet.cssRules[0].styleSheet;

// Вывод цвета выделенного текста

alert("Выделенный текст:\n selector='" +

impStyleSheet.cssRules[0].selectorText +

"'\n color='" +

impStyleSheet.cssRules[0].style.color + "'");

}

}

В результате выполнения этого фрагмента сценария будут выведены следующие сообщения:

Последнее сообщение не будет выведено в Safari, поскольку в нем не определен объект StyleSheet для импортируемой таблицы стилей.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: