2011-12-21 21 views
11

Tengo una función diferida que se une a un evento MouseEnter:jQuery: ¿Cómo comprobar si el ratón está sobre un elemento

$(window).load(function(e) { 
    var $container = $('.container'); 
    $container.mouseenter(function(e) { 
    //do something 
    }); 
    ... 
}); 

El problema es el ratón podría estar ya sobre el elemento cuando se activa el evento de carga, por lo tanto, antes de que el evento del mouseenter estuviera vinculado.
puedo evitar esto poniendo un poco de código al final del manipulador de carga de la página para hacer una verificación de una sola vez si el ratón está dentro del elemento y desencadenar el evento MouseEnter manualmente:

// check if the mouse is inside $container 
if(mouse is inside $container) 
    $container.mouseenter(); 

¿Cómo puedo comprobar si el mouse está sobre el elemento en el evento de carga?

Intenté $container.is(':hover') pero no funciona.

+0

¿Has probado mouseenter y mouseleave events? –

+2

'$ container.is (': hover')' - ¿De qué manera eso no funciona? Mi preocupación sería que no es particularmente compatible con cross-cross (no funcionará en IE7, por ejemplo, porque se basa en el comportamiento de qSA), pero parece hacer lo que me está buscando ... – lonesomeday

+0

@lonesomeday: vea http://jsfiddle.net/UVJgF/1/ y coloque su mouse sobre la caja negra y presione ctr + enter. no se dispara en FF8 – spb

Respuesta

0

Mouseover evento hace exactamente lo que desea.

Si el .conteiner no existe a tiempo, se adjunta el evento mouseover (se agrega dinámicamente en el futuro) tiene que usar el método .live para adjuntar el evento.

$(".conteiner").live("mouseover", function() { 
    alert("hovered!"); 
}) 

Funcionará también cuando el ratón está ya en la posición, en la que aparece el nuevo elemento.Example here!

Para jQuery 1.7+, en su lugar, debe utilizar el método .on ya que el método .live está en desuso. Example here!

+0

Espero que haya una manera de verificar sin usar eventos. – spb

+3

Si el mouse ya está sobre un elemento cuando se carga la página, el evento 'mouseover' no se disparará. Ese es el objetivo de la pregunta. –

+0

¿Estás seguro de que el evento 'mouseover' no se activará? –

-1
$('.container').mouseover(function(e) { 
    //do something 
}); 
+0

Tengo que esperar a que la página cargue primero, y para ese momento el mouse ya podría estar sobre el elemento. – spb

1

mejor manera de hacer esto es conseguir la izquierda, derecha, arriba, y el desplazamiento del elemento de fondo y ver si la posición del ratón se encuentra en cualquier lugar entre esos valores.

Example.

Coloque su mouse sobre la div la primera vez que se carga. A continuación, actualice la página (haga clic en F5 para que no tenga que mover el mouse). Cuando la página se carga completamente la próxima vez, debe alertar con "¡Pase el ratón!" incluso si no has movido tu mouse.

O una manera aún más fácil. Sólo tienes que comprobar la e.target.id del evento MouseMove (que al parecer se activa una vez se carga la página, incluso sin mover el ratón) contra la id del elemento, así:

$(document).mousemove(function(e){ 
    if(e.target.id === 'hoverTest'){ 
     alert("Hovered!"); 
    } 
}); 

Example (hacer los mismos pasos que el anterior).

+0

Esto no parece arreglarlo en FF8. Para ser claro: si pongo el mouse sobre el bloque y obtengo el primer elemento emergente y pulso enter, luego F5 (o Ctrl-F5) para actualizar, no aparece otra ventana emergente aunque el mouse esté sobre la caja hasta que mueve el mouse un poco. –

+0

Funciona bien para mí en Chrome: parece otro desastre en varios navegadores. ¿Cuál está produciendo ese error para ti? – Purag

+0

FireFox 8.0 en Chrome 16.0.912.59 en la computadora portátil Cr-48 sigue apareciendo la alerta incluso cuando el mouse no se está moviendo, por lo que es difícil de probar, pero hice clic en no abrir de nuevo y moví sobre la caja y luego presioné F5 y no apareció hasta que comencé a mover el mouse, y luego siguió apareciendo. –

1

yo no probarlo todavía, pero creo que usted quiere así ...

function checkMouseCollision(obj) { 
    var offset = obj.offset(); 
    objX= offset.left; 
    objY=offset.top; 
    objW=obj.width(); 
    objH=obj.height(); 

    var mouseX = 0; 
    var mouseY = 0; 
    $().mousemove(function(e) { 
    mouseX = e.pageX; 
    mouseY = e.pageY; 
    }); 

    if((mouseX>objX&&mouseX<objX+objW)&&(mouseY>objY&&mouseY<objY+objH)){ 
     alert("hovered")  
    }; 
}; 
checkCollision($(".box")) 
+0

Esto podría funcionar, pero el mousemove se va a llamar mucho. Me encantaría una forma de hacer un chequeo único si es posible :) – spb

+0

@spb ¿Has buscado utilizar .one() en lugar de .on() para tus eventos? –

1

con jQuery 1.7+ vas a querer usar .on(): http://api.jquery.com/on/

$(document).ready(function(){ 
    $('body').on("mouseover", "your_element_selector_here", function() { 
     // do stuff here 
    }); 
}); 

.live es obsoleto. También puede poner cualquier otro evento en .on también, dependiendo de lo que necesite. : el desplazamiento no funciona porque solo funciona con elementos específicos y está basado en CSS.

Usar esto junto con un enfoque de detección de desplazamiento para antes de que la página termine de cargarse lo llevará a donde quiere estar.

+0

interesante. ¿.mouseenter o .mouseover también están en desuso? esos parecen menos detallados que .on – spb

+0

No, pero deberías usar .on(). Al igual que el .live obsoleto anterior, el enlace existirá incluso si el elemento enlazado (your_element_here) se vuelve a dibujar mediante un redibujado ajax. aquí está el truco, su elemento padre (aquel sobre el que llamas 'on') no debe ser rediseñado a lo largo de la vida de la página. Como lo que se le asigna a .on() siempre debe existir. – Stone

Cuestiones relacionadas