2011-10-14 17 views
23

Tak, jak to określa pytanie, czy istnieje sposób wyzwalania zdarzenia mousemove w jQuery, które wysyła również współrzędne myszy do obiektu zdarzenia?Czy istnieje sposób wyzwalania przesunięcia myszy i uzyskania zdarzenia.pageX, event.pageY?

Do tej pory mój kod może wywołać przesunięcie myszy przy użyciu funkcji .trigger (zdarzenie), ale zdarzenia.pageX i event.pageY są niezdefiniowane.

+0

Czy to do testowania? – airportyh

+0

Jedną rzeczą, którą można zrobić, to zapisać dane zdarzenia z ostatniego rzeczywistego zdarzenia mousemove, a następnie po uruchomieniu programowo ponownie użyć go, jeśli nie istnieją nowe dane zdarzeń. Jeśli rzeczywiste zdarzenia mousemove nie zostaną uruchomione, oznacza to, że mysz się nie poruszyła, więc parametr eventData z ostatniego prawdziwego mousemove powinien mieć aktualne położenie. – Mahn

Odpowiedz

3

Nie sądzę, że możliwe jest uzyskanie współrzędnych myszy na żądanie za pośrednictwem JavaScript/jQuery; Jeśli jednak wiązać pozycję na globalnym var możesz uzyskać do nich dostęp w dowolnym czasie w całym dokumencie tak:

$(document).ready(function(){ 
    $().mousemove(function(e){ 
     window.xPos = e.pageX; 
     window.yPos = e.pageY; 
    }); 
}); 

dla mniej CPU intensywnej opcji, można dodać timeout, chociaż handel wydajność za niewielkie opóźnienie w wiedząc, gdzie mysz jest:

function getMousePosition(timeoutMilliSeconds) { 
    $(document).one("mousemove", function (event) { 
     window.xPos = event.pageX; 
     window.yPos = event.pageY; 
     setTimeout("getMousePosition(" + timeoutMilliSeconds + ")", timeoutMilliSeconds); 
    }); 
} 
getMousePosition(100); 

teraz powinno być w stanie uzyskać dostęp do window.xPos i window.yPos z dowolnego miejsca w dokumencie przy użyciu albo rozwiązanie bez konieczności wywołać faux wydarzenie.

+7

-1 nie dotyczy to pytania, które obejmuje zdarzenie wywołane ręcznie. – zzzzBov

+0

Wiem, jak uzyskać współrzędne myszy, wiążąc kursor myszy z obiektem. Ale powiedzmy, że mysz się nie porusza, ale chcę użyć funkcji wyzwalacza w jQuery, aby uruchomić wirtualny ruch myszy i nadal uzyskać współrzędne. –

+2

@ geossj5 - Jeśli już śledzisz mysz, a myszka się nie porusza, to z całą pewnością zachowują się wszystkie ostatnio zapisane współrzędne ...? –

0

Nie jestem pewien, czy w pełni rozumiem pytanie. Można to zrobić:

$('.someClass').mousemove(function(event){ 
    console.log(event.pageX); 
    console.log(event.pageY); 
}); 

Teraz, gdy mysz porusza ponad someClass będzie rejestrować cordinates XY. Oto jsfiddle, aby zobaczyć go w akcji i jquery documentation.

+1

Wiem, jak uzyskać współrzędne myszy, wiążąc element myszy z elementem myszy. Ale powiedzmy, że mysz się nie porusza, ale chcę użyć funkcji wyzwalacza w jQuery, aby uruchomić wirtualny ruch myszy i nadal uzyskać współrzędne. –

+0

Jak poruszasz myszą z Javascriptem? – Ryre

0

Nie można przesunąć myszy, jeśli o to pytasz. Ale możesz wywołać funkcję z dowolnym kontekstem i argumentami, które chcesz. Np .:

function foobar(e) 
{ 
    this.className = 'whatever'; // this == element 
} 

someElement.onmousemove = foobar; 

var obj = {whatever:'you want'}; 
foobar.call(someElement, obj); // calls foobar(obj) in context of someElement 
0

Chyba znam twój problem. Próbujesz programowo zapytać o pozycję myszy. Być może masz kod podobny do tego:

$(document).one('mousemove.myModule', function (e) { 
    // e.pageY and e.pageX is undefined. 
    console.log('e.pageY: ' + e.pageY + ', e.pageX: ' + e.pageX); } 
     ).trigger('mousemove.myModule'); 

To masz absolutną rację. Właściwości pageY i pageX na obiekcie zdarzenia nie zostaną zdefiniowane. W rzeczywistości istnieje wiele rzeczy w obiekcie zdarzenia, których tam nie będzie, a nie tylko .pageY i .pageX. Może być jakiś błąd w jQuery. W każdym razie, po prostu nie łączyć tego połączenia, aby wywołać i wyzwalać zdarzenie w $ (okno) zamiast tego. Nie pytaj mnie, dlaczego to działa, ale jednak dla mnie to zrobił:

$(document).one('mousemove.myModule', function (e) { 
    console.log('e.pageY: ' + e.pageY + ', e.pageX: ' + e.pageX); }); 

// Now e.pageY and e.pageX will be defined! 
$(window).trigger('mousemove.myModule'); 
37

Musisz ustawić pageX i pageY bezpośrednio przed wywołaniem zdarzenia. Aby ustawić te właściwości, ustaw obiekt jQuery.Event.

// create a jQuery event 
e = $.Event('mousemove'); 

// set coordinates 
e.pageX = 100; 
e.pageY = 100; 

// trigger event - must trigger on document 
$(document).trigger(e); 

See it in jsFiddle.

+0

To nie działa, ponieważ jQuery zignoruje parametry pageX i pageY po wywołaniu wyzwalacza. –

+0

Co prowadzi do tego wniosku? Sprawdź [to jsfiddle] (http://jsfiddle.net/yPgnp/). – tenedor

+0

Zgadzam się, ta metoda była dla mnie najlepsza, dość łatwa do zdefiniowania zdarzenia i wystarczy zmienić rekwizyty pageX/pageY samodzielnie – CatalinBerta

0

Jest to najlepsze, co mogę wymyślić, to nie zależy od ustawienia zmiennych globalnych. Zdarzenie click nadal będzie przechwytywać współrzędne, więc możesz przekazać to zdarzenie do myszy.

$(element).click(function(e){ 
    $(element).trigger('mousemove',e); 
}); 

Następnie ten obiekt zdarzenia będzie drugim argumentem funkcji mousemove; pierwszym jest rzeczywiste zdarzenie mousemove lub zdarzenie utworzone przez jQuery.

$(element).mousemove(function(e,clickEvent){ 
    if typeof e.pageX === 'undefined' e = clickEvent; 
    // or if you prefer, clickEvent.pageX; 
}); 
Powiązane problemy