18 Scripts

Índice

  1. Introdución aos scripts
  2. Deseño de documentos para axentes de usuário que aceitan scripts
    1. O elemento SCRIPT
    2. Especificación da linguaxe de script
    3. Acontecimentos intrínsecos
    4. Modificación dinámica de documentos
  3. Deseño de documentos para axentes de usuário que non aceitan scripts
    1. O elemento NOSCRIPT
    2. Esconder dados de scripts dos axentes de usuário

18.1 Introdución aos scripts

Un script (ou "guión") do lado do cliente é un programa que pode acompañar un documento HTML ou ir incrustado directamente nel. O programa corre na máquina cliente ao se carregar o documento ou noutro momento, como cando se activa un vínculo. Que a HTML aceite scripts é independente da linguaxe de script.

Os scripts oferecen-lles aos autores unha maneira de extender os documentos HTML en modos moi activos e interactivos. Por exemplo:

Hai dous tipos de scripts que os autores poden xuntar a un documento HTML:

Nota. Esta especificación inclui información máis detallada sobre os scripts nas seccións sobre macros de script .

18.2 Deseño de documentos para axentes de usuário que aceitan scripts

As seccións que seguen tratan cuestións concernentes aos axentes de usuário que aceitan scripst.

18.2.1 O elemento SCRIPT

<!ELEMENT SCRIPT - - %Script;          -- declaracións de script -->
<!ATTLIST SCRIPT
charset %Charset; #IMPLIED -- codificación de caracters do recurso vinculado --
type %ContentType; #REQUIRED -- tipo de conteúdos da linguaxe de script --
src %URI; #IMPLIED -- URI dun script externo --
defer (defer) #IMPLIED -- O axente de usuário pode demorar a execución dun script --
>

Etiqueta inicial: requerida, Etiqueta final: requerida

Definicións dos atributos

src = uri [CT]
Este atributo especifica a localización dun script externo.
type = content-type [CI]
Este atributo especifica a linguaxe de script dos conteúdos do elemento e substitue a linguaxe de script por omisión da páxina. A linguaxe de script especifica-se como tipo de conteúdo (p.ex.: "text/javascript"). Os autores deben fornecer un valor para este atributo. Non hai valor por omisión para este atributo.
language = cdata [CI]
Desaprovado. Este atributo especifica a linguaxe de script dos conteúdos deste elemento. O seu valor é un identificador da linguaxe, mais dado que estes identificadores non son padróns, este atributo está desaprovado en favor de type.
defer [CI]
Cando se selecciona, este atributo booleano proporciona-lle ao axente de usuário a suxestión de que o script non vai xerar conteúdo de documento (p.ex., algo como "document.write" en javascript) e asi, o axente de usuário pode continuar o procesamento e a apresentación.

Atributos que se definen noutro sítio

O elemento SCRIPT situa un script dentro dun documento. Este elemento pode aparecer várias veces no HEAD ("cabezallo") ou no BODY ("corpo") dun documento HTML.

O script pode-se definir cos conteúdos do elemento SCRIPT ou nun ficheiro externo. Se non se inclue o atributo src , os axentes de usuário deben interpretar os conteúdos do elemento como script. Se src ten un valor de URI, os axentes de usuário deben ignorar os conteúdos do elemento e recuperar o script por meio do URI. Observe-se que o atributo charset refere-se à codificación de caracteres do script designado polo atributo src ; non lle concerne ao conteúdo do elemento SCRIPT .

Os scripts avalian-se con motores de script que o axente de usuário debe coñecer.

A sintaxe dos dados de script depende da linguaxe do script.

18.2.2 Especificación da linguaxe de script

Dado que a HTML non depende dunha linguaxe de script concreta, os autores de documentos deben-lles indicar a linguaxe de cada script explicitamente aos axentes de usuário. Pode-se facer isto tanto mediante unha declaración por omisión ou mediante unha declaración local.

A linguaxe de script por omisión  

Os autores deberian especificar a linguaxe de script por omisión de todos os scripts dun documento incluindo a seguinte declaración META no HEAD :

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

na que "type" é un tipo de conteúdo co nome da linguaxe de script. Alguns exemplos de valores incluen "text/tcl", "text/javascript", "text/vbscript".

Na auséncia dunha declaración META o valor por omisión pode-se asignar cun cabezallo "Content-Script-Type" de HTTP.

    Content-Script-Type: type

no que "type" é, outra vez, un tipo de conteúdo co nome da linguaxe de script.

