18 Scripts

Conteúdos

  1. Introdução aos scripts
  2. Concepção de documentos para os agentes que não suportem o [scripting]
    1. O elemento SCRIPT
    2. Especificando a linguagem de scripting:
    3. Acontecimentos intrínsecos
    4. Alterações dinâmicas dos documentos
  3. Concepção de documentos para os agentes que não suportem o [scripting]
    1. The NOSCRIPT element
    2. Escondendo os dados de script dos agentes usados pelos utentes

18.1 Introdução aos scripts

Um script do lado do cliente é um programa que pode acompanhar um documento HTML ou ser integrado nele directamente. O programa corre no engenho do cliente, ao se carregar o documento ou em qualquer outro momento, por exemplo, sempre que um link (ligação) seja activado. O suporte HTML para os scripts é independente da linguagem de script.

Os Scripts oferecem aos autores um meio de extender os documentos HTML de forma muito mais dinâmica e interactiva. Por exemplo:

Existem dois tipos de scripts que os autores poderão anexar a um documento HTML:

Nota: esta especificação inclui informação mais detalhada acerca da criação de scripts nas secções referentes às macros dos scripts.

18.2 Concepção de documentos para os agentes que suportem scripting

As secções que se seguem tratam de aspectos relacionados com os agentes que suportam a linguagem de script.

18.2.1 O elemento SCRIPT

<!ELEMENT SCRIPT - - %Script;          -- declarações de scripts -->
<!ATTLIST SCRIPT
  charset     %Charset;      #IMPLIED  -- codificação dos caracteres do recurso ligado --
  type        %ContentType;  #REQUIRED -- tipo de conteúdo da linguagem do script --
  src         %URI;          #IMPLIED  -- URI de um script externo --
  defer       (defer)        #IMPLIED  -- O agente usado pelo utente pode adiar a execução do script --
  >

"tag" de abertura: requerida, "tag" de encerramento: requirida

Definições do atributo

src = uri [CT]
Este atributo especifica a localização do script externo.
type = content-type [CI]
Este atributo especifica a linguagem de scripting dos conteúdos dos elementos e anula a linguagem de scripting que é estabelecida por defeito. A linguagem de scripting é especificada como tipo de conteúdo (por exemplo, “text/javascript”). Os autores têm que atribuir um atributo para este atributo. Não existe nenhum valor por defeito para este atributo.
language = cdata [CI]
Deprecado! Este atributo especifica a linguagem de scripting dos conteúdos deste elemento. O seu valor é um identificador para a linguagem, mas dado que esses identificadores não são estandartizados, este atributo foi deprecado, em favor do atributo type.
defer [CI]
Quando aplicado, este atributo boleano fornece uma pista ao agente, no sentido em que o script não irá gerar nenhum conteúdo de documento (por exemplo, nenhum "document.write" em javascript), podendo o agente continuar dessa maneira a processar e a exibir.

Atributos definidos noutros lugares:

O elemento SCRIPT posiciona um script no interior de um documento. Este elemento pode aparecer um qualquer número de vezes no HEAD ou BODY de um documento HTML.

O script pode ser definido no interior dos conteúdos do elemento SCRIPT ou num ficheiro externo. Se o atributo src não for aplicado, os agentes têm que interpretar os conteúdos do elemento na qualidade de script. Se src tiver um valor URI, os agentes deverão ignorar os conteúdos dos elementos e reaver o script através do URI. Note que o atributo charset se refere à codificação dos caracteres do script designado pelo atributo src; isso não tem nada a haver com o conteúdo do elemento SCRIPT.

Os scripts são avaliados por engenhos de script, os quais têm que ser conhecidos pelo agente que é usado pelo utente.

A sintaxe dos dados do script depende da linguagem a ele associada.

18.2.2 Especificando a linguagem do script

Dado queo HTML não se baseia numa linguagem de script específica, os autores dos documentos terão que indicar explicitamente aos agentes, qual a linguagem de cada script. Isso poderá ser feito através de uma declaração por defeito ou através de uma declaração local.

A linguagem do script por defeito:  

Os autores deveriam especificar a linguagem do script por defeito contida no documento, através da inclusão da declaração META no cabeçalho HEAD:

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

na qual "type" é um content type, designando a linguagem do script. Exemplos de valores incluindo "text/tcl", "text/javascript" e "text/vbscript".

