2010-08-03 14 views
17

Jak mogę sprawdzić, czy kursor znajduje się ponad div na stronie html z JQuery/Javascript?Jak sprawdzić, czy kursor znajduje się nad elementem?

Próbuję uzyskać współrzędne kursora, aby zobaczyć, czy są one w prostokącie mojego elementu. Może istnieją predefiniowane metody?

UPD, nie mów nic o hover imprez itp Potrzebuję metodę, która zwróci true/false jakiegoś elementu na stronie, takich jak:

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

Niezależnie od tego, co chcesz * * udać, 'hover' jest możliwość cross-browser tutaj,' mouseover' lub 'mouseenter' jest najprostszym krzyż -przeglądarka do śledzenia zawieszonego elementu. Również twoje frazowanie jest nieco wyłączone, mysz nigdy nie jest * pod * elementem, to * ponad * to. –

+0

jeśli nie będziesz używać hover, skąd będziesz wiedzieć, że mysz wchodzi w to twoje pudełko? ... – Reigel

+1

@Reigel, spójrz na współrzędne myszy i spójrz na pozycję div. – Ockonal

Odpowiedz

10

Nie jestem pewien, dlaczego chcesz uniknąć najechania kursorem tak źle: Rozważmy następujący scenariusz

$(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 
    } 
}); 

Zasadniczo chodzi o to, że używasz najechania kursorem aby ustawić flagę na elemencie że mysz jest nad nim/nie nad nim. A następnie piszesz funkcję, która sprawdza tę flagę.

+3

+1 Bardzo lubię to rozwiązanie. Czy nie potrzebujesz 'return $ (selector) .data ('hover');' na końcu? – fearofawhackplanet

+1

To nie jest pełna odpowiedź: Jak zainicjować "najechanie" na początek? "Hover" jest nieznany, dopóki wskaźnik nie wejdzie lub nie opuści granicy elementu. – worldsayshi

+0

Ach, moje złe; aby to uwzględnić, załóżmy, że wskaźnik znajduje się poza elementem podczas inicjalizacji. "Hover" będzie uruchamiany przy każdym ruchu wskaźnika nad elementem, a nie tylko przy wejściu. Mimo to nadal pozostawia bardzo mały przypadek potrzeby wiedzieć, gdzie wskaźnik jest na inicjalizacji bez przenoszenia go. Nie jest to jednak mój problem. – worldsayshi

3

Najprostszym sposobem będzie po prostu śledzenie, który element myszki jest przez cały czas. Spróbuj czegoś takiego:

<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); 
    }); 
}); 

i wówczas funkcja jest po prostu

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

nie można po prostu sprawdzić $ (wybierz) .is (': hover')?

+0

to nie działa w Operze. – Skay

+0

lub mniej niż np. – ajbeaven

+3

Downvoting oszczędza czas, ponieważ to rozwiązanie nie jest już możliwe w przypadku jQuery 1.8 i nowszych. jQuery 1.8 wycofane '.is (': hover')': http://stackoverflow.com/a/12517725/5295. – avernet

0

Zrobiłem to z funkcji niestandardowej:

$(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

Dla uzupełnienia dodam kilka zmian, które moim zdaniem pomoże trochę na wydajności.

  1. Użyj delegacji, aby powiązać zdarzenie z jednym elementem, zamiast powiązać go ze wszystkimi istniejącymi elementami.

    $(document).on({ 
        mouseenter: function(evt) { 
        $(evt.target).data('hovering', true); 
        }, 
        mouseleave: function(evt) { 
        $(evt.target).data('hovering', false); 
        } 
    }, "*"); 
    
  2. Dodać jQuery pseudo ekspresję :hovering.

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

Zastosowanie:

var isHovering = $('#someDiv').is(":hovering"); 
Powiązane problemy