18 Скрипти

18.1 Введення в скрипти

Клієнтський скрипт - це програма, яка може супроводжувати документ HTML або безпосередньо бути впровадженої в нього. Ця програма виконується на клієнтській машині при завантаженні документа або в інший час, наприклад, коли активізується посилання. Підтримка скриптів в HTML не залежить від мови скрипта.

Скрипти пропонують авторам кошти посилення інтерактивності документів HTML. наприклад:

  • Скрипти можуть оцінюватися під час завантаження документа і динамічно змінювати вміст документа.
  • Скрипти можуть використовуватися в формі для обробки даних, що вводяться. Дизайнери можуть динамічно заповнювати поля форми в залежності від значень інших полів. Вони можуть перевіряти, чи потрапляють введені дані в зумовлений діапазон значень, відповідність полів і т.д.
  • Скрипти можуть включатися подіями, що впливають на документ, наприклад, завантаженням, вивантаженням, фокусом елемента, переміщенням миші і т.д.
  • Скрипти можуть зв'язуватися з керуючими елементами форми (наприклад, з кнопками) для представлення елементів призначеного для користувача інтерфейсу.

Автори можуть прикріплювати до документа HTML два типи скриптів:

  • Скрипти, що виконуються один раз при завантаженні документа агентом користувача. Скрипти, описані в елементі SCRIPT , виконуються при завантаженні документа. Для агентів користувача, що не обробляють скрипти, автори можуть визначити альтернативне вміст за допомогою елемента NOSCRIPT .
  • Скрипти, що виконуються кожен раз, коли відбувається певна подія. Ці скрипти можуть призначатися ряду елементів за допомогою атрибутів внутрішніх подій .

Примітка. Більш детальна інформація представлена в розділах про макросах скриптів .

18.2 Розробка документів для агентів користувача, що підтримують скрипти

Наступні розділи відносяться до агентам користувачів, що підтримують скрипти.

18.2.1 Елемент SCRIPT

  <! ELEMENT SCRIPT - - % Script;
  - Вираз script ->
 <! ATTLIST SCRIPT
  charset % Charset;
  #IMPLIED - Кодування символів пов'язаного ресурсу -
  type % ContentType;
  #REQUIRED - Тип вмісту мови скрипти -
  language CDATA #IMPLIED - визначене ім'я мови серіпта -
  src % URI;
  #IMPLIED - URI зовнішнього скрипта -
  defer (defer) #IMPLIED - агент користувача може відкласти виконання скрипта -
  >

Початковий тег: обов'язковий, Кінцевий тег: обов'язковий

визначення атрибутів

src = uri [CT]
Цей атрибут визначає місце розташування зовнішнього скрипта.
type = content-type [CI]
Цей атрибут задає мову сценарію вмісту елемента і має пріоритет над мовою скрипта, заданим за замовчуванням. Мова скрипта вказується як тип вмісту (наприклад, "text / javascript"). Автори повинні вказати значення цього атрибута. Значення за замовчуванням для цього атрибута не задано.
language = cdata [CI]
Небажаний. Цей атрибут визначає мову сценарію вмісту цього елемента. Його значенням є ідентифікатор мови, але оскільки ідентифікатори не стандартизовані, цей атрибут є небажаним, замість нього потрібно використовувати атрибут type.
defer [CI]
Якщо цей логічний атрибут встановлений, він забезпечує для агента користувача підказку про те, що скрипт не буде генерувати вміст документа (наприклад, "document.write" в javascript) і таким чином агент користувача може продовжувати синтаксичний розбір і уявлення документа.

Атрибути, обумовлені в будь-якому іншому місці

Елемент SCRIPT поміщає скрипт в документа. Цей елемент може вказуватися в елементі HEAD або BODY документа HTML кілька разів.

Скрипт може визначатися у вмісті елементу SCRIPT або в зовнішньому файлі. Якщо не встановлено атрибут src , агенти користувача повинні інтерпретувати вміст елемента як скрипт. Якщо для для атрибута src встановлено значення URI, агенти користувачів повинні ігнорувати вміст цього елементу і завантажувати скрипт через URI. Зверніть увагу, що атрибут charset відноситься до кодуванні символів скрипта, який призначається атрибутом src ; він не відноситься до вмісту елемента SCRIPT .

Скрипти оцінюються ядром скрипта, яке агент користувача повинен знати.

Синтаксис даних скрипта залежить від мови скрипта.

18.2.2 Вказівка мови скрипта

Оскільки документ HTML не передбачає певну мову скрипта, автори документа повинні явно повідомити агентам користувачів мову кожного скрипта. Це може виконуватися за допомогою оголошення скрипта за замовчуванням або за допомогою локального оголошення.

Мова скрипта за замовчуванням  

Автори повинні вказувати мову скрипта за замовчуванням для всіх скриптів в документі, включивши наступне оголошення META в тег HEAD :

  <META http-equiv = "Content-Script-Type" content = "type">

