Mundo Web
manuales - recursos - gráficos - programación...

Home -  HTMLWebScript  -  Formularios - Falso combo  -  1 -  2  -  3 -  4  -  5

Falso combo (V)
por Luciano Moreno, del departamento de diseño web de BJSParaRed.


Cierre automático.-

Ya tenemos casi listo nuestro falso combo, aunque nos falta un íltimo detalle importante: cerrar la cortinilla cuando el usuario pinche fuera del combo. Efectivamente, éste es un efecto propio de los combos estándar, cuya finalidad es que un combo no permanezca indefinidamente abierto si el usuario no selecciona alguna opción.

Vamos a simular pués dicho mecanismo, para lo cual capturaremos el evento click en el cuerpo del documento, llamando con él a una función que oculte la cortinilla en caso de que está abierta, poniendo a cero el contador de estado.

La forma de capturar el evento click en el documento es diferente para cada navegador, siendo directa en el caso de Internet Explorer, pero teniendo que activarla mediante código específico JavaScript de forma diferente en las versiones 4x y 6x de Netscape Navigator.

El código final del falso combo es el siguiente (lo nuevo, en azul):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <title>HTMLWeb - WebScript - Formularios - Falso combo (V)</title>
  <style type="text/css">
    .comboCaja{background-color:#4c4c4c;layer-background-color:#4c4c4c;position:relative;width:100px;height:16px;clip:rect(0,100,16,0);z-index:1;}
    .fondoCaja{background-color:#FFFFFF;layer-background-color:#FFFFFF;width:98px;height:14px;clip:rect(0,98,14,0);position:absolute;left:1px;top:1px;z-index:5;}
    .flechaCaja{background-color:#4c4c4c;layer-background-color:#4c4c4c;width:16px;height:14px;clip:rect(0,16,14,0);position:absolute;left:82px;top:1px;z-index:5;margin-left:1px;padding-left:1px;}
    .faldaCaja{background-color:#4c4c4c;layer-background-color:#4c4c4c;width:100px;height:70px;clip:rect(0,100,70,0);position:absolute;top:16px;left:0px;z-index:10;visibility:hidden;}
    .fondofaldaCaja{background-color:#FFFFFF;layer-background-color:#FFFFFF;width:98px;height:69px;clip:rect(0,98,69,0);position:absolute;top:0px;left:1px;z-index:10;padding-top:4px;}
  </style>
  <script language="JavaScript" type="text/javascript">
      if(document.layers)
      {
          document.write("<link rel='stylesheet' type='text/css' href='css/estilos_nc_2.css'>");
      }
      else
      {
       document.write("<link rel='stylesheet' type='text/css' href='css/estilos_2.css'>");
      }
      var permiso=false;
      var estado=false;
      function cambia(id)
      {
          if (estado==false)
          {
              if (document.layers)
              {
                  document.layers['seleccion1'].height="86";
                  document.layers['seleccion1'].clip.bottom="86";
                  document.seleccion1.document.layers[id].visibility = "show";
              }
              else if (document.all)
                  document.all[id].style.visibility = "visible";
              else if(document.getElementById)
                  document.getElementById(id).style.visibility = "visible";
          }
          else
          {   
             if (document.layers)
              {
                  document.layers['seleccion1'].height="16";
                  document.layers['seleccion1'].clip.bottom="16";
                  document.seleccion1.document.layers[id].visibility = "hide";
              }
              else if (document.all)
                  document.all[id].style.visibility = "hidden";
              else if(document.getElementById)
                  document.getElementById(id).style.visibility = "hidden";
          }
          estado=(!estado)
         setTimeout("permiso=false",500);
      }
      function cambiavalor(caja, cadena)
      {
          if(document.all)
          {
              eval("document.all('fondocaja"+caja+"').innerHTML='<span class=lista>"+cadena+"</span>'");
              eval("cambia('falda"+caja+"')");
              document.forms.miform.combo1.value=cadena;
          }
          else if(document.layers)
          {
              with (document.seleccion1.document.layers['fondocaja1'])
              {
                   document.open();
                   document.write("<span class='lista'>"+cadena+"</span>");
                   document.close();
                   eval("cambia('falda"+caja+"')");
              }
              document.forms.miform.combo1.value=cadena;
          }
          else if(document.getElementById)
          {
              eval("document.getElementById('fondocaja"+caja+"').innerHTML='<span class=lista>"+cadena+"</span>'");
              eval("cambia('falda"+caja+"')");
              document.forms.miform.combo1.value=cadena;
          }
      }     
      function colores(celda,a)
      {
          var strN=celda.substring(5,7);
          if(document.all)
          {
              if(a==0)
              {
                  document.all[celda].style.background='#663399';
                  eval("document.all['link"+strN+"'].className='linkOn'");
              }
              else if(a==1)
               {
                   eval("document.all['link"+strN+"'].className='linkOff'");
                   document.all[celda].style.background='white';
              }
          }
          if(document.getElementById)
          {
              if(a==0)
              {
                  document.getElementById(celda).style.background='#663399';
                  eval("document.getElementById('link"+strN+"').className='linkOn'");
              }
              else if(a==1)
               {
                   document.getElementById(celda).style.background='white';
                   eval("document.getElementById('link"+strN+"').className='linkOff'");
               }
          }
      }
     function oculta()
     {
           if (permiso==false)
           {
               if(document.all)
                  document.all('falda1').style.visibility="hidden";
               else if(document.getElementById)
                   document.getElementById('falda1').style.visibility="hidden";
               else if(document.layers)
               {
                  document.layers['seleccion1'].height="16";
                  document.layers['seleccion1'].clip.bottom="16";
                  document.seleccion1.document.layers['falda1'].visibility = "hide";
               }
           }
     }
     function inicializa(e)
     {
        
         if((document.getElementById) && (!document.all))
             document.addEventListener("click", oculta, false);
     }

  </script>
</head>
<body bgcolor="#ffff99" onclick="oculta()" onload="inicializa()">
<form name="miform" action="laquesea" method="post">
<input type="hidden" name="combo1" value="seleccione">
<div id="seleccion1" class="comboCaja">
  <div id="fondocaja1" class="fondoCaja"><span class="lista">seleccione</span></div>
  <div id="flechaCapa" class="flechaCaja"><a href= "#"onclick="permiso=true;cambia('falda1')"><img name="flecha1" src="images/flecha.gif" width="15" height="14" border="0" alt="flecha"></a></div>                 
  <div id="falda1" class="faldaCaja">
    <div id="fondofalda1" class="fondofaldaCaja">
      <layer name="fondoLayer1" onmouseout="oculta();">
      <table cellpadding="0" cellspacing="0" border="0" width="100%">
        <tr>
          <td id="celda10" width="100%" onmouseover="colores('celda10',0);" onmouseout="colores('celda10',1);" onclick="cambiavalor('1','seleccione');return false;"><layer bgcolor="red" width="100" onmouseover="oscura('celda10',1);" onmouseout="oscura('celda10',0)"><a id="link10" href="#" onclick="cambiavalor('1','seleccione');return false" class="linkOff">seleccione</a></layer></td>
        </tr>
        <tr>
          <td id="celda11" width="100%" onmouseover="colores('celda11',0);" onmouseout="colores('celda11',1);" onclick="cambiavalor('1','uno');return false;"><layer bgcolor="red" width="100" onmouseover="oscura('celda11',1);" onmouseout="oscura('celda11',0)"><a id="link11" href="#"  onclick="cambiavalor('1','uno');return false;" class="linkOff">uno</a></layer></td>
        </tr>
        <tr>
          <td id="celda12" width="100%" onmouseover="colores('celda12',0);" onmouseout="colores('celda12',1);" onclick="cambiavalor('1','dos');return false;"><layer bgcolor="red" width="100" onmouseover="oscura('celda12',1);" onmouseout="oscura('celda12',0)"><a id="link12" href="#" onclick="cambiavalor('1','dos');return false;" class="linkOff">dos</a></layer></td>
        </tr>
        <tr>
          <td id="celda13" width="100%" onmouseover="colores('celda13',0);" onmouseout="colores('celda13',1);" onclick="cambiavalor('1','tres');return false;"><layer bgcolor="red" width="100" onmouseover="oscura('celda13',1);" onmouseout="oscura('celda13',0)"><a id="link13" href="#" onclick="cambiavalor('1','tres');return false" class="linkOff">tres</a></layer></td>
        </tr>
      </table>
      </layer>
    </div>
  </div>
</div>
<br><br><br><br>
<a href="#" onclick="alert(document.forms.miform.combo1.value);return false;">valor campo</a>
</form>
</body>
</html>

El resultado final lo tenéis en esta ventana.

Y aquí, un zip con los diversos ficheros del falso combo.

 

anterior

Home -  HTMLWebScript  -  Formularios - Falso combo  -  1 -  2  -  3 -  4  -  5