Apakah mungkin untuk mendapatkan posisi mouse dengan JavaScript setelah halaman dimuat tanpa aktivitas pergerakan mouse (tanpa menggerakkan mouse)?
javascript
mouseevent
dom-events
Norbert Tamas
sumber
sumber
mousemove
acara.Jawaban:
Jawaban sebenarnya: Tidak, itu tidak mungkin.
OK, saya baru saja memikirkan cara. Overlay halaman Anda dengan div yang mencakup seluruh dokumen. Di dalamnya, buat (katakanlah) 2.000 x 2.000
<a>
elemen (sehingga:hover
pseudo-class akan bekerja di IE 6, lihat), masing-masing berukuran 1 pixel. Buat:hover
aturan CSS untuk<a>
elemen - elemen yang mengubah properti (katakanlahfont-family
). Di penangan beban Anda, siklus melalui masing-masing 4 juta<a>
elemen, memeriksacurrentStyle
/getComputedStyle()
sampai Anda menemukan satu dengan font hover. Ekstrapolasi kembali dari elemen ini untuk mendapatkan koordinat dalam dokumen.NB JANGAN LAKUKAN INI .
sumber
<a>
elemen yang menutupi persegi panjang yang diberikan (menggunakan posisi absolut dari<img>
elemen berukuran , saya kira), mengecilkan persegi panjang setiap kali. Ya, ini konyol, tetapi tidak dapat memperoleh info ini sebelum mousemove pertama.Edit 2020: Ini tidak berfungsi lagi. Tampaknya begitu, bahwa vendor browser menambal ini. Karena sebagian besar browser bergantung pada kromium, itu mungkin pada intinya.
Jawaban lama: Anda juga dapat mengaitkan mouseenter (acara ini diaktifkan setelah pemuatan ulang halaman, saat kursor berada di dalam halaman). Memperluas kode yang rusak harus melakukan trik:
Anda juga dapat mengatur x dan y ke nol pada mouseleave-event. Jadi Anda dapat memeriksa apakah pengguna ada di halaman Anda dengan kursornya.
sumber
mouseleave
acara yang mengaturx
dany
kembali kenull
atau'undefined'
Yang dapat Anda lakukan adalah membuat variabel untuk
x
dany
koordinat kursor Anda, memperbaruinya setiap kali mouse bergerak dan memanggil fungsi pada interval untuk melakukan apa yang Anda butuhkan dengan posisi yang disimpan.Kelemahan dari ini tentu saja adalah bahwa setidaknya satu gerakan awal dari mouse diperlukan untuk membuatnya bekerja. Selama kursor memperbarui posisinya setidaknya satu kali, kami dapat menemukan posisinya terlepas dari apakah ia bergerak lagi.
Kode sebelumnya memperbarui satu detik sekali dengan pesan di mana kursor Anda berada. Saya harap ini membantu.
sumber
cursorX/Y
variabel - variabel itu sebelum peristiwa apa pun terjadi.Anda dapat mencoba sesuatu yang mirip dengan yang disarankan Tim Down - tetapi alih-alih memiliki elemen untuk setiap piksel di layar, buat hanya 2-4 elemen (kotak), dan ubah lokasi, lebar, tinggi secara dinamis untuk membagi lokasi yang mungkin ada di layar dengan 2-4 secara rekursif, sehingga menemukan lokasi sebenarnya mouse dengan cepat.
Misalnya - elemen pertama mengambil setengah bagian kanan dan kiri layar, kemudian bagian atas dan bawah. Sekarang kita sudah tahu di mana seperempat layar mouse berada, dapat mengulangi - temukan seperempat ruang ini ...
sumber
Jawaban @Tim Down tidak berkinerja jika Anda merender 2.000 x 2.000
<a>
elemen:Tetapi Anda tidak harus membuat 4 juta elemen sekaligus, alih-alih gunakan pencarian biner. Cukup gunakan 4
<a>
elemen saja:<a>
elemengetComputedStyle()
fungsi menentukan di mana mouse persegi panjang melayangDengan cara ini Anda perlu mengulangi langkah-langkah ini maks 11 kali, mengingat layar Anda tidak lebih lebar dari 2048 piksel.
Jadi, Anda akan menghasilkan maks 11 x 4 = 44
<a>
elemen.Jika Anda tidak perlu menentukan posisi mouse dengan tepat untuk piksel, tetapi katakanlah presisi 10px tidak apa-apa. Anda akan mengulangi langkah-langkah paling banyak 8 kali, jadi Anda harus menggambar maksimal 8 x 4 = 32
<a>
elemen.Juga menghasilkan dan kemudian menghancurkan
<a>
elemen tidak berfungsi karena DOM umumnya lambat. Sebaliknya, Anda hanya dapat menggunakan kembali awal 4<a>
elemen dan hanya menyesuaikan merekatop
,left
,width
danheight
seperti yang Anda loop melalui langkah-langkah.Sekarang, membuat 4
<a>
adalah kerja keras juga. Sebagai gantinya, Anda bisa menggunakan kembali<a>
elemen yang sama untuk saat mengujigetComputedStyle()
di setiap persegi panjang. Jadi, bukannya membelah area pencarian menjadi 2 x 2<a>
elemen hanya menggunakan kembali satu<a>
elemen dengan bergerak dengantop
danleft
sifat gaya.Jadi, yang Anda butuhkan adalah
<a>
perubahan elemen tunggalwidth
danheight
maks 11 kali, dan ubahtop
danleft
maks 44 kali dan Anda akan memiliki posisi mouse yang tepat.sumber
Solusi paling sederhana tetapi tidak 100% akurat
Hasil:
{top: 148, left: 62.5}
Hasilnya tergantung pada ukuran elemen terdekat dan kembali
undefined
ketika pengguna mengganti tabsumber
undefined
terlepas. Bisakah Anda menguraikan cara menggunakannya?undefined
ketika kursor tidak melayang elemen apa pun (atau ketika browser kehilangan fokus). Anda mungkin perlu mengatur interval waktu jika Anda menguji dari konsol ..setTimeout
bekerja. Saya menggunakan jsfiddle dan Anda benar, itu tidak pernah mengenai hover event karena menggambar ulang DOM setiap kali Anda mengklik play. Saya akan merekomendasikan menambahkan petunjuk ini untuk orang lain.Saya membayangkan bahwa mungkin Anda memiliki halaman induk dengan timer dan setelah sejumlah waktu atau tugas selesai, Anda meneruskan pengguna ke halaman baru. Sekarang Anda menginginkan posisi kursor, dan karena mereka menunggu, mereka tidak perlu menyentuh mouse. Jadi lacak tetikus pada halaman induk menggunakan peristiwa standar dan berikan nilai terakhir ke halaman baru dalam variabel get atau post.
Anda dapat menggunakan kode JHarding pada halaman induk Anda sehingga posisi terbaru selalu tersedia dalam variabel global:
Ini tidak akan membantu pengguna yang menavigasi ke halaman ini dengan cara lain selain halaman induk Anda.
sumber
Saya menerapkan pencarian horizontal / vertikal, (pertama membuat div penuh dengan tautan garis vertikal yang diatur secara horizontal, kemudian membuat div penuh dengan tautan garis horizontal yang disusun secara vertikal, dan cukup melihat yang mana yang memiliki status hover) seperti ide Tim Down di atas, dan ini bekerja sangat cepat. Sayangnya, tidak berfungsi di Chrome 32 di KDE.
jsfiddle.net/5XzeE/4/
sumber
Anda tidak perlu menggerakkan mouse untuk mendapatkan lokasi kursor. Lokasi ini juga dilaporkan pada acara lain selain mousemove . Inilah acara klik sebagai contoh:
sumber
Mengaitkan jawaban @ SuperNova , inilah pendekatan menggunakan kelas ES6 yang menjaga konteks agar tetap
this
benar dalam panggilan balik Anda:sumber
Inilah solusi saya. Hal ekspor window.currentMouseX dan window.currentMouseY sifat Anda dapat menggunakan di mana saja. Ia menggunakan posisi elemen melayang (jika ada) pada awalnya dan sesudahnya mendengarkan gerakan mouse untuk mengatur nilai yang benar.
Sumber CMS Composr : https://github.com/ocproducts/composr/commit/a851c19f925be20bc16bfe016be42924989f262e#diff-b162dc9c35a97618a9674864ff511251R1202
sumber
sumber
Saya pikir saya mungkin punya solusi yang masuk akal tanpa menghitung divs dan piksel..lol
Cukup gunakan bingkai animasi atau interval waktu suatu fungsi. Anda masih akan memerlukan acara mouse satu kali meskipun hanya untuk memulai, tetapi secara teknis Anda memposisikan ini di mana pun Anda suka.
Pada dasarnya kami melacak div boneka setiap saat tanpa gerakan mouse.
Di bawah ini adalah logika ..
sumber