Os axentes de usuário deberian determinar a linguaxe de script por omisión dun documento dacordo cos pasos seguintes (de maior a menor prioridade):

  1. Se hai declaracións META que indiquen "Content-Script-Type", a derradeira do fluxo de caracteres determina a linguaxe de script por omisión.
  2. Se non é asi, se hai cabezallos de HTTP que indiquen "Content-Script-Type", o derradeiro no fluxo de caracteres determina a linguaxe de script por omisión.

Os documentos que non especifiquen a información da linguaxe de script por omisión e que conteñan elementos que especifican un script evento intrínseco son incorrectos. Os axentes de usuário poden, ainda asi, tentar interpretaren scripts especificados incorrectamentes, mais non se lles esixe. As ferramentas de creación deberian xerar información de linguaxe de script por omisión para axudar-lles aos autores a evitar crear documentos incorrectos.

Declaración local da linguaxe de script  

Hai que indicar o atributo type para cada aparición do elemento SCRIPT nun documento. O valor do atributo do atributo type dun elemento SCRIPT substitui a linguaxe de script por omisión dese elemento.

Neste exemplo, declaramos que a linguaxe de script por omisión é "text/tcl". Incluímos un SCRIPT no cabezallo, cuxo scrip se localiza nun ficheiro externo e está na linguaxe de script "text/vbscript". Tamén incluímos un SCRIPT no corpo que contén o seu próprio script escrito en "text/javascript".

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>Un documento SCRIPT</TITLE>
<META http-equiv="Content-Script-Type" content="text/tcl">
<SCRIPT type="text/vbscript" src="http://unsitio.com/progs/vbcalc">
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT type="text/javascript">
...código JavaScript... </SCRIPT> </BODY> </HTML>

Referéncias a elementos HTML desde un script  

Cada linguaxe de script usa as suas próprias convencións para se referir aos obxectos HTML desde o interior do script. Esta especificación non define un mecanismo padrón para se referir a obxectos HTML.

Porén, os scripts deberian-se referir a un elemento dacordo co seu nome asignado. Os motores de script deberian observar as seguintes regras de precedéncia ao identificar un elemento: un atributo name ten precedéncia sobre un id se apareceren os dous. De non ser asi poden-se usar tanto o un como o outro.

18.2.3 Eventos (acontecimentos) intrínsecos

