|
Este ficheiro contém - as funções e
as variáveis para mostrar e esconder os layers e
- as funções
que comuta as imagens roll-over.
Só as primeiras são
relevantes para os menus dinâmicos mas as segundas implementam un efeito
bastante apreciado - e actualmente muito comum - dos links (ligações)
com imagens. O ficheiro começa com a definição de dynmenu,
um array de Booleans (valores possíveis: true, false),
com uma célula por menu. Como os menus foram definidos por números
de 0 a 4, da esquerda para a direita, a definição do array
segue a mesma sequência. Quando um dos layers está visível,
a entrada correspondente no array vale true, caso contrário
vale false. Segue-se a definição de timerID,
o array de time-out, com uma célula por layer. Se
a visibilidade de um layer está pendente de um time-out activo,
a identificação do time-out é guardada na célula correspondente.
Caso contrário, o valor da célula não tem significado. Neste
guia há cinco menus e por isso, os arrays e os ciclos têm dimensão
5. Para maior generalidade, deveria ser usada uma constante com o número
de menus. Só há duas acções
aplicadas aos menus: mostrar e esconder os menus, correspondendo às funções
showMenu(idx) e hideMenu(idx). A função
showMenu(idx) recebe o índice do menu, idx (número
inteiro entre 0 e 4) e percorre o array de visibilidade para verificar se outro
layer está visível (a célula dynmenu[i] vale true).
Se tal ocorrer, o layer correspondente é escondido: for(i=0;i<5;i++)
if (dynmenu[i] && (i!=idx)) hideMenu(i);
A acção
seguinte é mudar a visibilidade do layer pretendido para visible.
No entanto, é necessário multiplicar o código para contemplar
as implementações de layers em DHTML usadas nos diversos
browsers: if(document.getElementById) document.getElementById("dynmenu"+idx).style.visibility='visible';
else if (document.all) eval("document.all.dynmenu"+idx+".style.visibility='visible';");
else if (document.layers) eval("document.dynmenu"+idx+".visibility='visible';");
A primeira linha é interpretada pelos browsers mais
recentes que seguem a especificação do Document Object Model do
World Wide Web Consortium (W3C, www.w3c.org).
É o caso do Netscape Navigator 6 e posterior e do Microsoft Internet Explorer
6 e posterior. O nome do Element é composto por dynmenu
seguido do índice idx e a sua propriedade .style.visibility
é definida como visible. A segunda linha dirige-se ao
Microsoft Internet Explorer, versões 4 e 5. O nome do elemento a mudar
é composto por document.all.dynmenu ao qual se soma o índice
idx e a sua propriedade .style.visibility que é definida
como visible. Neste modelo, todos os layers se encontram sob
o array de objectos document.all. A terceira linha dirige-se
ao Netscape Navigator 4. O nome do elemento a mudar é composto por document.dynmenu
ao qual se soma o índice idx e a sua propriedade .visibility
que é definida como visible. Neste modelo, os layers
encontram-se sob o array de objectos document.layers mas podem
ser acedidos directamente a partir de document. seguido do nome do
layer. De seguida o array dynmenu é actualizado,
definindo a entrada idx como true: dynmenu[idx]=true;
Para
terminar, é lançado um time-out: se o utilizador não
escolher uma entrada do menu ou outro menu no prazo de 8000 milisegundos o layer
visível será automaticamente escondido: timerID[idx]=setTimeout("hideMenu("+idx+")",8000);
Esta
função dirige-se aos utilizadores com menos experiência e
que não estão à vontade com os layers, preferindo
ver as páginas sem serem perturbados por elementos sobrepostos. No entanto,
esta solução tem um inconveniente: se o utilizador mantiver o ponteiro
sobre o menu dinâmico ao fim do período especificado, o menu desaparecerá
inesperadamente e o utilizador terá de regressar ao link do título
para voltar a revelar o menu. Por isso, o período de time-out deve ponderar
os dois interesses contraditórios. Outras implementações
teriam resolvido este problema escondendo o menu quando o ponteiro não
está sobre ele. Prefiro esta solução porque é mais
simples para utilizadores pouco experientes enquanto os utilizadores treinados
escolhem a linha do menu que pretende sem quaisquer entraves.
A função hideMenu(idx) é um "espelho"
da função showMenu(idx). Apaga o time-out lançado
por showMenu(idx). Se o time-out já tiver expirado
o browser ignora o comando: clearTimeout(timerID[idx]);
De
seguida, define-se a propriedade visibility do layer com o índice
idx como hidden. Como anteriormente, o código tem
de ser multiplicado para contemplar as implementações de layers
em DHTML usadas nos diversos browsers: if(document.getElementById)
document.getElementById("dynmenu"+idx).style.visibility='hidden';
else if (document.all) eval("document.all.dynmenu"+idx+".style.visibility='hidden';");
else if (document.layers) eval("document.dynmenu"+idx+".visibility='hidden';");
A primeira linha é interpretada pelos browsers mais
recentes que seguem a especificação do Document Object Model do
World Wide Web Consortium (W3C, www.w3c.org).
A segunda linha dirige-se ao Microsoft Internet Explorer, versões
4 e 5. Neste modelo, todos os layers se encontram sob o array de
objectos document.all. A terceira linha dirige-se ao Netscape
Navigator 4. Neste modelo, os layers encontram-se sob o array de
objectos document.layers mas podem ser acedidos directamente a partir
de document. seguido do nome do layer. Finalmente, o
array dynmenu é actualizado, definindo a célula
idx como false: dynmenu[idx]=false;
O efeito das imanges roll-over é implementado por duas funções:
imgOver(imgHndl) e imgOut(imgHndl). A primeira está
associada ao event onMouseOver enquanto a segunda está
associada ao event onMouseOut. Quando o ponteiro (também
chamado cursor ou mouse (rato)) passa sobre uma imagem com o código
roll-over, o ficheiro source da imagem (propriedade SRC) é
alterado para um ficheiro com o nome do actual acrescido do sufixo "ov":
se a source da imagem fôr o ficheiro "XYZ.jpg", a source
da imagem roll-over é o ficheiro "XYZov.jpg". Em resumo,
todas as imagens em que se pretende o efeito roll-over devem ter a sua
source duplicada com um outro ficheiro com o sufixo "ov". O
código da função imgOver() é explicado
abaixo: imgHndl.src=imgHndl.src.substr(0,imgHndl.src.length-4)+"ov"+imgHndl.src.substr(imgHndl.src.length-4);
- O handler da imagem é passado para a função
imgOver(imgHndl). - A
propriedade source é extraída do handler e guardada
numa string.
- Esta string é dividida em duas sub-strings.
A primeira parte vai do início (offset igual a 0) até ao
comprimento (length) da string menos os últimos quatro caracteres;
estes quatro caracteres constituem a segunda sub-string, começando
neste ponto (offset igual
length-4) e terminando no fim da
string, o que corresponde à extensão da imagem, normalmente,
".jpg", ".jp2", ".gif" or ".png". - A
nova source da imagem é criada juntando a primeira sub-string
com o sufixo "ov" e com a extensão, guardada na segunda sub-string.
Quando
o ponteiro sai de cima de uma imagem com o efeito roll-over, a source
original é reposta, ou seja, sem o sufixo "ov", através
da função imgOut(imgHndl): imgHndl.src=imgHndl.src.substr(0,imgHndl.src.length-6)+imgHndl.src.substr(imgHndl.src.length-4);
- O handler da imagem é passado para a função
imgOut(imgHndl). - A
propriedade source é extraída do handler e guardada
numa string.
- Esta string é dividida em duas sub-strings.
A primeira parte vai do início (offset igual a 0) até ao
comprimento (length) da string menos os últimos seis caracteres;
a segunda sub-string guarda a extensão, começando a quatro
caracteres do fim (offset igual
length-4) e terminando no
fim da string. - A nova source da imagem é criada
juntando a primeira sub-string com a extensão, guardada na segunda
sub-string.
Este código é de aplicação
genérica e é independente do caminho (path) para as imagens.
Os únicos requisitos são o uso do sufixo "ov" e o uso
de extensões com três letras. Convém recordar que apenas
a source é alterada com o roll-over, mantendo-se a dimensão
da imagem original. Por isso as duas imagens devem ter as mesmas dimensões. |