Foros del Web » Programando para Internet » Javascript »

createElement, appenchild y removechild

Estas en el tema de createElement, appenchild y removechild en el foro de Javascript en Foros del Web. Hola a todos, os pongo un código resumido de algo en lo que estoy ahora. Es un timeline que recoje unos valores dinámicamente (el ancho ...
  #1 (permalink)  
Antiguo 08/02/2009, 11:57
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años, 1 mes
Puntos: 0
createElement, appenchild y removechild

Hola a todos,
os pongo un código resumido de algo en lo que estoy ahora. Es un timeline que recoje unos valores dinámicamente (el ancho y el score) y crea unos divs entorno a esos valores. Cada segmento tiene a su vez asociado un Keyframe que se presenta en la parte de arriba. Todo esto lo podeís ver si salvais el código en el navegador (como he dicho, de forma un poco esquemática de lo que luego sería). Hasta aquí todo correcto.
El problema viene cuando intento crear un nuevo div en el contenedor del keyframe para el evento mouseover y click. Mi idea fué la que veis en el código, esto es crear un elemento div y luego borrarlo, pero no me funciona. Y no entiendo pq... si me podeís echar una mano os lo agradecería

codigo completo


Código PHP:
<html>
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Documento sin tÃ*tulo</title>
<
script language="javascript" type="text/javascript">
var 
segWidthscoreposXposYsegmentNumber;
var 
seeClick;
var 
segments = new Array();
/******* FUNCION 1: CONSTRUCTOR************/
function segment(){
   
this.score parseInt(Math.random()*100);
   
this.segWidth parseInt(Math.random()*200);
}
/**************************************/
/********* 2: EVENTOS************/
function keyVisibleOver(elem,ivalue){
   var 
keyframe document.getElementById('keyFrame'+i);
   if(
elem != seeClick){
      
keyframe.className 'keyframesBig';
      var 
scoreAd document.createElement('div'); 
      var 
scoreText document.createTextNode("Score: "+value);
      
keyframe.appendChild(scoreAd);
      
scoreAd.id "score_class";
      
scoreAd.appendChild(scoreText);
      }
}
/**************************************/
function keyHide(elemi){
    var 
keyframe document.getElementById('keyFrame'+i);
    var 
scoreAd document.getElementById('score_class');
    if(
elem != seeClick){
        
keyframe.className 'keyframes';
        
keyframe.removeChild(scoreAd);
    }
}
/**************************************/
function keyVisibleClick(elemivalue){
    var 
keyframe document.getElementById('keyFrame'+i);
    
limpiar(i);
    var 
scoreAd document.createElement('div');
    var 
scoreText document.createTextNode("Score: "+value);
    
keyframe.className 'keyframesBig';
    
keyframe.appendChild(scoreAd);
    
scoreAd.id "score_class";
    
scoreAd.appendChild(scoreText);
    
seeClick elem;
}
/**************************************/
function limpiar(i){
    var 
arrKeyframes document.getElementById('keyFrames_cont').getElementsByTagName('div');
    var 
scoreAd document.getElementById('score_class');
    var 
keyframe document.getElementById('keyFrame'+i);
        for(
j=0j<arrKeyframes.lengthj++){
                   
keyframe.removeChild(scoreAd);
                   
arrKeyframes[j].className 'keyframes';
         }
}
/******* FUNCION 6: CREAMOS LOS SEGMENTOS************/
function makeSegments(){
      var 
i;
      
segmentNumber 4;//por ejemplo
      
for(i=0i<segmentNumberi++){
              var 
timeline document.getElementById('timeline');
              
segments[i]= new segment();
              var 
segmentDiv "<div id='seg"+i+"' onclick='keyVisibleClick(this,"+i+");' onmouseover='keyVisibleOver(this,"+i+","+segments[i].score+");' onmouseout='keyHide(this,"+i+");' style='width:"+segments[i].segWidth+"px'";
              if(
segments[i].score>=&& segments[i].score<=50segmentDiv += "class='segClass score_10'><\/div>";
              else if(
segments[i].score>50 && segments[i].score<=100segmentDiv += "class='segClass score_20'><\/div>"
              
timeline.innerHTML += segmentDiv;
/*******************/
            
posX = (document.getElementById('seg'+i).offsetLeft)+(parseInt(segments[i].segWidth/2))-25;
              
posY 2;
              
document.getElementById('keyFrames_cont').innerHTML += "<div id='keyFrame"+i+"' class='keyframes'"+
              
"style='left:"+posX+"px; top:"+posY+"px'><img src='./images/keyFrame_sample.jpg' id='keyframe_img"+i+"'/><\/div>";
          }
}
</script>
<style type="text/css">
.segClass{
border-right:1px solid #fff; 
height:15px; 
float:left;
cursor:pointer;
}
.score_10{
background:yellow;
}
.score_20{
background:green;
}

.keyframes{
background-color:red;
width:21px;
height:22px;
z-index:0;
}
.keyframesBig{
background-color:blue;
width:21px;
height:22px;
z-index:100;
}
#keyFrames_cont div{
padding:7px;
position:absolute;
}
#keyFrames_cont div img{
float:left;
}
</style>
</head>

<body onload="makeSegments();">
<div id="keyFrames_cont"></div>
<div id="timeline" style="height:15px; margin-top:60px"></div>
</body>
</html> 
Un saludo

Última edición por basa; 08/02/2009 a las 12:53
  #2 (permalink)  
Antiguo 08/02/2009, 13:57
Avatar de programeitor  
Fecha de Ingreso: febrero-2005
Mensajes: 994
Antigüedad: 19 años, 3 meses
Puntos: 9
Respuesta: createElement, appenchild y removechild

Hola, creo que el problema viene de que se estan creando mas div con id scoreclass , cuando solo puede haber uno, ya que se crea uno al onmouseover y otro al onclik, aparte que crear divs al onmouseover pude dar resultados inesperados, por ejemplo que mande mas de un evento onmoseover sin salir de la zona, es posible.

Puedes averiguar al principio de las funciones creadoras si ya existe, y asi no duplicarlos.

Saludos
  #3 (permalink)  
Antiguo 09/02/2009, 02:25
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: createElement, appenchild y removechild

gracias programeitor, lo que me dices es verdad, de hecho me dí cuenta y lo cambié, creando id´s dinámicas para cada uno de esos elementos, pero sigo fallando en algo.
A alguno se le ocurre algún otro modo de crear esos divs? ya que el valor que contienen es necesario que aparezca tanto en el mouseover (y desaparezca en el mouseout), como en el click permanezca (solo desapareciendo entonces con un click en otro elemento).
Había pensado en crear un div vacío y recurrir al innerHTML de objeto padre, a ver si funciona y os cuento..., si se os ocurre algo mejor, por favor no dudeis en decirmelo
Gracias y saludo!
  #4 (permalink)  
Antiguo 09/02/2009, 03:11
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: createElement, appenchild y removechild

hola,
bueno, al final lo he hecho creando divs vacíos y cambiándoles la clase dependiendo del evento.

Aquí va el código por si a alguien le interesa.

Código PHP:
<html>
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Documento sin título</title>
<
script language="javascript" type="text/javascript">
var 
segWidthscoreposXposYsegmentNumber;
var 
seeClick;
var 
segments = new Array();
/******* FUNCION 1: CONSTRUCTOR************/
function segment(){
   
this.score parseInt(Math.random()*100);
   
this.segWidth parseInt(Math.random()*200);
}
/**************************************/
/********* 2: EVENTOS************/
function keyVisibleOver(elem,ivalue){
   var 
keyframe document.getElementById('keyFrame'+i);
   var 
scoreDiv document.getElementById('score_cont'+i);
   if(
elem != seeClick){
          
keyframe.className 'keyframesBig';
        
scoreDiv.className 'scoreClass_sel';
        
scoreDiv.innerHTML value;
      }
}
/**************************************/
function keyHide(elemi){
   var 
keyframe document.getElementById('keyFrame'+i);
   var 
scoreDiv document.getElementById('score_cont'+i);
   if(
elem != seeClick){
        
keyframe.className 'keyframes';
        
scoreDiv.className 'scoreClass_no';
        
scoreDiv.innerHTML '';
    }
}
/**************************************/
function keyVisibleClick(elemivalue){
    
limpiar();
    var 
keyframe document.getElementById('keyFrame'+i);
    var 
scoreDiv document.getElementById('score_cont'+i);
    
keyframe.className 'keyframesBig';
    
scoreDiv.className 'scoreClass_sel';
    
scoreDiv.innerHTML value;
    
seeClick elem;
}
/**************************************/
function limpiar(){
    var 
arrKeyframes document.getElementById('keyFrames_cont').getElementsByTagName('div');
    for(
j=0j<arrKeyframes.lengthj++){
//ahora parece que está bien. Comprobamos dentro de los elementos div, el classname y si hay alguno 
//con el del score seleccionado, lo ponemos en su estado normal, el resto que aparecerán en normal,
//los mantenemos con esa clase y borramos su contenido y el resto, los ponemos a su clase normal
        
if(arrKeyframes[j].className == 'scoreClass_sel'){
            
arrKeyframes[j].className 'scoreClass_no';
            
arrKeyframes[j].innerHTML '';
            }
        else if(
arrKeyframes[j].className == 'scoreClass_no'){
            
arrKeyframes[j].className 'scoreClass_no';
            
arrKeyframes[j].innerHTML '';
            }
        else 
arrKeyframes[j].className 'keyframes';
        }
}
/******* FUNCION 6: CREAMOS LOS SEGMENTOS************/
function makeSegments(){
      var 
i;
      
segmentNumber 4;//por ejemplo
      
for(i=0i<segmentNumberi++){
              var 
timeline document.getElementById('timeline');
              
segments[i]= new segment();
              var 
segmentDiv "<div id='seg"+i+"' onclick='keyVisibleClick(this,"+i+","+segments[i].score+");' onmouseover='keyVisibleOver(this,"+i+","+segments[i].score+");' onmouseout='keyHide(this,"+i+");' style='width:"+segments[i].segWidth+"px'";
              if(
segments[i].score>=&& segments[i].score<=50segmentDiv += "class='segClass score_10'><\/div>";
              else if(
segments[i].score>50 && segments[i].score<=100segmentDiv += "class='segClass score_20'><\/div>"
              
timeline.innerHTML += segmentDiv;
/*******************/
            
posX = (document.getElementById('seg'+i).offsetLeft)+(parseInt(segments[i].segWidth/2))-25;
              
posY 2;
              
document.getElementById('keyFrames_cont').innerHTML += "<div id='keyFrame"+i+"' class='keyframes'"+
              
"style='left:"+posX+"px; top:"+posY+"px'><img src='./images/keyFrame_sample.jpg' id='keyframe_img"+i+"'/><div id='score_cont"+i+"' class='scoreClass_no'><\/div><\/div>";
          }
}
</script>
<style type="text/css">
.scoreClass_no{
background-color:transparent;
}
.scoreClass_sel{
background-color:#063;
opacity:.80;
}
.segClass{
border-right:1px solid #fff; 
height:15px; 
float:left;
cursor:pointer;
}
.score_10{
background:yellow;
}
.score_20{
background:green;
}

.keyframes{
background-color:red;
width:21px;
height:22px;
z-index:0;
}
.keyframesBig{
background-color:blue;
width:21px;
height:22px;
z-index:100;
}
#keyFrames_cont div{
padding:7px;
position:absolute;
}
#keyFrames_cont div img{
float:left;
}
</style>
</head>

<body onload="makeSegments();">
<div id="keyFrames_cont"></div>
<div id="timeline" style="height:15px; margin-top:60px"></div>
</body>
</html> 
Por cierto, si no es abusar demasiado y se os ocurre alguna forma mejor de plantearlo ya sabeis.
Gracias y un saludo!
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 09:13.