Janelas e Frames
O JavaScript dispõe de cinco objectos
directamente relacionados com o browser, documentos visualizados e
janelas: o window, frame, document, navigator e screen.
Estes objectos foram já descritos, o objectivo
é mostrar como gerir janelas e frames
em páginas Web, usando o JavaScript como
linguagem de suporte.
window
Este objecto JavaScript, descreve cada
janela que é aberta pelo browser. Cada instância do objecto window
representa uma janela nova, assim, ao criar uma janela, também lhe associamos um
objecto JavaScript de forma automática.
Este é um dos objectos mais importantes,
tão importante que muitas vezes o utilizamos por omissão. Por exemplo:
document.write("Teste");
assume o objecto window corrente. É
formalmente equivalente a:
window.document.write("Teste");
Duas das acções mais importantes que se podem
tomar com este objecto são de facto, abrir e fechar janelas. Por exemplo:
win=open("http://www.sapo.pt", "sapo");
abre uma janela com o URL indicado.
Esta instrução pode ser associada a um evento,
resultando no aparecimento de uma nova janela acedendo a uma página Web:
<html>
<head>
<title> Teste de janelas </title>
</head>
<body onload="win=open('
http://www.sapo.pt", 'sapo'); ">
</body>
</html>
Fechar uma janela é também uma operação
simples:
win.close();
fecha a janela que acabámos de abrir.
Este tipo de acções pode ser associado a
eventos, permitindo abrir e fechar janelas como resposta a acções do utilizador.
O exemplo seguinte mostra uma modificação
simples do anterior, associando a um botão:
<html>
<head>
<title> Teste de janelas </title>
</head>
<body
onload="win=open('http://www.sapo.pt', 'sapo')" ; >
Teste
<input type="Submit" value="Fechar!" onclick="win.close()"
; />
</body>
</html>
Ao pressionar o botão, a janela nova
desaparece.
Frames
A utilização de frames traz a
possibilidade de divisão da janela do browser em ecrãs lógicos, cada um
dos quais com a capacidade para se comportar como uma janela distinta, designada
por "frame".
Uma janela pode assim ser constituída por
várias frames, cada uma delas sendo descrita por um pedaço de código HTML
distinto.
Uma página Web divide-se em trames,
utilizando para tal o elemento HTML <frameset ...>, no qual é definida a divisão
lógica do documento.
O elemento HTML <frameset ...> aceita como
parâmetros dois atributos básicos: rows e cols. Estes definem o
número de linhas ou colunas em que a janela vai ser dividida. As dimensões das
frames são normalmente dadas na altura da sua definição.
Por exemplo:
<frameset rows = "30,30,20">
divide o ecrã em três frames
horizontais, as duas primeiras com 30 pixels de altura e a terceira com
20.
Também podem ser construídas expressões como:
<frameset cols = "20,20,*">
Neste caso, temos o ecrã dividido em colunas,
as duas primeiras com 20 pixels de largura e a terceira com o tamanho
variável, dependente do tamanho da janela do browser em cada momento.
Contudo, a forma mais útil de especificar
frames é utilizando relações percentuais entre os tamanhos delas, porque
deverá ser tido em conta que os utilizadores dispõem de monitores com resoluções
diversas.
Por exemplo:
<frameset rows = "40%,*">
divide a janela em duas frames, a
primeira ocupando 40% do espaço e a segunda o restante.
Dentro de um "frameset" utilizam-se
elementos <frame …> para especificar qual o código HTML que corresponde a cada
frame. Este elemento admite os seguintes atributos:
Atributos:
src
Indica o URL do código HTML que corresponde à
frame.
name
Indica o nome da frame.
noresize
Indica que a frame tem um tamanho fixo,
que não pode ser modificado pelo utilizador.
scrolling
Indica se as barras de deslocação estão ou não acessíveis ao utilizador
(YES, NO ou AUTO).
marginheight
Indica o espaçamento em pixels em
relação às margens superior e inferior.
marginwidth
Indica o espaçamento em relação às margens
verticais.
As frames podem ser colocadas umas
dentro das outras para produzir estruturas complexas. Com estes elementos de
sintaxe, podemos já construir como exemplo uma página que utilize frames:
<html>
<head>
<title> Demo de Frames </title>
</head>
<frameset rows = "40%,*">
<frame src = "ecran1.html">
<frameset cols = "30%,30%,*">
<frame src = "ecran2.html">
<frame src = "ecran3.html"
marginheight = "0">
<frame src = "ecran4.html">
</frameset>
</frameset>
<noframes>
Esta página tem Frames! Obtenha um browser que
as visualize.
</noframes>
</html>
Repare-se que o elemento HTML <frameset>
substitui o <body> no documento.
Neste exemplo, temos duas frames
horizontais, estando a de baixo dividida em três frames verticais. Cada
frame tem um ficheiro HTML associado, que simplesmente tem no corpo do
documento uma palavra identificativa do ecrã.
O "ecrã3" tem, neste exemplo, o parâmetro "marginheight"
colocado a "0", para notar a diferença de aspecto visual sobre os elementos
constantes da página HTML colocada na frame:
Um dos problemas que podem existir com a
utilização de frames é o dos brawsers antigos que não as
interpretem. Assim, pode ser empregue uma secção HTML delimitada pelos elementos
<noframes> e </noframes>, que pode conter código HTML que é ignorado, mas que é
interpretado por qualquer browser que não reconheça frames.
Outra questão que se pode colocar na utilização
de frames acontece quando existem links dentro de uma frame.
No caso de nada ser especificado, o novo endereço vai ser carregado no
interior da área delimitada pela frame.
Por exemplo:
<a href="http://www. google.com"> Google </a>
Contudo, isto pode nem sempre ser o que se
pretende, até porque pode ser aborrecido para o utilizador visualizar a página
remota numa frame de dimensões reduzidas. Para evitar este facto,
utiliza-se um atributo designado por target, associado ao elemento HTML
que define o link <a hrerf = "..." ...>).
Este pode tomar os seguintes valores:
_blank
A página é carregada numa nova janela.
_self
A página é carregada na mesma janela em que o
link aparece.
_parent
A página é carregada na janela mãe da frame
onde está o link.
_top
A página é carregada na totalidade da janela do
browser.
Para além disso, o atributo target
também pode apontar para o nome (parâmetro name) de umaframe.
Assim, poderíamos forçar um carregamento da
página Web apontada por um link, fazendo uma pequena alteração ao
ficheiro:
<a href="http://www.google.com"
target="_top"> Google </a>
A visualização da página que é carregada ao
seguir o link é agora feita em toda a janela do browser e não no
reduzido espaço da frame onde se encontra o link.
Frames
e JavaScript
O JavaScript é, como foi referido, muito
útil para o trabalho com frarnes. O objecto "window" dispõe da
propriedade "frames", que consiste num array de objectos
representando todas as frames de um determinado frameset.
Na prática, existem duas formas de fazer
referência ao conteúdo de uma determinada frame.
A primeira consiste em considerar as frames
como elementos do array frames, como no exemplo que se segue, em que
um script a correr na trame da esquerda altera um elemento da
frame da direita:
Ficheiro Main.html:
<html>
<head>
<title> Demo de Frames </title>
</head>
<frameset cols = "30%,*">
<frame src= "ecran1.html" name=
"frame1" >
<frame src= "ecran2.html" name=
"frame2" >
</frameset>
</html>
Ficheiro ecran1.html:
<html>
<head>
<title> Demo de Frames </title>
</head>
<body
onload="parent.frames[1].document.forms[0].texto1.value = 'Texto' " ; >
Ecrã 1
</body>
</html>
Ficheiro ecran2.html:
<html>
<head>
<title> Demo de Frames </title>
</head>
<body>
Ecrã 2 <br/>
<form method="post" name="myForm">
Nome:
<textarea name="texto1">
</textarea>
</form>
</body>
</html>
Repare-se que no código HTML da frame da
esquerda, o script JavaScript efectua uma operação sobre um elemento da
form que integra a frame do lado direito, mais precisamente coloca
o valor do campo de texto com " Texto ".
Para referenciar as diversas frames,
utiliza-se, neste caso, o array "parent.frames[]", onde "parent"
referencia a janela mãe.
Também poderia ser utilizada a referência
"top"; no caso de as frames estarem embebidas umas nas outras e se
pretender referenciar a janela de topo:
top.frames[1].document.forms[0].texto1.value =
"Texto";
Repare-se, ainda, que o conteúdo de uma
frame consiste num novo documento HTML e, portanto, representado por um
objecto "document" próprio.
Uma outra forma, e a mais recomendável, de
referenciar as frames é pelos respectivos nomes. O script poderia
ser transformado na seguinte sintaxe, mais elucidativa:
top.frame2.document.myForm.texto1.value = "Texto";
Neste caso, tanto a frame como o form
que esta contém são referenciados pelos respectivos nomes, em vez dos
arrays de elementos que os contêm. Numa página com vários elementos é uma
forma bastante mais amigável de os representar.
Utilizando o JavaScript em conjunto com
esquemas de frames, temos a possibilidade de implementar páginas com
bastante complexidade, em que as frames podem interagir umas com as
outras e em que se tem sempre controlo sobre os elementos posicionados nas
diferentes páginas HTML que compõem as frames. Caso contrário, cada
frame será uma entidade distinta, independente das outras, sem a
possibilidade de uma gestão integrada da página Web como um todo.
|