Foros del Web » Programando para Internet » Javascript »

Altura de elementos creados dinámicamente

Estas en el tema de Altura de elementos creados dinámicamente en el foro de Javascript en Foros del Web. Hola forer@s, ahora me toca preguntar a mi Tengo una imágen con una serie indeterminada de elementos "<AREA", los cuales, en su propiedad "innerHTML" contienen ...
  #1 (permalink)  
Antiguo 22/11/2004, 09:17
Avatar de salvica  
Fecha de Ingreso: agosto-2003
Ubicación: Albacete - España
Mensajes: 23
Antigüedad: 20 años, 8 meses
Puntos: 0
Altura de elementos creados dinámicamente

Hola forer@s, ahora me toca preguntar a mi

Tengo una imágen con una serie indeterminada de elementos "<AREA", los cuales, en su propiedad "innerHTML" contienen una tabla con un número variable de filas que pueden oscilar entre CUATRO y DIEZ (solo hay una columna)

Hasta aquí no tengo problemas, los oculto y los muestro según los eventos ONMOUSEOUT y ONMOUSEOVER

El problema radica en que no soy capaz de posicionarlos a la derecha/izquierda o arriba/abajo del cursor cuando éste se acerca a los límites de la página

¿Hay alguna propiedad que me diga cual es la altura/anchura real del elemento, una vez creado?

Gracias por la ayuda que podais prestarme
Salvica
  #2 (permalink)  
Antiguo 23/11/2004, 02:09
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 19 años, 8 meses
Puntos: 5
Hola salvica

Para saber la altura puedes utilizar la propiedad offsetHeight y anchura offsetWidth

Te envio este ejemplo:



Código PHP:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<
html>
<
head>
<
title>Obtener altura y anchura de una imagen</title>
</
head>
<
body>
<
div id="obj"></div>
<
script type="text/javascript">
function 
getD(e){
  var 
refObj document.getElementById("obj")
  
// obtemos el objeto que ha desencadenado el evento
  
var getObj window.Evente.target event.srcElement;
  
// Si no es una imagen el objeto que ha desencadenado el evento
  
if(getObj.tagName!="IMG") {

    
refObj.innerHTML "<b>Haz clic para añadir o eliminar la imagen." +
                        
"<br>Pasa el ratón sobre la imagen para ver  la altura y la anchura de la imagen.<\/b>"
  
}
  else{
  
//Si hemos llegado aquí el objeto es una imagen, obtemos la anchura y altura
    
refObj.innerHTML "La altura es " getObj.offsetHeight "<br>La anchura es " getObj.offsetWidth
  
}


}

// Obtenemos la referencia de la etiqueta body
var getbody document.getElementsByTagName("body");
function 
create_obj(e,d){

var 
window.Eventevent;
// Comprobamos si el elemento esta creado si no es asi lo creamos
  
if(!document.getElementById(d)){
      
// creamos el nuevo elemento
      
var imagen document.createElement("img");
      
// añadimos las propiedades
      
imagen.src "images/photo2.jpg";
      
imagen.id d;
      
imagen.style.position "absolute";
      
imagen.style.left e.clientX 20;
      
imagen.style.top e.clientY;
      
//añadimos el elemento creado
      
getbody[0].appendChild(imagen);
      return 
false;
  }
  
//Si hemos llegado hasta aquí eliminamos el elemento
  
else{
     
getbody[0].removeChild(document.getElementById(d));
     return 
false;
  }


}
document.onmouseover=getD
// Si es N6+ utilizamos addEventListener para poder pasar varios argumentos
if(window.Event){
    
document.addEventListener("mouseup",function(event){create_obj(event,"ad")} ,false)
}
// Si es IE5+
else{
  
document.onmouseup = function(event){create_obj(event,"ad")}
}
</script>




</body>
</html> 
El script utiliza algunas de las nuevas propiedades y métodos Dom nivel 1, estoy estudiandolo ahora.

Espero que te sea util.

Un saludo
  #3 (permalink)  
Antiguo 24/11/2004, 19:02
Avatar de salvica  
Fecha de Ingreso: agosto-2003
Ubicación: Albacete - España
Mensajes: 23
Antigüedad: 20 años, 8 meses
Puntos: 0
Hola kepawe gracias por responder

Te paso un ejemplo de lo que más o menos quiero hacer
Código PHP:
<html>
   <
head>
   <
title>Provincias</title>

    <
style type="text/css">
      .
tablatip {
           
border:1 solid #ccccff;
           
background-colordarkblue;
           
colorwhite;
           
width100%;
           
padding-left2px;
           
padding-right2px;
           
padding-bottom2px;
           
font-familyArialVerdanaHelvetica;
           
font-size12;
      }
      .
tdtip {
           
font-size:10px;
           
font-familyArialVerdanaHelvetica;
           
font-weightbold;
           
width350px;
      }
      .
tdvacio {
           
font-size:1px;
           
height3px;
      }
    </
