Bagaimana cara mendapatkan posisi mouse di jQuery tanpa mouse-event?

101

Saya ingin mendapatkan posisi mouse saat ini tetapi saya tidak ingin menggunakan:

$(document).bind('mousemove',function(e){ 
        $("#log").text("e.pageX: " + e.pageX + ", e.pageY: " + e.pageY); 
}); 

karena saya hanya perlu mendapatkan posisi dan memproses informasinya

Martin Vseticka
sumber
3
.pageX dan .pageY dapat dibaca dari acara apa pun, tidak hanya .mousemove (). Misalnya, mungkin Anda ingin tahu persis di mana pengguna mengklik di dalam div tertentu: Berikut adalah contoh tempat kami mendengarkan peristiwa klik di dalam div tertentu yang disebut #special. ..... docs.jquery.com/…
Haim Evgi
ini juga dapat membantu Anda mendapatkan lokasi penunjuk mouse untuk situs responsif. kvcodes.com/2014/03/…
Kvvaradha

Jawaban:

151

Saya tidak percaya ada cara untuk menanyakan posisi mouse, tetapi Anda dapat menggunakan mousemovepenangan yang hanya menyimpan informasi, sehingga Anda dapat menanyakan informasi yang disimpan.

jQuery(function($) {
    var currentMousePos = { x: -1, y: -1 };
    $(document).mousemove(function(event) {
        currentMousePos.x = event.pageX;
        currentMousePos.y = event.pageY;
    });

    // ELSEWHERE, your code that needs to know the mouse position without an event
    if (currentMousePos.x < 10) {
        // ....
    }
});

Tetapi hampir semua kode, selain setTimeoutkode dan semacamnya, berjalan sebagai respons terhadap suatu peristiwa, dan sebagian besar peristiwa menyediakan posisi mouse. Jadi kode Anda yang perlu mengetahui di mana mouse mungkin sudah memiliki akses ke informasi itu ...

TJ Crowder
sumber
7
$(window).load(function(e){ console.log(e.pageX,e.pageY); });mengembalikan undefined untuk posisi mouse
spb
9
@TJCrowder Cukup jelas menurut saya, dia mengatakan bahwa ada peristiwa di luar sana yang tidak menyediakan posisi mouse, untuk menanggapi jawaban yang mengklaim bahwa "hampir semua (semua?)" Peristiwa menyediakan posisi mouse.
fabspro
2
Dalam pembelaan @TJCrowder, dia TIDAK mengatakan hampir semua. Dengan menanggapi dengan pertanyaan yang tidak terlalu membantu atau bertujuan. Saya pikir inti dari jawaban ini adalah menunjukkan kepada pengguna bahwa dalam contoh ini dia tidak harus menggunakan gerakan mouse ... dia dapat menggunakan apa saja. Pengguna tidak secara khusus mengatakan mendapatkannya tanpa peristiwa, yang ditunjukkan oleh TJCrowder hampir SEMUA kode terjadi setelah BEBERAPA peristiwa. Tentu saja dia menyebutkan ini SETELAH menunjukkan cara yang layak untuk membuat fungsi Anda sendiri yang melakukan apa yang dia butuhkan. Jawaban membantu saya.
Tyler
1
@ Tyler: Terima kasih. :-) "hampir semua" adalah perubahan berikutnya, bahasa awal saya terlalu kuat.
TJ Crowder
26

Anda tidak dapat membaca posisi mouse di jQuery tanpa menggunakan acara. Perhatikan pertama-tama bahwa properti event.pageXdan event.pageYada di acara apa pun, jadi Anda dapat melakukan:

$('#myEl').click(function(e) {
    console.log(e.pageX);
});

Pilihan Anda yang lain adalah menggunakan closure untuk memberikan seluruh kode Anda akses ke variabel yang diperbarui oleh mousemove handler:

var mouseX, mouseY;
$(document).mousemove(function(e) {
    mouseX = e.pageX;
    mouseY = e.pageY;
}).mouseover(); // call the handler immediately

// do something with mouseX and mouseY
lonesomeday
sumber
Satu masalah dengan ini adalah Anda tidak memiliki pageX dan pageY atau clientX dan clientY saat menyeret di firefox ... Adakah cara untuk mendapatkan pageY saat menyeret?
JamesTBennett
11

Saya menggunakan metode ini:

$(document).mousemove(function(e) {
    window.x = e.pageX;
    window.y = e.pageY;
});

function show_popup(str) {
    $("#popup_content").html(str);
    $("#popup").fadeIn("fast");
    $("#popup").css("top", y);
    $("#popup").css("left", x);
}

Dengan cara ini saya akan selalu memiliki jarak dari atas yang disimpan dalam y dan jarak dari kiri disimpan dalam x.

Nicu Criste
sumber
6

Selain itu, mousemoveperistiwa tidak dipicu jika Anda melakukan drag'n'drop melalui jendela browser. Untuk melacak koordinat mouse selama drag'n'drop Anda harus melampirkan handler untuk document.ondragoverevent dan menggunakan properti originalEventnya.

Contoh:

var globalDragOver = function (e)
{
    var original = e.originalEvent;
    if (original)
    {
        window.x = original.pageX;
        window.y = original.pageY;
    }
}
Alfishe
sumber
2

penggunaan window.event- mengandung terakhir eventdan sebagai salah eventmengandung pageX, pageYdll Pekerjaan untuk Chrome, Safari, IE tapi tidak FF.

Oleksandr Tsurika
sumber
0
var CurrentMouseXPostion;
var CurrentMouseYPostion;

$(document).mousemove(function(event) {
    CurrentMouseXPostion = event.pageX;
    CurrentMouseYPostion = event.pageY;
});

Buat eventListener pada objek utama, dalam kasus saya objek dokumen, untuk mendapatkan mouse coords setiap frame dan menyimpannya dalam variabel global, dan seperti itu Anda dapat membaca mouse Y & Z kapan pun Anda suka, di mana pun Anda suka.

Ala Mouhamed
sumber
-1

Saya menemukan ini, tapi alangkah baiknya untuk berbagi ...

apa yang kalian pikirkan?

$(document).ready(function() {
  window.mousemove = function(e) {
    p = $(e).position();  //remember $(e) - could be any html tag also.. 
    left = e.left;        //retrieving the left position of the div... 
    top = e.top;          //get the top position of the div... 
  }
});

dan boom, itu dia ..

Ande Caleb
sumber