Foros del Web » Programando para Internet » Javascript »

Un "onMouseOver" complicado

Estas en el tema de Un "onMouseOver" complicado en el foro de Javascript en Foros del Web. Hola chic@s, me he aquí con un problema complicado de resolver (para mí) con un evento onMouseOver. El tema es que hice un pequeño script ...
  #1 (permalink)  
Antiguo 10/10/2006, 10:37
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Un "onMouseOver" complicado

Hola chic@s, me he aquí con un problema complicado de resolver (para mí) con un evento onMouseOver. El tema es que hice un pequeño script de Drag & Drop en el cual tengo únicamente dos capas así:



Al comenzar a arrastrar "Capa uno" hacia "Capa dos" el z-index de "Capa uno" se incrementa para aparecer sobre la otra. El problema viene en que yo necesito detectar el momento en el que el puntero del mouse toca a la "Capa dos" mientras se arrastra la "Capa uno"; esto tengo que hacerlo debido a que en ese momento deseo ejecutar una funcion que haga ciertas tareas. Le puse a "Capa dos" un "onMouseOver" pero este evento nunca se ejcuta; parece ser que al aumentar el z-index de la capa que estoy arrastrando, el puntero siempre estará sobre esta misma capa y nunca sobre la "Capa dos".

He aquí mi cuestión: necesito de alguna forma detectar que el mouse está por encima de "Capa dos" mientras arrastro la "Capa uno" que posee un z-index superior ¿hay alguna forma de hacerlo?