style>
   <
script type="text/javascript" language="JavaScript">

      
/**
      * función de diseño de una celda "tr"
      */
      
function creaCeldaCOLORFONDOCOLORTEXTOCONTENIDO ) {
           var 
Salida  '';
               if( 
CONTENIDO == "" ) {
                   
Salida += '  <tr><td class="tdvacio">&nbsp;</td></tr>';
               } else {
                   
Salida += '  <tr bgcolor="' COLORFONDO '">';
                   
Salida += '     <td class="tdtip">';
                   
Salida += '        <font color="'+COLORTEXTO+'">&nbsp;'+CONTENIDO+'&nbsp;</font>';
                   
Salida += '     </td>';
                   
Salida += '  </tr>';
               }
               return 
Salida;
      }

      
/**
      * al poner el ratón sobre una provincia del mapa
      */
      
function mouseOverNOMBRECOLORWEB1,  COLORTXT1,  TEXTO1
                                  
COLORWEB1,  COLORTXT1,  TEXTO1
                                   ....... 
                                  
COLORWEB10COLORTXT10TEXTO10, ) {
                   var 
Cadena  '<table width="100%" border="0" class="tablatip">';
                       
Cadena += '      <tr><td class="tdcabecera">'+NOMBRE+'</td></tr>';
                    
//
                    // crear la celda de TEXT1 (siempre existe)
                    //
                       
Cadena += creaCeldaCOLORWEB1,  COLORTXT1,  TEXTO1 );
                       
Cadena += creaCelda"""""" );
                    
//
                    // crear el resto de las celdas, si falta TEXTO(x) tampoco hay colores
                    //
                       
if( TEXTO2 ) { Cadena += creaCeldaCOLORWEB2,  COLORTXT2,  TEXTO2 ); }
                       if( 
TEXTO3 ) { Cadena += creaCeldaCOLORWEB3,  COLORTXT3,  TEXTO3 ); }
                       ....... 
                       if( 
TEXTO1 ) { Cadena += creaCeldaCOLORWEB10COLORTXT10TEXTO10 ); }
                       
Cadena += '</table>'

***************************************
Aquí debería ir la parte del cálculo de la posición del
ratón y el posicionamiento del "tip" ¿no?
***************************************

Código PHP:
                    //
                    // compruebo el navegador utilizado (no lo pongo porque es muy largo) y visualizo el "tip"
                    //           solo pongo el "document.all"
                    //
                       
document.all['tip'].innerHTML          Cadena;
                       
document.all['tip'].style.visibility   "visible";
      }

      
/**
      * al quitar el ratón de la provincia del mapa
      */
      
function mouseOut( ) {
            
//
            // compruebo el navegador utilizado y oculto el "tip" ( este lo pongo completo)
            //
               
if( document.all ) {
               
//  Internet Explorer
                   
document.all("tip").style.visibility "hidden";
               } else if( 
document.layers ) {
                      
//  Nestcape 4.X
                          
document.layers["tip"].visibility "hide";
                      } else if( 
document.getElementById ) { 
                             
//  Nestcape 6.X
                                 
document.getElementById("tip").style.visibility "hidden";
                             }
      }
   
</script>
   </head>
   <body>
      <div id="tip" style="position:absolute;width:400;height:100%;visibility:hidden;"></div>
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
            <tr nowrap="nowrap">
               <th align="center">
                  <img src="../imagen/GRAFICO.PNG" usemap="#mapa" border="0" align="left">
               </th>
            </tr>
      </table>
      <!--
        Los datos del mapa son un ejemplo, correspondería a un fichero generado con DELPHI/MYSQL
                y metido "a pelo" con un "include" de PHP 
      //-->
      <map name="mapa">
          <area name="CORU" shape="rect" href="#" coords=" 715, 359, 727, 371"
                      onMouseOver="mouseOver( '#FFFFE6', '#000000', 'Galicia - La Coruña' )"
                       onMouseOut="mouseOut( this )"
                          onClick="return false;" >
          <area name="PEPE" shape="rect" href="#" coords=" 715, 359, 727, 371"
                      onMouseOver="mouseOver( '#FFFFE6', '#000000', 'Bla, bla,bla - Linea 1',
                                              '#FFFFE6', '#000000', 'Bla, bla,bla - Linea 2',
                                              '#FFFFE6', '#000000', 'Bla, bla,bla - Linea 3' )"
                       onMouseOut="mouseOut( this )"
                          onClick="return false;" >
          <area name="JUAN" shape="rect" href="#" coords=" 715, 359, 727, 371"
                      onMouseOver="mouseOver( '#FFFFE6', '#000000', 'Bla, bla,bla - Linea 1',
                                              '#FFFFE6', '#000000', 'Bla, bla,bla - Linea 2' )"
                       onMouseOut="mouseOut( this )"
                          onClick="return false;" >
      </map>
   </body>