Nota. Recomenda-se-lles aos autores de documentos HTML que probabelmente haberá alteracións no mundo dos acontecimentos intrínsecos (p.ex., como se ligan os scripts aos acontecimentos). A investigación neste ámbito está a ser realizada por membros do Grupo de traballo do W3C en Modelos de obxecto documento (ver o sítio do W3C en http://www.w3.org/ para máis información).

Definicións dos atributos

onload = script [CT]
O evento onload ("ao carregar") acontece cando o axente de usuário remata de carregar unha xanela ou todas as molduras dun FRAMESET . Pode-se usar este atributo cos elementos BODY e FRAMESET .
onunload = script [CT]
O evento onunload ("ao descarregar") acontece cando o axente de usuário retira un documento dunha xanela ou moldura. Este atributo pode-se usar cos elementos BODY e FRAMESET .
onclick = script [CT]
O evento onclick acontece cando se fai clic co botón do ponteiro sobre un elemento. Pode-se usar este atributo coa maioria dos elementos.
ondblclick = script [CT]
O evento ondblclick acontece cando o se fai dobre clic sobre un elemento co botón do mecanismo de ponteiro. Pode-se usar este atributo coa maioria dos elementos.
onmousedown = script [CT]
O evento onmousedown acontece cando se presiona o botón do mecanismo de ponteiro sobre un elemento. Pode-se usar este atributo coa maioria dos elementos.
onmouseup = script [CT]
O evento onmouseup acontece cando se solta o botón do mecanismo de ponteiro sobre un elemento. Pode-se usar este atributo coa maioria dos elementos.
onmouseover = script [CT]
O evento on mouseover acontece cando se move o mecanismo de ponteiro sobre un elemento. Pode-se usar este atributo coa maioria dos elementos.
onmousemove = script [CT]
O evento onmousemove acontece cando se move o mecanismo de ponteiro mentres este está sobre un elemento. Pode-se usar este atributo coa maioria dos elementos.
onmouseout = script [CT]
O evento onmouseout acontece cando se saca o mecanismo de ponteiro dun elemento Pode-se usar este atributo coa maioria dos elementos.
onfocus = script [CT]
O evento onfocus acontece cando un elemento recebe o foco tanto do mecanismo de ponteiro como da navegación con tabulador. Este atributo pode-se usar cos seguintes elementos: A , AREA , LABEL , INPUT , SELECT , TEXTAREA , e BUTTON .
onblur = script [CT]
O evento onblur acontece cando un elemento perde o foco tanto do mecanismo de ponteiro como da navegación con tabulador. Pode-se usar cos mesmos elementos que onfocus.
onkeypress = script [CT]
O evento onkeypress acontece cando se presiona unha tecla e se solta sobre un elemento. Pode-se usar este atributo coa maioria dos elementos.
onkeydown = script [CT]
O evento onkeydown acontece cando se presiona unha tecla sobre un elemento. Pode-se usar este atributo coa maioria dos elementos.
onkeyup = script [CT]
O evento onkeyup acontece cando se solta unha tecla sobre un elemento. Pode-se usar este atributo coa maioria dos elementos.
onsubmit = script [CT]
O eventoonsubmit acontece cando se envia un formjulário. Só se pode aplicar ao elemento FORM .
onreset = script [CT]
O evento onreset acontece cando se limpa un formulário. Só se pode aplicar ao elemento FORM .
onselect = script [CT]
O evento onselect acontece cando un usuário selecciona texto nun campo de texto. Este atributo pode-se usar cos elementos INPUT e TEXTAREA .
onchange = script [CT]
O evento onchange acontece cando un control perde o foco de entrada e o seu valor foi modificado desde que recebeu o foco. Este atributo pode-se aplicar aos seguintes elementos: INPUT , SELECT , e TEXTAREA .

É posíbel asociar unha acción cun certo número de eventos que acontecen cando un usuário interacciona cun axente de usuário. Cada un dos "acontecimentos intrínsecos" listados arriba toma un valor que é un script. O script executa-se sempre que o evento acontece para ese elemento. A sintaxe dos dados de script depende da linguaxe do script.

Os elementos de control como INPUT , SELECT , BUTTON , TEXTAREA , e LABEL respostan todos eles a determinados acontecimentos intrínsecos. Cando estes elementos non aparecen dentro dun formulário, poden-se usar para aumentar a interface gráfica de usuário do documento.

Por exemplo, os autores poden querer incluir botóns nos seus documentos que non envien un documento mais que se comuniquen cun servidor ao seren activados.

Os exemplos que seguen mostran comportamentos de control e interface de usuário posíbeis baseados en acontecimentos intrínsecos.

No exemplo seguinte, nomeUsuario é un campo de texto necesário. Cando un usuário tenta deixar o campo, o evento onblur chama unha función JavaScript para confirmar que nomeUsuario ten un valor aceitábel.

<INPUT NAME="nomeUsuario" onblur="nomeUsuarioValido(this.value)">

Velaqui outro exemplo JavaScript:

<INPUT NAME="num"
onchange="if (!checkNum(this.value, 1, 10))
{this.focus();this.select();} else {thanks()}"
VALUE="0">

Velaqui un exemplo en VBScript dun manipulador de eventos para un campo de texto:

    <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>

Velaqui un exemplo que usa 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>

Velaqui un exemplo en JavaScript dunha ligazón de evento dentro dun script. Primeiro, un manipulador de eventos simples:

    
<BUTTON type="button" name="omeuboton" value="10">
<SCRIPT type="text/javascript">
function omeu_onclick() {
. . .
}
document.form.omeuboton.onclick = omeu_onclick
</SCRIPT>
</BUTTON>

Velaqui un manipulador de xanelas máis interesante:

    
<SCRIPT type="text/javascript">
function omeu_onload() {
. . .
}

var win = window.open("some/other/URI")
if (win) win.onload = omeu_onload
</SCRIPT>

En Tcl é asi:

 <SCRIPT type="text/tcl">
proc omeu_onload {} {
. . .
}
set win [window open "some/other/URI"]
if {$win != ""} {
$win onload omeu_onload
}
</SCRIPT>

Observe-se que "document.write" ou outras declaracións equivalentes en manipuladores de eventos intrínsecos crean e escreben nun documento novo en vez de modificaren o actual.

18.2.4 Modificación dinámica de documentos

Os scripts que corren ao carregar un documento poden modificar os conteúdos do documento dinamicamente. A capacidade de facé-lo depende da própria linguaxe de script (p.ex., a afirmación "document.write" no modelo de obxecto HTML que aceitan algunhas empresas).

A modificación dinámica dun documento pode-se modelar como segue:

  1. Todos os elementos SCRIPT avalian-se en orde segundo o documento se carrega.
  2. Todos os construtos de script dentro dun elemento SCRIPT determinado que xeral CDATA de SGML CDATA son avaliados. O seu texto xerado combinado insire-se no documento en lugar do elemento SCRIPT .
  3. Re-avalia-se o CDATA xerado.

Os documentos HTML están forzados a seren conformes co DTD de HTML tanto antes como depóis de procesaren caisquer elementos SCRIPT .

O exemplo seguinte ilustra como poden os scripts modificaren un documento dinamicamente. O script seguinte:

 <TITLE>Documento de proba</TITLE>
<SCRIPT type="text/javascript">
document.write("<p><b>Olá Mundo!<\/b>")
</SCRIPT>

Ten o mesmo que este código HTML:

 <TITLE>Documento de proba</TITLE>
<P><B>Olá Mundo!</B>

18.3 Deseño de documentos para axentes de usuário que non aceitan scripts

A sección seguinte trata de como os autores poden crear documentos que funcionen para axetnes que non aceiten scripts.

18.3.1 O elemento NOSCRIPT

<!ELEMENT NOSCRIPT - - (%block;)+
-- contentor de conteúdo alternativo para representación non baseada en scripts -->
<!ATTLIST NOSCRIPT
%attrs; -- %coreattrs, %i18n, %events --
>

Etiqueta inicial: requerida, Etiqueta final: requerida

O elemento NOSCRIPT permite que os autores fornezan conteúdo alternativo cando non se executa un elemento. O conteúdo dun elemento NOSCRIPT deberia ser mostrado por un axente que coñeza os scripts só nos seguintes casos:

Os axentes de usuário que non aceitan scripts do lado do cliente deben mostrar os conteúdos deste elemento.

No exemplo seguinte, un axente de usuário que execute o SCRIPT incluirá no documento alguns dados creados dinamicamente. Ainda que o axente de usuário non aceite scripts, o usuário pode recuperar os dados por meio dun vínculo.

<SCRIPT type="text/tcl">
...script en Tcl para inserir dados ... </SCRIPT> <NOSCRIPT> <P>Consulte os <A href="http://unsitio.com/dados">dados.</A> </NOSCRIPT>

18.3.2 Esconder os dados de script dos axentes de usuário

Os axentes de usuário que non recoñecen o elemento SCRIPT probabelmente representarán como texto os conteúdos dese elemento. Alguns motores de script, incluídos os das linguaxes JavaScript, VBScript, e Tcl permiten encerrar as declaracións do script nun comentário Asi, os axentes de usuário que non recoñecen o elemento SCRIPT ignorarán o comentário mentres que os motores de script que o saiban comprenderán que deberán correr o script que está como comentário.

Outra solución ao problema é manter os scripts en documentos externos e referir-se a eles co atributo src .

Comentários dentro dos scripts en JavaScript
O motor de JavaScript permite que apareza a secuéncia "<!--" ao comezo dun elemento SCRIPT e ignora os demáis caracteres até ao final da liña. JavaScript interpreta "//" como que inícia un comentário que se extende até ao final da liña actual. Isto é necesário para esconder a secuéncia "-->" do procesador de JavaScript.

<SCRIPT type="text/javascript">
<!-- para esconder os conteúdos do script de browsers antigos
function square(i) {
document.write("A chamada pasada", i ," à función.","<BR>")
return i * i
}
document.write("A función deu ",square(5),".")
// remata de esconder os conteúdos de browsers antigos -->
</SCRIPT>

Comentários dentro dos scripts en VBScript
En VBScript, un carácter de aspas simples fai que o resto da liña actual se trate como un documento. Pode, polo tanto, usar-se para esconder a secuéncia "-->" de VBScript, por exemplo:

   <SCRIPT type="text/vbscript">
<!--
Sub oquesexa()
...
End Sub
' -->
</SCRIPT>

Comentários dentro dos scripts en TCL
En Tcl, o carácter "#" fai un comentário do resto da liña:

<SCRIPT type="text/tcl">
<!-- para esconder os conteúdos do script de browsers antigos
proc square {i} {
document write "A chamada pasada $i à función.<BR>"
return [expr $i * $i]
}
document write "A función deu [square 5]."
# remata de esconder os conteúdos de browsers antigos -->
</SCRIPT>

Nota. Alguns navegadores fechan os comentários co primeiro carácter ">", asi que para esconder o conteúdo do script deses browsers, poden-se transpor operandos para operadores relacionais e de cámbio (p.ex.: use "y<x" en vez de "x>y") ou use escapes dependentes da linguaxe de script para ">".