де "type" - тип вмісту , який іменує мову скрипта. Прикладами значень є "text / tcl", "text / javascript", "text / vbscript".

Якщо відсутня оголошення META , значення за замовчуванням може встановлюватися за допомогою заголовка протоколу HTTP "Content-Script-Type".

  Content-Script-Type: тип

де "тип" - тип вмісту, який іменує мову скрипта.

Агенти користувачів повинні визначати мову скрипта за замовчуванням для документа згідно з такими діями (пріоритет від вищого до нижчого):

  1. Якщо в оголошенні META задається "Content-Script-Type", мова скрипта за замовчуванням задається останнім таким оголошенням в потоці символів.
  2. В іншому випадку, якщо в заголовках HTTP задається "Content-Script-Type", мова скрипта за замовчуванням задається останнім таким оголошенням в потоці символів.

Документи, в яких не вказано мову скрипта за замовчуванням, але містяться елементи, що задають внутрішні події , є некоректними. Агенти користувачів можуть робити спроби інтерпретувати некоректно задані скрипти, але це не обов'язково. Засоби розробки повинні генерувати інформацію про мову скрипта за замовчуванням, щоб уникнути створення некоректних документів.

Локаьлное оголошення мови скрипта  

Мова скрипта можна задавати в кожному елементі SCRIPT за допомогою атрибута type. Якщо не вказано мову скрипта за замовчуванням, цей атрибут повинен встановлюватися для кожного елемента SCRIPT . Якщо заданий мову скрипта за замовчуванням, атрибут type має пріоритет над ним.

У цьому прикладі ми оголошуємо мова скриптів за замовчуванням: "text / tcl". У заголовок включається елемент SCRIPT , сам скрипт знаходиться в зовнішньому файлі і використовує мову "text / vbscript". Крім того, один елемент SCRIPT знаходиться в тілі документа і містить інший скрипт, написаний на мові "text / javascript".

  <! DOCTYPE HTML PUBLIC "- // W3C // DTD HTML 4.0 // EN"
  "Http://www.w3.org/TR/REC-html40/strict.dtd">
 <HTML>
 <HEAD>
 <TITLE> Документ зі скриптами </ 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 в скрипті. В даній специфікації не визначається стандартний механізм для посилання на об'єкти HTML.

Однак скрипти повинні посилатися на елементи відповідно до призначеного їм ім'ям. Ядро скриптів має дотримуватися при ідентифікації елемента наступні правила пріоритету: атрибут name має перевагу над атрибутом id , якщо встановлені обидва ці атрибута. В іншому випадку використовується встановлений атрибут.

18.2.3 Внутрішні події