</html> 
Tal y como lo veo, debería definir un manejador "onMouseMove" con sus comprobaciones del navegador del cliente y que el evento sea de la página o del área que desencadenó el "onOver/onOut" (lo de la página es porque el que tengo definido comprueba el "onMouseDown" para ir página adelante/atrás) y que permita utilizar las barras de scroll suando estás sobre ellas

No sé si voy a poder hacer tantas distinciones (o estudiar más)

Gracias por la ayuda, si entiendes que se puede simplificar para no repetir tantas comprobaciones agrdecería sugerencias.

Abrazos
Salvica
  #4 (permalink)  
Antiguo 25/11/2004, 10:46
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 19 años, 8 meses
Puntos: 5
Hola salvica

Prueba a ver con esto cambios, no lo he probado pero creo que debería funcionar.

Añade estas funciones:
Código PHP:

// Devuelve la anchura visible de la pantalla

function get_client_width() {
    if (
window.innerWidth != null)
        return 
window.innerWidth;
    if (
document.body.clientWidth != null)
        return 
document.body.clientWidth;
    return (
null);
}
// Devuelve la altura visible de la pantalla
function get_client_height() {
    if (
window.innerHeight != null)
        return 
window.innerHeight;
    if (
document.body.clientHeight != null)
        return 
document.body.clientHeight;
    return (
null);
}

//Devuelve el desplazamiento del scroll inferior
function get_scroll_client_width(){
  if(
window.pageXOffset != null)
    return 
window.pageXOffset;
  if(
document.body.scrollLeft != null)
    return 
document.body.scrollLeft;
  return (
null)

}
//Devuelve el desplazamiento del scroll izquierdo
function get_scroll_client_height(){
  if(
window.pageYOffset != null)
    return 
window.pageYOffset;
  if(
document.body.scrollTop != null)
    return 
document.body.scrollTop;
  return (
null)


Despues en la función mouseOver() añade esto.
Código PHP:

       
// compruebo el navegador utilizado (no lo pongo porque es muy largo) y visualizo el "tip"
                         //     solo pongo el "document.all"
               
var tooltip
               marginXY 
10
               
if( document.all ) {
               
//  Internet Explorer
                   
tooltip document.all("tip")
               } else if( 
document.layers ) {
                      
//  Nestcape 4.X
                          
tooltip document.layers["tip"]
                      } else if( 
document.getElementById ) {
                             
//  Nestcape 6.X
                                 
tooltip document.getElementById("tip")
                             }
                             
                              
tooltipWtooltip.offsetWidth
                              tooltipH 
tooltip.offsetHeight


                              winW 
=  get_client_width()+ get_scroll_client_width()
                              
winH get_client_height()+ get_scroll_client_height()

                              
cursorY e.pageY e.pageY  e.document.body.scrollTop
                              cursorX 
e.pageX e.pageX e.document.body.scrollLeft

                                
// situamos el tooltip a la derecha
                                
if(tooltipW winW cursorX ) { cursorX += marginXY}
                                
// izquierda
                                
else if(tooltipW cursorX){cursorX -= tooltipW marginXY }
                                
// centro
                                
else {cursorX cursorX - (tooltipW 2)}

                                
//  abajo
                                
if(tooltipH marginXY  winH cursorY ) { }
                                
// arriba
                                
else if(get_scroll_client_height() < cursorY - (tooltipH marginXY)){cursorY -= (tooltipH marginXY )}
                                
// lo centramos en la pantalla
                                
else{cursorY tooltipH marginXY  get_client_height()   ?  get_scroll_client_height() + marginXY cursorY - ((tooltipH marginXY )/ 2)}

                                  
tooltip.style.top cursorY;
                                  
tooltip.style.left cursorX
                                  tooltip
.style.visibility "visible"
                
//aquí acaba la función
                

Por ultimo tienes que añadir un nuevo argumento,

En la etiqueta html

onMouseOver="mouseOver(event, '#FFFFE6', '#000000', 'Galicia - La Coruña' )

y en la funcion

function mouseOver(e, NOMBRE, COLORWEB1,etc...

Espero no haberme equivado es mucho código.
En caso de que te de error puedes ponerlo en una página de prueba, así sería más facil solucionar el error.

Espero que te sirva

Un saludo
  #5 (permalink)  
Antiguo 25/11/2004, 17:50
Avatar de salvica  
Fecha de Ingreso: agosto-2003
Ubicación: Albacete - España
Mensajes: 23
Antigüedad: 20 años, 8 meses
Puntos: 0
Hola kepawe, entre lo del otro día y lo de hoy, ya todo el parecido de la página inicial con la actual es pura coincidencia

Aprovechando tu idea de buscar el objeto que produce el evento, he conseguido reducir el código en más del 50% usando objetos ( aunque estoy muy verde en esto )

Voy a aprovechar a acostarme un rato, que llevo más de 24 horas sin dormir (trabajo a turnos) y mañana te contaré como va la cosa

Chao
Salvica
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:17.