Содержание
Скрипты, таким образом, позволяют авторам расширить возможности документов HTML, как активные, так и интерактивные. Например:
Есть два вида скриптов, которые могут быть включены в документ HTML:
Примечание. Эта спецификация содержит более детальную информацию о сценариях в разделе о макросах сценариев.
В следующем разделе обсуждаются вопросы, касающиеся ПА, поддерживающих скрипты.
<!ELEMENT SCRIPT - - %Script; -- операторы скрипта --> <!ATTLIST SCRIPT charset %Charset; #ПРЕДПОЛАГАЕТСЯ -- набор символов связанного ресурса -- type %ContentType; #НЕОБХОДИМ -- тип содержимого языка скрипта -- src %URI; #ПРЕДПОЛАГАЕТСЯ -- URI внешнего скрипта -- defer (defer) #ПРЕДПОЛАГАЕТСЯ -- ПА могут отложить исполнение скрипта -- >
Начальный тег: необходим, Конечный тег: необходим
Определения атрибутов
Атрибут, определённый в другом месте
Элемент SCRIPT помещает скрипт в документ. Этот элемент может появляться любое число раз в HEAD и BODY документа HTML.
Скрипт может быть определён внутри элемента SCRIPT или во внешнем файле. Если атрибут src не установлен, ПА должен интерпретировать содержимое элемента как скрипт. Если src имеет значение URI, ПА должен игнорировать содержимое элемента и затребовать скрипт по URI.
Обратите внимание, что атрибут charset относится к кодировке символов скрипта, обозначенного атрибутом src; он не касается содержимого элемента SCRIPT.
Скрипты выполняются машиной скриптов, которая должна быть известна пользовательскому агенту.
Синтаксис данных скрипта зависит от языка скриптов.
Поскольку HTML не соотносится с определённым языком сценариев, авторы документа должны однозначно указать ПА язык каждого скрипта. Это можно сделать, объявив значение по умолчанию или локально.
Авторы должны определить язык скриптов по умолчанию для всех скриптов в документе, включив следующее META объявление в HEAD:
<META http-equiv="Content-Script-Type" content="type">
где "type" - это content type/тип содержимого, называющий язык скриптов. Примеры - "text/tcl", "text/javascript", "text/vbscript".
В отсутствие META объявления, значение по умолчанию может быть установлено заголовком "Content-Script-Type" HTTP:
Content-Script-Type: type
где "type" это опять же content type/тип содержимого, называющий язык скриптов.
ПА должны определить язык скрипта по умолчанию в такой последовательности (приоритет от высшего к низшему):
Документы, в которых язык скриптов по умолчанию не определён, и которые содержат элементы со скриптами внутренних событий, являются некорректными. ПА могут попытаться интерпретировать некорректно определённые скрипты, но это не обязательно. Авторские утилиты должны генерировать информацию о языке скриптов по умолчанию, чтобы помочь избежать создания некорректных документов.
Атрибут type должен быть определён для каждого элемента SCRIPT в документе. Значение атрибута type элемента SCRIPT переопределяет язык скриптов по умолчанию для данного элемента.
В это примере мы объявляем язык скриптов по умолчанию "text/tcl". Мы включаем один SCRIPT в "шапку", чей скрипт находится во внешнем файле и написан на языке "text/vbscript". Мы также включили SCRIPT в тело документа, который сам содержит собственный скрипт, написанный на "text/javascript".
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <HTML> <HEAD> <TITLE>A document with SCRIPT</TITLE> <META http-equiv="Content-Script-Type" content="text/tcl"> <SCRIPT type="text/vbscript" src="http://someplace.com/progs/vbcalc"> </SCRIPT> </HEAD> <BODY> <SCRIPT type="text/javascript"> ...сценарий JavaScript... </SCRIPT> </BODY> </HTML>
У каждого языка скриптов есть свой набор соглашений о том, как ссылаться на объекты HTML из скрипта. Эта спецификация не определяет стандартный механизм ссылки на объекты HTML.
В то же время, скрипты должны ссылаться на элемент в соответствии с его установленным именем. Машины скриптов должны соблюдать правило старшинства при идентификации элемента: атрибут name имеет преимущество перед атрибутом id, если оба установлены. Иначе тот или другой могут быть использованы.
Примечание. Обращаем внимание авторов документов HTML, что изменения вскоре могут появиться в определении внутренних событий (напр., как скрипты ограничены событиями). Исследования в этой сфере проводятся членами W3C Document Object Model Working Group (см. W3C сайт http://www.w3.org/).
Определения атрибутов
Можно ассоциировать действие с определённым количеством событий, возникающих при взаимодействии пользователя с ПА. Каждое из "внутренних событий", перечисленных выше, имеет значение - скрипт. Скрипт выполняется , как только возникает событие в данном элементе. Синтаксис данных скрипта зависит от языка скрипта.
ЭУ, такие как INPUT, SELECT, BUTTON, TEXTAREA и LABEL, все откликаются на определённые внутренние события. Если эти элементы находятся вне формы, они могут использоваться для расширения возможностей пользовательского интерфейса документа.
К примеру, авторы могут вставить в документ кнопку, которая не отправляет форму, а взаимодействует с сервером при активации.
Следующие примеры показывают некоторые ЭУ и действия пользовательского интерфейса на базе внутренних событий.
Здесь заполнение поля userName является необходимым. Если пользователь переносит фокус с этого поля, событие onblur вызовет функцию JavaScript для того, чтобы удостовериться, что userName содержит приемлемое значение:
<INPUT NAME="userName" onblur="validUserName(this.value)">
Вот пример другого JavaScript:
<INPUT NAME="num" onchange="if (!checkNum(this.value, 1, 10)) {this.focus();this.select();} else {thanks()}" VALUE="0">
Пример VBScript-обработчика события для текстового поля:
<INPUT name="edit1" size="50"> <SCRIPT type="text/vbscript"> Sub edit1_changed() If edit1.value = "abc" Then button1.enabled = True Else button1.enabled = False End If End Sub </SCRIPT>
Пример с использованием Tcl:
<INPUT name="edit1" size="50"> <SCRIPT type="text/tcl"> proc edit1_changed {} { if {[edit value] == abc} { button1 enable 1 } else { button1 enable 0 } } edit1 onChange edit1_changed </SCRIPT>
Пример JavaScript для события, связанного со скриптом. Сначала - простой обработчик щелчка кнопки:
<BUTTON type="button" name="mybutton" value="10"> <SCRIPT type="text/javascript"> function my_onclick() { . . . } document.form.mybutton.onclick = my_onclick </SCRIPT> </BUTTON>
Более интересный обработчик окна:
<SCRIPT type="text/javascript"> function my_onload() { . . . } var win = window.open("some/other/URI") if (win) win.onload = my_onload </SCRIPT>
В Tcl это выглядит похоже:
<SCRIPT type="text/tcl"> proc my_onload {} { . . . } set win [window open "some/other/URI"] if {$win != ""} { $win onload my_onload } </SCRIPT>
Учтите, что "document.write" или аналогичные операторы в обработчиках внутренних событий создают новый документ и записывают туда, а не модифицируют текущий документ.
Динамическая модификация документа может быть смоделирована так:
Документы HTML должны соответствовать Определению Типа Данных (ОТД) HTML и до, и после обработки элемента SCRIPT.
Следующий пример иллюстрирует, как скрипты могут модифицировать документ динамически.
Скрипт:
<TITLE>Test Document</TITLE> <SCRIPT type="text/javascript"> document.write("<p><b>Hello World!<\/b>") </SCRIPT>
работает так же, как и :
<TITLE>Test Document</TITLE> <P><B>Hello World!</B>
В данном разделе рассматривается, как авторы могут создать документ, работающий с ПА, не поддерживающими скрипты.
<!ELEMENT NOSCRIPT - - (%block;)+ -- контейнер для альтернативного содержимого при отображении без использования скриптов --> <!ATTLIST NOSCRIPT %attrs; -- %coreattrs, %i18n, %events -- >
Начальный тег: необходим, Конечный тег: необходим
Элемент NOSCRIPT даёт авторам возможность предоставить альтернативное содержимое, если скрипт не выполняется. Содержимое элемента NOSCRIPT должно отображаться ПА, "понимающим" скрипты, только в следующих случаях:ПА, не поддерживающие скрипты на стороне клиента, обязаны выводить содержимое этого элемента.
В следующем примере ПА, исполняющий SCRIPT, будет включать некоторые динамически создаваемые данные в документ. Если ПА не поддерживает скрипты, пользователь сможет запросить данные по гиперссылке.
<SCRIPT type="text/tcl"> ...некоторый скрипт Tcl для вставки данных... </SCRIPT> <NOSCRIPT> <P>Перейдите на <A href="http://someplace.com/data">data.</A> </NOSCRIPT>
Есть вероятность того, что ПА, не распознающие элемент SCRIPT, будут рассматривать его содержимое как текст. Некоторые машины скриптов, в том числе для языков JavaScript, VBScript и Tcl, разрешают включение операторов скрипта в комментарий SGML. ПА, не распознающие элемент SCRIPT, будут тогда игнорировать комментарий, в то время как более совершенные машины скриптов "поймут", что скрипт внутри комментария должен выполняться.
Другим решением проблемы является сохранение скриптов во внешнем документе и ссылка на него с помощью атрибута src.
Комментирование скриптов в JavaScript
Машина JavaScript допускает "<!--" как начало элемента SCRIPT и игнорирует оставшиеся символы до конца строки. JavaScript интерпретирует "//" как начало комментария до конца текущей строки. Это необходимо, чтобы спрятать "-->" от
разборщика JavaScript.
<SCRIPT type="text/javascript"> <!-- прячет содержимое скрипта от старых браузеров function square(i) { document.write("Вызов передан функции", i "<BR>") return i * i } document.write("Функция возвратила ",square(5),".") // конец скрытия содержимого от старых браузеров --> </SCRIPT>
Комментирование скриптов в VBScript
В VBScript одиночная кавычка указывает, что оставшаяся часть строки должна рассматриваться как комментарий. Таким образом, она может использоваться для скрытия "-->" от VBScript, например:
<SCRIPT type="text/vbscript"> <!-- Sub foo() ... End Sub ' --> </SCRIPT>
Комментирование скриптов в TCL
В Tcl символ"#" обозначает комментарий до конца строки:
<SCRIPT type="text/tcl"> <!-- прячет содержимое скрипта от старых браузеров proc square {i} { document write "Вызов передан функции $i.<BR>" return [expr $i * $i] } document write "Функция вернула [square 5]." # конец скрытия содержимого от старых браузеров --> </SCRIPT>
Примечание. Некоторые браузеры закрывают комментарий при обнаружении первого символа ">", поэтому, для того, чтобы спрятать скрипт от таких браузеров, Вы можете поменять местами операнды в операторах сравнения и смещения (напр., использовать "y < x" вместо "x > y") или использовать зависимые от языка скриптов escape-последовательности для ">".