Na ausência de uma declaração META, o valor por defeito pode ser dado por um cabeçalho HTTP do tipo "Content-Script-Type".

    Content-Script-Type: type

na qual "type" é de novo um content type designando a linguagem de script.

Os agentes deveriam definir a linguagem de script para um documento, de acordo com a seguinte hierarquia (da maior para a menor prioridade):

  1. Se alguma da declarações META especificar o "Content-Script-Type", a última que estiver contida no fluxo de caracteres determina a linguagem dos scripts que é definida por defeito.
  2. Senão, se existirem cabeçalhos HTTP que especifiquem o referido "Content-Script-Type", o última cabeçalho contido no fluxo de caracteres determina a linguagem do script que é definida por defeito.

Os documentos que não especifiquem a informação referente à linguagem do script que é definida por defeito e que contenham elementos especificando um script de um evento intrínseco serão considerados incorrectos. Os agentes poderão tentar ainda interpretar incorrectamente os scripts especificados, se bem que tal não lhes seja requerido. As ferramentas para a autoria dos documentos deveriam gerar informação referente à linguagem do script que se define por defeito, para ajudar os autores a evitar a criação de documentos incorrectos.

Declaração local da linguagem de script 

O atributo type tem de ser especificado em cada uma das aparições do elemento SCRIPT num documento. O valor do atributo type aplicado no elemento SCRIPT sobrepõe-se à linguagem de script por defeito que se lhe foi definida.

Neste exemplo, nós declaramos a linguagem de script por defeito como sendo “text/tcl”. Nós incluimos um SCRIPT no cabeçalho, cujo script esteja localizado num ficheiro externo e esteja escrito na linguagem de script "text/vbscript". Nós também incluimos um SCRIPT no corpo do documento, o qual contém o seu próprio script escrito em "text/javascript".

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>Um documento contendo 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">
...código em JavaScript... 
</SCRIPT>
</BODY>
</HTML>

Referências aos elementos HTML de um script 

Cada linguagem de script possui as suas próprias convenções para se referir aos objectos HTML a partir do interior de um script. Esta especificação não define nenhum mecanismo padrão para referência dos objectos HTML.

Ainda assim, os scripts dever-se-ão referir a um elemento, de acordo com o nome que lhes é atribuído. Os mecanismos de scripting deevriam ter em conta as seguintes regras de precedência, ao identificarem um elemento: o atributo name tem precedência sobre id, no caso de ambos serem utilizados. Doutra forma, apenas um deles poderá ser usado.

18.2.3 Acontecimentos intrínsecos

