Использование компонентов HTML для реализации поведения DHTML в скрипте
Элементы динамического HTML (DHTML) — это компоненты, которые могут быть реализованы несколькими способами. Многие годы при написании компонентов разработчики были ограничены использованием Microsoft Visual C++, Microsoft Visual Basic и Java. Начиная с Microsoft Internet Explorer 5, разработчики скриптов могут использовать компонент HTML Component (HTC) или Windows Script Component (WSC) для реализации требуемого поведения DHTML в скрипте, используя Visual Basic Scripting Edition (VBScript), Microsoft JScript (совместимый со спецификацией языка ECMA 262) или любой язык скриптов независимого разработчика, поддерживающий интерфейсы скриптов Microsoft ActiveX Scripting. В этой статье описываются шаги использования файлов HTC для создания динамического поведения в скрипте. Дополнительные сведения о создании динамического поведения с помощью WSC см. в статье Технологии скриптов в Microsoft Windows. В этой статье предполагается, что читатель хорошо разбирается в программировании скриптов и знаком с поведением HTC и DHTML. Реализация динамического поведения в Visual C++ не рассматривается в данной статье. Дополнительные сведения о поведении DHTML, HTC, WSC и интерфейсах Visual C++, используемых в реализации динамического поведения, см. в разделе Связанные темы. Познакомившись с этой статьей, читатель должен научиться реализовывать динамическое поведение в выбранном языке скриптов, изолировать скрипт от контента и пользоваться преимуществами инкапсуляции и возможности повторного использования кода на веб-сайте. Эта статья разделяется на следующие разделы.
Обзор HTC Появившиеся в Internet Explorer 5, компоненты HTCпредоставляют простой механизм реализации поведения DHTML в скрипте. Файл HTC — это такой же HTML-файл, сохраненный с расширением HTC и содержащий скрипты и набор специфических для HTC элементов, предоставляющих свойства, методы и события, определяющие компонент. Будучи HTML-файлом, HTC предоставляет ко всем элементам на странице такой же доступ, как и DHTML. Это означает, что внутри HTC все элементы HTCдоступны из скрипта как объекты с помощью их атрибутов id. Это позволяет во всем сценарии динамически работать со всеми атрибутами и методами элементов HTC как со свойствами и методами этих объектов. Компоненты HTC можно использовать для реализации следующих преимуществ:
Дополнительные сведения о каждом из элементов, свойств, методов HTC, описанных в этом разделе, см. в статье Справочник по HTC. Создание HTC Шаги по созданию HTC показаны в следующем примере, реализующем эффект выделения при наведении указателя мыши.
Предоставление свойств HTC может предоставлять свой набор свойств, используя элемент PROPERTY. Например, предыдущий пример выделения при наведении указателя мыши может быть расширен, чтобы предоставить свойство hiliteColor, позволяющее задать цвет выделяемого текста. При этом можно использовать элемент PUBLIC:PROPERTY, чтобы определить свойство, как показано в следующем коде. <PUBLIC:PROPERTY NAME="hiliteColor" /> После определения свойства на него можно ссылаться в коде компонентов HTC, как показано в следующем примере. Обратите внимание, что этот код определяет значение свойства равным "red" (красный), если содержащая страница специально не задает это значение. <PUBLIC:PROPERTY NAME="hiliteColor" /> <PUBLIC:ATTACH EVENT="onload" FOR="window" ONEVENT="initColors()" /> <SCRIPT LANGUAGE="JScript"> function initColors() { // инициализировать свойство hiliteColor = (hiliteColor == null) ? "red", hiliteColor; } </SCRIPT> В следующем примере эффект выделения при наведении указателя мыши применяется к содержанию, изменяя цвет привязок при наведении указателя мыши на текст. Обратите внимание, что при наведении указателя мыши цвет привязок для первого списка меняется на зеленый, а для второго списка цвет привязок просто меняется на цвет по умолчанию, красный. Как объясняется в предыдущем абзаце, если для содержащей страницы специально не определено свойство hiliteColor, по умолчанию устанавливается красный цвет. <style> .CollapsingAndHiliting {behavior:url(ul.htc) url(hilite2.htc)} A {behavior:url(hilite2.htc)} </style> <UL> <LI CLASS="CollapsingAndHiliting" CHILD="Topics1">Разработка HTML</LI> <UL ID="Topics1"> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Руководство для начинающих</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Советы по разработке IE4.0</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Фон ячеек таблицы</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Перетаскивание заглавных букв</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Сервер цитат</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Мастер HTML</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Д-р HTML</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Вопросы и ответы по кодированию HTML для Internet Explorer</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">SGML DTD для разметки Internet Explorer 3.0</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Основы разработки</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Разработка эффективных страниц</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Дизайн эффективных страниц</A></LI> <LI><A HILITECOLOR="green" HREF="/workshop/author/default.asp">Использование фреймов</A></LI> </UL> <LI><A HREF="/workshop/author/default.asp">Разработка справки HTML</A></LI> <LI CLASS="CollapsingAndHiliting" CHILD="Topics2">Ссылки HTML</LI> <UL ID="Topics2"> <LI><A HREF="/workshop/author/default.htm">Элементы</A></LI> <LI><A HREF="/workshop/author/default.htm">Наборы знаков</A></LI> </UL> <LI CLASS="CollapsingAndHiliting" CHILD="Topics3">Приложения HTML (HTA)</LI> <UL ID="Topics3"> <LI><A HREF="/workshop/author/default.htm">Обзор</A></LI> <LI><A HREF="/workshop/author/default.htm">Справочник</A></LI> </UL> </UL> Пример кода. http://samples.msdn.microsoft.com/workshop/samples/components/htc/toc/toc2.htm Примечание. Поведение элемента по умолчанию можно переопределить, предоставляя свойство, имя которого совпадает с именем свойства, уже определенного для элемента. Например, поведение, предоставляющее свойство href, может эффективно переопределять свойство по умолчанию href элемента a, если это поведение применяется к элементу a на странице. Использование атрибута INTERNALNAME При предоставлении свойства в HTC можно задать в элементе PUBLIC:PROPERTY как атрибут NAME, так и атрибут INTERNALNAME. Если заданы оба имени, NAMEиспользуется для ссылки на свойство из содержащего документа, а INTERNALNAME используется для ссылки на то же свойство в HTC. При задании для свойства атрибута INTERNALNAME имя переменной, прежде чем на него можно будет ссылаться в любом месте компонента, должно быть объявлено глобально и инициализировано. Невыполнение этого требования приводит либо к ошибке скрипта, показывая, что имя переменной не определено, либо к возвращению в содержащий документ неправильного значения свойства. Задание либо атрибута PUT, либо атрибута GET в объявлении PUBLIC:PROPERTY приводит к игнорированию атрибута INTERNALNAME, если атрибут INTERNALNAME задан. Задание и/или возвращение значения свойства с помощью функции (функций), заданной в атрибутах PUT и GET, обладает приоритетом над заданием и/или возвращением значения свойства с помощью INTERNALNAME. Предоставление методов С помощью элемента PUBLIC:METHOD компонент HTC может предоставить свой набор методов, как показано в следующем коде. <PUBLIC:METHOD NAME="startFlying" /> После своего определения метод может напрямую использоваться в коде HTC, как показано в следующем примере, реализующем эффект полета для групп текста на странице. <PUBLIC:METHOD NAME="tick" /> <PUBLIC:METHOD NAME="startFlying" /> : <SCRIPT LANGUAGE="JScript"> var currCount; var flyCount; var flying; var msecs; var oTop, oLeft; msecs = 50; flyCount = 20; flying = false; runtimeStyle.position = "relative"; runtimeStyle.visibility = "hidden"; window.attachEvent("onload", onload); function onload() { // задержка отсчитывается от события window.onLoad if (delay != "none") { window.setTimeout(uniqueID+".tick()", delay); } } function tick() { if (flying == false) { startFlying(); } else { doFly(); } } function startFlying() { if (fromX==null && fromY==null) { if (from=="top") { runtimeStyle.posTop = -offsetTop-offsetHeight; } else if (from=="bottom") { runtimeStyle.posTop = element.document.body.clientHeight; } else if (from=="right" ) { runtimeStyle.posLeft = element.document.body.clientWidth; } else { runtimeStyle.posLeft = -offsetLeft-offsetWidth; } } else { runtimeStyle.posTop = fromY; runtimeStyle.posLeft = fromX; } runtimeStyle.visibility = "visible"; flying = true; oTop = runtimeStyle.posTop; oLeft = runtimeStyle.posLeft; currCount = 0; doFly(); } function doFly() { var dt, dl; currCount++; dt = oTop / flyCount; dl = oLeft / flyCount; runtimeStyle.posTop -= dt; runtimeStyle.posLeft -= dl; if (currCount < flyCount) { window.setTimeout(uniqueID+".tick();", msecs); } else { runtimeStyle.posTop = 0; runtimeStyle.posLeft = 0; flying = false; evObj = createEventObject(); evObj.setAttribute("resulty", uniqueID); finished.fire(evObj); } } </SCRIPT> Пример кода. http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/CustomTags/CustomFlying.htm Примечание. Аналогично элементу PUBLIC:PROPERTY, можно задать INTERNALNAME в объявлении METHOD, чтобы имя, используемое на содержащей странице для ссылки на метод, отличалось от имени, используемого для ссылки на метод в компоненте HTC. Кроме того, поведение элемента по умолчанию можно переопределить, предоставляя метод, имя которого совпадает с именем метода, уже определенного для элемента. Например, поведение, предоставляющее метод click, может эффективно переопределять метод по умолчанию click элемента a, если это поведение применяется к элементу a на странице. Предоставление настраиваемых событий С помощью элемента PUBLIC:EVENT компонент HTC может определить настраиваемые события и предоставить их содержащей странице. В следующем коде показано, как калькулятор, реализующий компонент HTC, определяет настраиваемое событие — onResultChange, используя элемент EVENT. Когда событие происходит для содержащей страницы, результирующее значение передается обратно на страницу, устанавливая свойство expando — результат — объекта события. <PUBLIC:EVENT NAME=onResultChange ID=rcID /> <SCRIPT LANGUAGE="JScript"> : oEvent = createEventObject(); oEvent.result = sResult; rcID.fire (oEvent); : </SCRIPT> Следующий пример показывает, как должна выглядеть содержащая страница. <HTML XMLNS:InetSDK> <HEAD> <TITLE>Пример калькулятора</TITLE> <STYLE> INPUT {font-family: Courier New} @media all { InetSDK\:CALC {behavior:url(Engine.htc)} } </STYLE> <LINK REL="stylesheet" HREF="/workshop/basicSDKIE4.css" TYPE="text/css"> </HEAD> <BODY BGCOLOR="#FFFFFF"> <BLOCKQUOTE CLASS="body"> <P> <InetSDK:CALC id="myCalc" onResultChange="resultWindow.innerText =window.event.result"> <TABLE> <TR> <TD COLSPAN=5> <DIV ID="resultWindow" STYLE="padding:5; background-color:buttonface" ALIGN="RIGHT">0.</DIV> </TD> </TR> <TR> <TD><INPUT TYPE=BUTTON VALUE=" 7 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" 8 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" 9 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" / "></TD> <TD><INPUT TYPE=BUTTON VALUE=" C "></TD> </TR> <TR> <TD><INPUT TYPE=BUTTON VALUE=" 4 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" 5 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" 6 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" * "></TD> <TD><INPUT TYPE=BUTTON VALUE=" % " DISABLED></TD> </TR> <TR> <TD><INPUT TYPE=BUTTON VALUE=" 1 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" 2 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" 3 "></TD> <TD><INPUT TYPE=BUTTON VALUE=" - "></TD> <TD><INPUT TYPE=BUTTON VALUE="1/x" DISABLED></TD> </TR> <TR> <TD><INPUT TYPE=BUTTON VALUE=" 0 "></TD> <TD><INPUT TYPE=BUTTON VALUE="+/-"></TD> <TD><INPUT TYPE=BUTTON VALUE=" . "></TD> <TD><INPUT TYPE=BUTTON VALUE="+/-"></TD> <TD><INPUT TYPE=BUTTON VALUE=" = "></TD> </TR> </TABLE> </InetSDK:CALC> </BLOCKQUOTE> </BODY> </HTML> Пример кода. http://samples.msdn.microsoft.com/workshop/samples/components/htc/calc/calc.htm Примечание. Поведение элемента по умолчанию можно переопределить, предоставляя событие, имя которого совпадает с именем события, уже определенного для элемента. Например, поведение, предоставляющее событие onclick, может эффективно переопределять событие по умолчанию onclick элемента a, если это поведение применяется к элементу a на странице. Получение уведомлений HTC может подключить к событиям, происходящим на содержащей странице, используя элемент ATTACH. С помощью этого элемента HTC можно подключить к стандартным событиям DHTML, а также к специфическим для HTC событиям, перечисленным в статье Справочник по HTC. Примечание. HTC также может использовать метод attachEvent, чтобы получать уведомления от содержащей страницы. Но при этом возникает ряд недостатков.
Правила области применения При работе с компонентами HTC используются три пространства имен: поведения, элемента и содержащей страницы. Для компонентов определен набор правил области применения, помогающий определить порядок разрешения конфликтов имен. При этом используется следующий порядок приоритетов при разрешении конфликтов, от самого высокого к самому низкому:
Это означает, что если компонент HTC определяет глобальную переменную, вызывающую событие, любая ссылка на событие в HTC будет разрешена как эта глобальная переменная. Правильный способ ссылки на свойство события объекта window в этом HTC — использовать конструкцию window.событие. В следующем примере обратите внимание на разрешение имен с использованием приведенных выше правил области применения.
<SCRIPT LANGUAGE="JScript"> var normalColor, normalSpacing; attachEvent("onmouseover", event_onmouseover); attachEvent("onmouseout", event_onmouseout); function event_onmouseover() { // сохранить исходные значения normalColor = style.color; normalSpacing= style.letterSpacing; runtimeStyle.color = "red"; runtimeStyle.letterSpacing = 2; } function event_onmouseout() { // восстановить исходные значения runtimeStyle.color = normalColor; runtimeStyle.letterSpacing = normalSpacing; } </SCRIPT> Вопросы синхронизации При создании поведения важно знать, когда применять поведение к элементу. До применения поведения доступ к значениям свойств, определенных для поведения, которые могут задаваться из документа, может оказаться недоступным для скриптов. Чтобы гарантировать полноту загрузки и применения поведения к элементу, важно дождаться, пока произойдет событие onreadystatechange, а затем проверить, что свойство readyState элемента установлено равным complete. Пока это событие не произойдет, попытка использовать любые члены, определенные поведением, до привязки поведения к элементу может привести к ошибке скрипта, показывающей, что объект не поддерживает этот конкретное свойство или этот метод. Примечание. По мере разбора и загрузки поведения и содержащего его документа поведение получает уведомления о выполнении с помощью уведомлений oncontentready и ondocumentready. Уведомление oncontentready приходит, когда контент элемента полностью разобран. В этот момент для возвращения правильного значения поведение может воспользоваться свойством innerHTML элемента. Уведомление ondocumentready приходит после полной загрузки документа, включая все скрипты, изображения, элементы управления ActiveX и все остальные файлы страницы, которые должны быть загружены отдельно. Связанные с поведением улучшения объектной модели DHTML Начиная с Internet Explorer 5, в объектную модель DHTML для поддержки поведения были внесены следующие улучшения.
Связанные темы Следующие ссылки содержат дополнительные сведения о поведении DHTML. |
Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.