Agradezco de antemano cualquier ayuda u orientación. Adjunto a continuación el código que hice hasta el momento, por si sirve de algo.

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<
html>
<
head>
<
script type="text/javascript">
// Variables globales
enMovimiento=indiceZ=0posInicial=posFinal=null;
// IE
if(navigator.userAgent.indexOf("MSIE")>=0navegador=0;
// Otros
else navegador=1;


function 
cancelaEventos(event)
{
    
// Funcion que evita que se ejecuten eventos adicionales
    
if(navegador==0)
    {
        
window.event.cancelBubble=true;
        
window.event.returnValue=false;
    }
    if(
navegador==1event.preventDefault();
}

function 
getEl(eId)
{
    
// Un getElementById, pero mas corto
    
return document.getElementById(eId);
}

function 
getPos(event)
{
    
// Obtiene la posicion del cursor en un momento dado
    
var pos=new Array();
    if(
navegador==0)
    {
         
pos["x"]=window.event.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
        
pos["y"]=window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop;
    }
    if(
navegador==1)
    {
        
pos["x"]=event.clientX+window.scrollX;
        
pos["y"]=event.clientY+window.scrollY;
    }
    return 
pos;
}

function 
reOrdena(cId)
{
    
// Funcion que nunca se ejecuta... HE AQUI MI PROBLEMA
    
if(enMovimiento==1)
    {    
        
alert("aaaaa");
    }
}

function 
comienzaMov(eventcId)
{
    
enMovimiento=1capaEnMovimiento=getEl(cId);
    
posCapaInicial=parseInt(capaEnMovimiento.style.top);
    
posCapaFinal=posCapaInicial;
    
    
posCursorInicial=getPos(event);
    
    if(
navegador==0)
    {
        
document.attachEvent("onmousemove"enMov);
        
document.attachEvent("onmouseup"finMov);
    }
    if(
navegador==1)
    {        
        
document.addEventListener("mousemove"enMovtrue);
        
document.addEventListener("mouseup"finMovtrue);
    }
    
    
capaEnMovimiento.style.zIndex=++indiceZ;
    
cancelaEventos(event);
}

function 
enMov(event)
{
    
posCursorActual=getPos(event);
    
capaEnMovimiento.style.top=(posCapaInicial+posCursorActual["y"]-posCursorInicial["y"])+"px";
    
cancelaEventos(event);
}

function 
finMov(event)
{
    
enMovimiento=0;
    
capaEnMovimiento.style.top=posCapaFinal+"px";
    
    if(
navegador==0)
    {    
        
document.detachEvent("onmousemove"enMov);
        
document.detachEvent("onmouseup"finMov);
    }
    if(
navegador==1)
    {
        
document.removeEventListener("mousemove"enMovtrue);
        
document.removeEventListener("mouseup"finMovtrue); 
    }
}
</script>

<style type="text/css">
#contenedor DIV
{
    height:20px;
    width:150px;
    position:absolute;
    border-color:#000000; border-style:solid; border-width:1px;
    background:#FFFFFF;
    font-family:Verdana; font-size:12px;
    padding-top:4px;
    margin:5px;
    text-align:center;
    cursor:move;
}

#contenedor
{
    position:absolute;
    top:50px;
    left:50%;
    margin-left:-75px;
}
</style>
</head>

<body>

<div id="contenedor">

<div onMouseOver="reOrdena(this.id)" onMouseDown="comienzaMov(event, this.id)" id="c1" style="top:0px;">Capa uno</div>
<div onMouseOver="reOrdena(this.id)" onMouseDown="comienzaMov(event, this.id)" id="c2" style="top:35px;">Capa dos</div>

</div>

</body>
</html> 
Nuevamente gracias.
Saludos.
__________________
R4DS en español | R4DS en inglés

Última edición por zaqpz; 12/10/2006 a las 12:19
  #2 (permalink)  
Antiguo 11/10/2006, 09:48
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
¿Ningún consejo?

Estuve viendo algunos eventos que me serían útiles tales como onDrag, onDragDrop y similares, pero lamentablemente parece que solo funcionan en IE.

Estoy bastante perdido y agradeceré mucho cualquier sugerencia.
Saludos.
__________________
R4DS en español | R4DS en inglés
  #3 (permalink)  
Antiguo 11/10/2006, 10:53
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Hola zaqpz!

Si quieres revisa el framework rico, tiene este tipo de funcionalidad "drag & drop" implementada en sus librerías, podrías estudiar su código o utilizar el mismo y acomodarlo a tus necesidades, enlace: http://openrico.org/rico/demos.page


Un saludo!
  #4 (permalink)  
Antiguo 12/10/2006, 08:19
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Muchas gracias jahepi por contestar.
Estuve viendo un código fuente en particular que hace exactamente lo que intento lograr en http://tool-man.org/examples/sorting.html. El tema es que el autor programa de una manera no muy didáctica e intentar seguir ese código me resultó prácticamente imposible.

He colgado el código fuente que puse en el 1º mensaje en esta URL: http://www.formatoweb.com.ar/drag.php.
La idea es que: al estar arrastrando la "Capa uno" hacia la "Capa dos" llega un momento que el puntero del mouse (que se encuentra arrastrando la "Capa uno") se pone por encima de la "Capa dos". En en ese momento que deseo ejecutar una determinada función; el problema es que me es imposible detectar cuándo debo hacerlo. El onMouseOver no funcina ya que la capa que se está arrastrando tiene un z-index mayor a la capa quieta, y es por ello que no se detecta que el puntero está por encima.

Lamentablemente no puedo utilizar librerías, por lo que no me queda otra opción que trabajarlo a mano (jefes caprichosos).

Muchas gracias por su tiempo.
Saludos.
__________________
R4DS en español | R4DS en inglés
  #5 (permalink)  
Antiguo 13/10/2006, 06:30
 
Fecha de Ingreso: julio-2005
Mensajes: 31
Antigüedad: 18 años, 9 meses
Puntos: 0
¿Y no podrías detectar las coordenadas del puntero y comprobar a medida que vas arrastrando si están dentro de la capa 2? Yo recuerdo haber hecho algo parecido hace algún tiempo... buscaré y si lo encuentro te lo copio.

Saludos
  #6 (permalink)  
Antiguo 13/10/2006, 09:40
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Muchas gracias jorgezazo por contestar; creo que lo que dices es una buena opción.
Voy a trabajar en la implementación y cualquier avance posteo aquí mismo.

Saludos.
__________________
R4DS en español | R4DS en inglés
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 20:18.