2010-08-03 25 views
17

¿Cómo puedo verificar si el cursor está sobre un div en la página html con JQuery/Javascript?¿Cómo comprobar si el cursor está sobre un elemento?

Estoy tratando de obtener las coordenadas del cursor para ver si están en el rectángulo de mi elemento. Tal vez hay métodos predefinidos?

UPD, no dicen nada acerca de hover eventos, etc. Necesito algún método que devolverá verdadero/falso de algún elemento en la página, como:

var result = underElement('#someDiv'); // true/false 
+0

Independientemente de lo que quiere * * a cabeza, 'hover' es la opción multi-navegador aquí,' 'mouseover' o mouseenter' es la cruz más fácil -una forma de navegador para realizar un seguimiento del elemento fijo. Además, su fraseología está un poco apagada, el mouse nunca está * bajo * un elemento, es * sobre * it. –

+0

si no va a utilizar el control deslizante, ¿cómo sabrá que el mouse ingrese esa caja suya? ... – Reigel

+1

@Reigel, observe las coordenadas del mouse y observe la posición div. – Ockonal

Respuesta

10

No estoy realmente seguro de por qué desea evitar la libración tan mal: considerar la siguiente secuencia de comandos

$(function(){ 

    $('*').hover(function(){ 
     $(this).data('hover',1); //store in that element that the mouse is over it 
    }, 
    function(){ 
     $(this).data('hover',0); //store in that element that the mouse is no longer over it 
    }); 


    window.isHovering = function (selector) { 
     return $(selector).data('hover')?true:false; //check element for hover property 
    } 
}); 

Básicamente, la idea es que se utiliza vuelo estacionario a establecer un indicador en el elemento que el ratón está sobre ella/ya no sobre ella. Y luego escribes una función que busca esa bandera.

+3

+1 Me gusta mucho esta solución. ¿No solo necesitas 'return $ (selector) .data ('hover');' al final? – fearofawhackplanet

+1

Esta no es una respuesta completa: ¿cómo inicializar 'hover' para empezar? 'hover' se desconoce hasta que el puntero ingrese o salga del borde de un elemento. – worldsayshi

+0

Ah, mi mal; para tener en cuenta esto, suponga que el puntero está fuera del elemento en la inicialización. 'hover' se activará en cada movimiento del puntero sobre el elemento, no solo al entrar. Aunque esto todavía deja el caso muy pequeño de la necesidad de saber dónde está el puntero en la inicialización sin moverlo. Sin embargo, no es un problema mío. – worldsayshi

3

La manera más sencilla sería simplemente seguir qué elemento está el mouse en todo momento. Pruebe algo como:

<div id="1" style="border:solid 1px red; width:50px; height:50px;"></div> 
<div id="2" style="border:solid 1px blue; width:50px; height:50px;"></div> 
<div id="3" style="border:solid 1px green; width:50px; height:50px;"></div> 

<input type="hidden" id="mouseTracker" /> 

​$(document).ready(function() { 
    $('*').hover(function() { 
     $('#mouseTracker').val(this.id); 
    }); 
}); 

y entonces su función es simplemente

function mouseIsOverElement(elemId) { 
    return elemId === $('#mouseTracker').val(); 
} 
2

¿No puedes comprobar $ (seleccionar) .es (': hover')?

+0

esto no funciona en Opera. – Skay

+0

o menos que ie9 – ajbeaven

+3

Downvoting para ahorrarle tiempo a la gente, ya que esta solución ya no es una opción con jQuery 1.8 y versiones posteriores. jQuery 1.8 obsoleto '.is (': hover')': http://stackoverflow.com/a/12517725/5295. – avernet

0

Lo hice con función personalizada:

$(document).mouseup(function(e) { 
    if(UnderElement("#myelement",e)) { 
     alert("click inside element"); 
    } 
}); 

function UnderElement(elem,e) { 
    var elemWidth = $(elem).width(); 
    var elemHeight = $(elem).height(); 
    var elemPosition = $(elem).offset(); 
    var elemPosition2 = new Object; 
    elemPosition2.top = elemPosition.top + elemHeight; 
    elemPosition2.left = elemPosition.left + elemWidth; 

    return ((e.pageX > elemPosition.left && e.pageX < elemPosition2.left) && (e.pageY > elemPosition.top && e.pageY < elemPosition2.top)) 
} 
8

En aras de la exhaustividad añadiré un par de cambios que creo que va a ayudar un poco para el rendimiento.

  1. Utilice la delegación para vincular el evento a un elemento, en lugar de vincularlo a todos los elementos existentes.

    $(document).on({ 
        mouseenter: function(evt) { 
        $(evt.target).data('hovering', true); 
        }, 
        mouseleave: function(evt) { 
        $(evt.target).data('hovering', false); 
        } 
    }, "*"); 
    
  2. Añadir un jQuery pseudo-expresión :hovering.

    jQuery.expr[":"].hovering = function(elem) { 
        return $(elem).data('hovering') ? true : false; 
    }; 
    

Uso:

var isHovering = $('#someDiv').is(":hovering"); 
Cuestiones relacionadas