Nota: os autores dos documentos HTML são avisados para o facto das alterações ocorrerem igualmente no âmbito dos acontecimentos intrínsecos (ex: a forma como os scripts se ligam aos eventos). A investigação neste campo está a cargo dos membros do W3C Document Object Model Working Group (ver a página da W3C Web em http://www.w3.org/ para informações mais detalhadas).

Definições do atributo

onload = script [CT]
O evento onload ocorre quando o agente termina de carregar uma janela ou todas as molduras contidas no FRAMESET. Este atributo pode ser usado com os elementos BODY and FRAMESET.
onunload = script [CT]
O evento onunload ocorre quando o agente remove o documento da janela ou da moldura. Este atributo pode ser usado com os elementos BODY e FRAMESET.
onclick = script [CT]
O evento onclick ocorre quando se clica com o botão do engenho com a seta do cursor sobre o elemento desejado. Este atributo pode ser usado com a maioria dos elementos.
ondblclick = script [CT]
O evento ondblclick ocorre quando se clica com o botão do engenho duas vezes, com o cursor sobre o elemento desejado. Este atributo pode ser usado com a maioria dos elementos.
onmousedown = script [CT]
O evento onmousedown ocorre quando o se pressiona com o botão do engenho o cursor sobre um elemento. Este atributo pode ser usado com a maioria dos elementos.
onmouseup = script [CT]
O evento onmouseup ocorre quando o cursor é solto sobre um elemento. Este atributo pode ser usado com a maioria dos elementos.
onmouseover = script [CT]
O evento onmouseover ocorre quando a seta do cursor é movida para cima de um elemento. Este atributo pode ser usado com a maioria dos elementos.
onmousemove = script [CT]
O evento onmousemove ocorre quando o a seta do cursor é movida em cima do elemento. Este atributo pode ser usado com a maioria dos elementos.
onmouseout = script [CT]
Este evento onmouseout ocorre quando a seta do cursor é movida para fora do elemento. Este atributo pode ser usado com a maioria dos elementos.
onfocus = script [CT]
O evento onfocus ocorre quando um elemento é focalizado, quer através da seta do cursor, quer através da navegação do tabulador. Este atributo pode ser usado com os seguintes elementos: A, AREA, LABEL, INPUT, SELECT, TEXTAREA e BUTTON.
onblur = script [CT]
O evento onblur ocorre quando se deixa de focar o elemento, quer através do ponteiro do cursor, quer através da navegação do tabulador. Pode ser usado com os mesmos elementos que onfocus.
onkeypress = script [CT]
O evento onkeypress ocorre quando uma tecla é pressionada e solta sobre um elemento. Este atributo pode ser usado com a maioria dos elementos.
onkeydown = script [CT]
O evento onkeydown ocorre quando uma tecla é pressionada sobre um elemento. Este atributo pode ser usado com a maioria dos elementos.
onkeyup = script [CT]
O evento onkeyup ocorre quando uma tecla é solta sobre elemento. Este atributo pode ser usado com a maioria dos elementos.
onsubmit = script [CT]
O evento onsubmit ocorre quando um formulário é submetido. Ele aplica-se apenas ao elemento FORM.
onreset = script [CT]
O evento onreset ocorre quando um formulário é esvaziado. Ele aplica-se apenas ao elemento FORM.
onselect = script [CT]
O evento onselect ocorre quando o utente selecciona uma parte do texto no respectivo campo. Este atributo pode ser usado com os elementos INPUT e TEXTAREA.
onchange = script [CT]
O evento onchange ocorre quando um controlo perde o foco da entrada e o seu valor tenha sido modificado desde que recebeu o foco. Este atributo aplica-se aos seguintes elementos: INPUT, SELECT e TEXTAREA.

É possível associar-se uma acção a um certo número de eventos que ocorram quando o utente interage com o agente. Cada um dos “eventos intrínsecos" que foram acima listados assumem um valor, o qual consiste num script. O script é executado sempre que o evento ocorra para esse elemento. A sintaxe dos dados do script depende da linguagem a ele associada.

Elementos de controlo tais como INPUT, SELECT, BUTTON, TEXTAREA e LABEL obedecem a determinados eventos intrínsecos. Se esses elementos não aparecerem contidos num formulário, eles podem ser usados para aumentar o interface gráfico do documento destinado ao utente.

Por exemplo, os autores poderão querer incluir botões de pressionar nos seus documentos, os quais não submetam um formulário, mas que continuem a comunicar com o servidor quando forem accionados.

Os exemplos que se seguem, baseados nos acontecimentos intrínsecos, exibem alguns controlos possíveis e o comportamento do interface que é destinado ao utente.

No exemplo que se segue, userName é um campo de texto requerido. Quando o utente tenta abandonar o campo, o evento onblur activa uma função JavaScript para confirmar se userName tem ou não um valor aceitável.

<INPUT NAME="userName" onblur="validUserName(this.value)">

Eis aqui mais um exemplo em JAvaScript:

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

De seguida um exemplo em VBScript, relativo à gestão dos eventos para o campo de um 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>

Eis aqui um outro exemplo, usando 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>

Exemplo em JavaScript relacionado com a ligação de acontecimentos num script. Primeiramente, a gestão de um evento simples:

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

Exemplo do processamento de janelas:

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

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

Em Tcl ele teria o seguinte aspecto:

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

Note que o "document.write" ou outras declarações equivalentes nos processadores dos eventos intrínsecos originam um novo documento em vez de modificar o actual.

18.2.4 Alterações dinâmicas dos documentos

Os scripts que sejam executados quando um documento é carregado podem estar aptos a modificar os conteúdos do documento de uma forma dinâmica. Tal capacidade depende da linguagem do script em si (ex: a declaração de “document.write” no modelo do objecto HTML que é suportado por algumas firmas).

A modificação dinâmica de um documento pode ser modelada da seguinte forma:

  1. Todos os SCRIPT elementos são avaliados à medida que o documento é carregado.
  2. Serão avaliadas todas as construções que gerem SGML CDATA e que estejam contidas no elemento SCRIPT que é declarado. O seu texto gerado e combinado é inserido no documento, em vez do elemento SCRIPT.
  3. Os dados CDATA gerados são reavaliados.

Os documentos HTML estão constrangidos à conformidade com a DTD do HTML antes e depois do processamento de qualquer elemento SCRIPT.

O exemplo que se segue ilustra-nos a forma como os scripts poderão modificar o documento de uma forma dinâmica. O seguinte script:

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

tem o mesmo efeito que esta codificação em HTML:

 <TITLE>Documento Teste</TITLE>
 <P><B>Olá Mundo!</B>

18.3 Concepção de documentos para os agentes que não suportem o [scripting]

As secções que se seguem debatem a forma como os autores poderão criar documentos que funcionem nos agentes que não suportem o [scripting].

18.3.1 O elemento NOSCRIPT

<!ELEMENT NOSCRIPT - - (%block;)+
  -- contentor de conteúdos alternativos para exibições que não se baseiem nos scripts -->
<!ATTLIST NOSCRIPT
  %attrs;                              -- %coreattrs, %i18n, %events --
  >

"tag" de abertura: requerida, "tag" de encerramento: requerida

O elemento NOSCRIPT permite aos autores fornecerem um conteúdo alternativo, sempre que um script não seja executado. O conteúdo de um elemento NOSCRIPT deveria ser exibido por um agente com aptidão para os script apenas nos seguintes casos:

Os agentes que não suportem scripts no lado do cliente, terão de exibir os conteúdos deste elemento.

No exemplo que se segue, o agente que executa o SCRIPT inclui no documento dados criados de uma forma dinâmica. Se o agente não suportar scripts, o utente poderá reaver os dados na mesma, através de uma ligação.

<SCRIPT type="text/tcl">
 ...script em Tcl para a inserção de dados... 
</SCRIPT>
<NOSCRIPT>
 <P>Ligação a <A href="http://someplace.com/data">data.</A>
</NOSCRIPT>

18.3.2 Escondendo os dados de script dos agentes

Os agentes que não reconheçam o elemento SCRIPT exibirá na mesma os conteúdos do elemento sob a forma de texto. Alguns engenhos de scripting, incluindo os das linguagens JavaScript, VBScript eTcl, permitem que as declarações do script sejam anexadas num comentário SGML. Os agentes que não reconheçam o elemento SCRIPT ignorarão o comentário, ao passo que engenhos de scripting mais inteligentes compreenderão que o script contido nos comentários deverá ser executado.

Uma outra solução para o problema será manter os scripts em documentos externos e fazer-se referência a eles através do atributo src.

Comentando os scripts em JavaScripts
O engenho de JavaScript permite que a string “<!—“ ocorra no princípio de um elemento SCRIPT e ignora todos os outros caracteres até o fim da linha. O JavaScript interpreta "//" como sendo o princípio de um comentário, o qual se extende até ao fim da corrente linha. Isto é necessário para omitir a string "-->" ao processador de JavaScript.

<SCRIPT type="text/javascript">
<!--  para esconder os conteúdos do script dos navegadores mais antigos
  function square(i) {
    document.write("A chamada passou ", i ," à função.","<BR>")
    return i * i
  }
  document.write("A função devolveu ",square(5),".")
// final, escondendo os conteúdos dos navegadores mais antigos  -->
</SCRIPT>

Comentando os scripts em VBScript
No VBScript, uma única aspa poderá causar com que o resto da linha seja tratada como sendo um comentário. Ela poderá por isso mesmo ser usada para esconder a string "-->" do VBScript, como por exemplo:

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

Comentando os scripts em TCL
Em Tcl, o carácter "#" torna o resto da linha num comentário:

<SCRIPT type="text/tcl">
<!--  para esconder os conteúdos do script dos navegadores mais antigos
  proc square {i} {
    document write "The call passed $i to the function.<BR>"
    return [expr $i * $i]
  }
  document write "The function returned [square 5]."
# final, escondendo os conteúdos dos navegadores mais antigos  -->
</SCRIPT>

Nota: alguns navegadores encerram os comentários no primeiro carácter ">". Assim, de forma a esconder o conteúdo do script dos referidos navegadores, você poderá transpor os operandos para os operadores relacionais e de câmbio (SHIFT) (ex: use "y < x" em vez de "x > y") ou use alternativas da linguagem de scripting para ">".