Примітка. Повідомляємо авторам документів HTML, що в області внутрішніх подій (наприклад, в прив'язці скриптів до подій) дуже ймовірні зміни. Робота в цій області ведеться членами робочої групи по об'єктної моделі документів W3C (W3C Document Object Model Working Group) (більш детальну інформацію можна знайти на Web-сайті W3C за адресою http://www.w3.org/ ).

визначення атрибутів

onload = скрипт [CT]
Подія onload відбувається, коли агент користувача закінчує завантажувати вікно або всі фрейми елемента FRAMESET . Цей атрибут може використовуватися в елементах BODY і FRAMESET .
onunload = скрипт [CT]
Подія onunload відбувається, коли агент користувача видаляє документіз вікна або фрейму. Цей атрибут може використовуватися в елементах BODY і FRAMESET .
onclick = скрипт [CT]
Подія onclick відбувається при одноразовому натисканні кнопки указующего пристрою на елементі. Цей атрибут може використовуватися з більшістю елементів.
ondblclick = скрипт [CT]
Подія ondblclick відбувається при подвійному натисканні клавіші указующего пристрою на елементі. Цей атрибут може використовуватися з більшістю елементів.
onmousedown = скрипт [CT]
Подія onmousedown відбувається при натисканні кнопки указующего пристрою на елементі. Цей атрибут може використовуватися з більшістю елементів.
onmouseup = скрипт [CT]
Подія onmouseup відбувається при відпуску кнопки указующего пристрою на елементі. Цей атрибут може використовуватися з більшістю елементів.
onmouseover = скрипт [CT]
Подія onmouseover відбувається при переміщенні указующего пристрою на елемент. Цей атрибут може використовуватися з більшістю елементів.
onmousemove = скрипт [CT]
Подія onmousemove відбувається при переміщенні указующего пристрою, коли воно знаходиться на елементі. Цей атрибут може використовуватися з більшістю елементів.
onmouseout = скрипт [CT]
Подія onmouseout відбувається при переміщенні указующего пристрою за межі елемента. Цей атрибут може використовуватися з більшістю елементів.
onfocus = скрипт [CT]
Подія onfocus відбувається при отриманні елементом фокусу за допомогою вказівного пристрою або послідовності переходу. Цей атрибут може використовуватися з наступними елементами: LABEL , INPUT , SELECT, TEXTAREA і BUTTON .
onblur = скрипт [CT]
Подія onblur відбувається при переході фокуса з цього елемента за допомогою вказівного пристрою або послідовності переходу. Воно може використовуватися з тими ж елементами, що і onfocus.
onkeypress = скрипт [CT]
Подія onkeypress відбувається при натисканні і відпусканні клавіші на елементі. Цей атрибут може використовуватися з більшістю елементів.
onkeydown = скрипт [CT]
Подія onkeydown відбувається при натисканні клавіші на елементі. Цей атрибут може використовуватися з більшістю елементів.
onkeyup = скрипт [CT]
Подія onkeyup відбувається при відпуску клавіші на елементі. Цей атрибут може використовуватися з більшістю елементів.
onsubmit = скрипт [CT]
Подія onsubmit відбувається при відправці форми. Воно використовується тільки в елементі FORM .
onreset = скрипт [CT]
Подія onreset відбувається при скиданні форми. Воно використовується тільки в елементі FORM .
onselect = скрипт [CT]
Подія onselect відбувається при виділенні користувачем деякого тексту в текстовому полі. Цей атрибут може використовуватися з елементами INPUT і TEXTAREA .
onchange = скрипт [CT]
Подія onchange відбувається при втраті керуючим елементом фокусу введення, якщо його значення було змінено з моменту отримання фокусу. Цей атрибут використовується з наступними елементами: INPUT , SELECT і TEXTAREA .

Дія можна пов'язати з певним рядом подій, що відбуваються при взаємодії користувача з агентом. Значним кожного з перерахованих вище "внутрішніх подій" є скрипт. Цей скрипт виконується, якщо ця подія відбувається для цього елемента. Синтаксис скрипта залежить від мови скрипта.

Елементи управління , такі як 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" або еквівалентні вирази в обробниках внутрішніх подій створюють і виконують запис в новий документ, а не змінюють поточний.

18.2.4 Динамічна зміна документів

Скрипти, що виконуються при завантаженні документа, можуть динамічно змінювати вміст документа. Така можливість залежить від самої мови скрипта (наприклад, вираз "document.write" в об'єктної моделі HTML підтримується деякими виробниками).

Динамічна зміна документа може моделюватися наступним чином:

  1. Всі елементи SCRIPT оцінюються по порядку при завантаженні документа.
  2. Оцінюються всі конструкції скрипта в даному елементі SCRIPT , генеруючі SGML CDATA. Згенерований текст вставляється в документ замість елемента SCRIPT .
  3. Згенеровані CDATA оцінюються повторно.

Документи HTML обмежуються вимогою відповідності HTML DTD до і після обробки елементів SCRIPT .

У наступному прикладі показано, як скрипти можуть динамічно змінювати документ. Наступний скрипт:

  <TITLE> Тестовий документ </ TITLE>
  <SCRIPT type = "text / javascript">
  document.write ( "<p> <b> Hello World! <\ / b>")
  </ SCRIPT>

має той же ефект, що і розмітка HTML:

  <TITLE> Тестовий документ </ TITLE>
  <P> <B> Hello World! </ B>

18.3 Розробка документів для агентів користувачів, які не підтримують скрипти

У наступних розділах обговорюється створення документів для агентів користувачів, які не підтримують скрипти.

18.3.1 Елемент NOSCRIPT

  <! ELEMENT NOSCRIPT - - ( % block; ) +
  - Альтернативне вміст для подання без скриптів ->
 <! ATTLIST NOSCRIPT
  % attrs;
  - % Coreattrs , % i18n , % events -
  >

Початковий тег: обов'язковий, Кінцевий тег: обов'язковий

Елемент NOSCRIPT дозволяє авторам визначати альтернативне вміст, коли скрипт не виконується. Вміст елемента NOSCRIPT має генеруватися агентам користувачів, що підтримують скрипти, тільки в наступних випадках:
  • Агент користувача налаштований так, щоб не виконувати скрипти.
  • Агент користувача не підтримує мову скриптів, використовуваний елементом SCRIPT .

Агенти користувачів, які не підтримують клієнтські скрипти, повинні представляти вміст цього елементу.

У наступному прикладі агент користувача, який виконує елемент SCRIPT , включить в документ динамічно створювані дані. Якщо агент користувача не підтримує скрипти, користувач може завантажити ці дані по посиланню.

  <SCRIPT type = "text / tcl">
  ... скірпт на мові Tcl для вставки даних ... </ SCRIPT>
 <NOSCRIPT>
  <P> Доступ до даних <A href="http://someplace.com/data">. </A>
 </ NOSCRIPT>

18.3.2 Як приховати скрипт від агентів користувачів

Агенти користувачів, які не розпізнають елемент 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") або використовувати певні в мові скрипта способи обходу символу ">".