क्या किसी माउस मूवमेंट इवेंट (माउस को हिलाए बिना) के बिना पेज लोड होने के बाद जावास्क्रिप्ट के साथ माउस की स्थिति प्राप्त करना संभव है?
mousemove
घटनाओं को जोड़कर ब्राउज़र को धीमा नहीं करना चाहते हैं।
क्या किसी माउस मूवमेंट इवेंट (माउस को हिलाए बिना) के बिना पेज लोड होने के बाद जावास्क्रिप्ट के साथ माउस की स्थिति प्राप्त करना संभव है?
mousemove
घटनाओं को जोड़कर ब्राउज़र को धीमा नहीं करना चाहते हैं।
जवाबों:
वास्तविक उत्तर: नहीं, यह संभव नहीं है।
ठीक है, मैंने अभी एक तरीका सोचा है। अपने पृष्ठ को एक div के साथ ओवरले करें जो पूरे दस्तावेज़ को कवर करता है। उसके अंदर, 2,000 x 2,000 <a>
तत्वों को बनाएं (कहें) (ताकि :hover
छद्म वर्ग IE 6 में काम करेगा, देखें), आकार में प्रत्येक 1 पिक्सेल। :hover
उन <a>
तत्वों के लिए एक सीएसएस नियम बनाएं जो एक संपत्ति को बदलते हैं (चलो कहते हैं font-family
)। अपने लोड हैंडलर में, 4 मिलियन <a>
तत्वों में से प्रत्येक के माध्यम से चक्र , जाँच currentStyle
/ getComputedStyle()
जब तक आप होवर फ़ॉन्ट के साथ एक नहीं पाते। दस्तावेज़ के भीतर समन्वय प्राप्त करने के लिए इस तत्व से वापस निकालें।
एनबी ने ऐसा नहीं किया ।
<a>
दिए गए आयतों को कवर करने वाले तत्वों की एक जोड़ी बनायें (आकार <img>
तत्वों की पूर्ण स्थिति का उपयोग करके , मुझे लगता है), हर बार आयताकार को सिकोड़ते हुए। हां, यह हास्यास्पद है, लेकिन इसलिए यह जानकारी पहले mousemove से पहले प्राप्त करने में सक्षम नहीं है।
संपादित करें 2020: यह किसी भी अधिक काम नहीं करता है । ऐसा लगता है, कि ब्राउज़र विक्रेताओं ने इसे बाहर निकाल दिया। क्योंकि अधिकांश ब्राउज़र क्रोमियम पर भरोसा करते हैं, यह इसके मूल में हो सकता है।
पुराना उत्तर: आप माउस को भी हुक कर सकते हैं (यह घटना पृष्ठ पुनः लोड होने के बाद निकाल दी जाती है, जब मूसकसर पृष्ठ के अंदर होता है)। दूषित कोड का विस्तार करना चाहिए:
var x = null;
var y = null;
document.addEventListener('mousemove', onMouseUpdate, false);
document.addEventListener('mouseenter', onMouseUpdate, false);
function onMouseUpdate(e) {
x = e.pageX;
y = e.pageY;
console.log(x, y);
}
function getMouseX() {
return x;
}
function getMouseY() {
return y;
}
आप x और y को mouseleave-event पर शून्य करने के लिए भी सेट कर सकते हैं। इसलिए आप यह जांच सकते हैं कि उपयोगकर्ता आपके पेज पर कर्सर के साथ है या नहीं।
mouseleave
घटना है कि सेट x
और y
वापस करने के लिए null
या'undefined'
आप क्या कर सकते हैं x
और y
अपने कर्सर के निर्देशांक के लिए वैरिएबल बना सकते हैं , जब भी माउस मूव करता है तो उन्हें अपडेट करें और संग्रहीत स्थिति के साथ आपकी आवश्यकता के लिए एक अंतराल पर एक फ़ंक्शन को कॉल करें।
इस कोर्स के लिए नकारात्मक पक्ष यह है कि माउस के कम से कम एक प्रारंभिक आंदोलन के लिए इसे काम करना आवश्यक है। जब तक कर्सर कम से कम एक बार अपनी स्थिति को अपडेट करता है, तब तक हम इसकी स्थिति का पता लगाने में सक्षम हैं, चाहे वह फिर से चलें।
var cursorX;
var cursorY;
document.onmousemove = function(e){
cursorX = e.pageX;
cursorY = e.pageY;
}
setInterval(checkCursor, 1000);
function checkCursor(){
alert("Cursor at: " + cursorX + ", " + cursorY);
}
पूर्ववर्ती कोड आपके कर्सर के संदेश के साथ एक सेकंड में एक बार अपडेट होता है। आशा है कि ये आपकी मदद करेगा।
cursorX/Y
किसी भी घटना के होने से पहले उन वेरिएबल को भरने का रास्ता खोज रहा हूँ ।
टिम डाउन ने जो सुझाव दिया, उसके समान आप कुछ कोशिश कर सकते हैं - लेकिन स्क्रीन पर प्रत्येक पिक्सेल के लिए तत्व होने के बजाय, बस 2-4 तत्व (बॉक्स) बनाएं, और स्क्रीन पर अभी तक संभव स्थानों को विभाजित करने के लिए गतिशील रूप से उनकी जगह, चौड़ाई, ऊँचाई बदलें। 2-4 पुनरावर्ती द्वारा, इस प्रकार माउस वास्तविक स्थान को जल्दी से खोज रहा है।
उदाहरण के लिए - पहले तत्व स्क्रीन के दाएं और बाएं आधे भाग लेते हैं, बाद में ऊपरी और निचले आधे। अब तक हम पहले से ही जानते हैं कि माउस किस तिमाही में स्क्रीन पर स्थित है, दोहराने में सक्षम है - इस अंतरिक्ष के किस तिमाही में ...
अगर आप 2,000 x 2,000 <a>
तत्वों को प्रस्तुत करते हैं तो @Tim डाउन का उत्तर निष्पादित नहीं होता है :
ठीक है, मैंने अभी एक तरीका सोचा है। अपने पृष्ठ को एक div के साथ ओवरले करें जो पूरे दस्तावेज़ को कवर करता है। उसके अंदर, 2,000 x 2,000 तत्व बनाएं (कहें) (ताकि: hover छद्म वर्ग IE 6 में काम करेगा, देखें), आकार में प्रत्येक 1 पिक्सेल। एक सीएसएस बनाएं: उन तत्वों के लिए होवर नियम जो एक संपत्ति को बदलते हैं (चलो फ़ॉन्ट-परिवार कहते हैं)। अपने लोड हैंडलर में, 4 मिलियन तत्वों में से प्रत्येक के माध्यम से साइकिल चलाएं, जब तक आप होवर फ़ॉन्ट के साथ नहीं मिलते हैं, तब तक करंटस्टाइल / getComputedStyle () की जांच करें। दस्तावेज़ के भीतर समन्वय प्राप्त करने के लिए इस तत्व से वापस बाहर निकालें।
एनबी ने ऐसा नहीं किया।
लेकिन आपको 4 मिलियन तत्वों को एक बार में प्रस्तुत करने की आवश्यकता नहीं है, इसके बजाय बाइनरी खोज का उपयोग करें। <a>
इसके बजाय केवल 4 तत्वों का उपयोग करें:
<a>
तत्वों में विभाजित करें getComputedStyle()
फ़ंक्शन का उपयोग करके यह निर्धारित करना कि कौन सा आयत माउस घूमता हैइस तरह आपको इन चरणों को अधिकतम 11 बार दोहराने की आवश्यकता होगी, आपकी स्क्रीन पर विचार 2048px से अधिक व्यापक नहीं है।
तो आप अधिकतम 11 x 4 = 44 <a>
तत्व उत्पन्न करेंगे ।
यदि आपको एक पिक्सेल के लिए माउस की स्थिति निर्धारित करने की आवश्यकता नहीं है, लेकिन कहते हैं कि 10px सटीकता ठीक है। आप अधिकतम 8 बार चरणों को दोहराएंगे, इसलिए आपको अधिकतम 8 x 4 = 32 <a>
तत्वों को आकर्षित करना होगा ।
साथ ही <a>
तत्वों को उत्पन्न करना और तबाह करना परफॉर्म नहीं है क्योंकि DOM आमतौर पर धीमा है। बजाय, आप बस प्रारंभिक 4 पुन: उपयोग कर सकते हैं <a>
तत्वों और सिर्फ अपने को समायोजित top
, left
, width
और height
चरणों के माध्यम से आप के रूप में पाश।
अब, 4 <a>
का निर्माण एक ओवरकिल भी है। इसके बजाय, आप प्रत्येक आयत में <a>
परीक्षण के लिए एक ही तत्व का पुन: उपयोग कर सकते हैं getComputedStyle()
। तो, बंटवारे के बजाय 2 एक्स 2 में खोज क्षेत्र <a>
तत्वों बस एक ही पुन: उपयोग <a>
तत्व के साथ ले जाकर top
और left
शैली गुण।
तो, आप सभी की जरूरत है एक एकल <a>
तत्व को बदलने के लिए width
और height
अधिकतम 11 बार है, और उसके top
और left
अधिकतम 44 बार बदलने के लिए और आप सटीक माउस स्थिति होगी।
सबसे सरल समाधान लेकिन 100% सटीक नहीं
$(':hover').last().offset()
परिणाम: {top: 148, left: 62.5}
परिणाम निकटतम तत्व आकार पर निर्भर करता है और undefined
उपयोगकर्ता द्वारा टैब स्विच किए जाने पर वापस लौटता है
undefined
परवाह किए बिना लौटता है । क्या आप इसका उपयोग करने के तरीके के बारे में विस्तार से बता सकते हैं?
undefined
जब कर्सर किसी भी तत्व (या जब ब्राउज़र ने फ़ोकस को खो दिया हो) नहीं था। यदि आप कंसोल से परीक्षण कर रहे हैं, तो आपको समय अंतराल सेट करने की आवश्यकता हो सकती है ..
setTimeout
काम किया। मैं jsfiddle का उपयोग कर रहा था और आप सही कह रहे हैं, यह कभी भी एक हॉवर ईवेंट को हिट नहीं करता है क्योंकि यह डोम को हर बार जब आप प्ले पर क्लिक करते हैं, तो फिर से खोल देता है। मैं दूसरों के लिए इस संकेत को जोड़ने की सलाह दूंगा।
मैं कल्पना करता हूं कि शायद आपके पास टाइमर के साथ एक मूल पृष्ठ है और एक निश्चित समय या कार्य पूरा होने के बाद, आप उपयोगकर्ता को एक नए पृष्ठ पर भेजते हैं। अब आप कर्सर की स्थिति चाहते हैं, और क्योंकि वे प्रतीक्षा कर रहे हैं, वे जरूरी नहीं कि माउस को छू रहे हैं। इसलिए मानक घटनाओं का उपयोग करके मूल पृष्ठ पर माउस को ट्रैक करें और नए पृष्ठ के अंतिम मूल्य को प्राप्त करें या पोस्ट वेरिएबल में पास करें।
आप JHiring के कोड का उपयोग अपने मूल पृष्ठ पर कर सकते हैं ताकि नवीनतम स्थिति हमेशा एक वैश्विक चर में उपलब्ध हो:
var cursorX;
var cursorY;
document.onmousemove = function(e){
cursorX = e.pageX;
cursorY = e.pageY;
}
यह उन उपयोगकर्ताओं की मदद नहीं करेगा जो आपके मूल पृष्ठ के अलावा अन्य माध्यमों से इस पृष्ठ पर जाते हैं।
मैंने एक क्षैतिज / ऊर्ध्वाधर खोज कार्यान्वित की, (पहले क्षैतिज रूप से व्यवस्थित खड़ी रेखा लिंक से भरा एक div बनाते हैं, फिर क्षैतिज रूप से व्यवस्थित किए गए क्षैतिज रेखा लिंक से भरा एक div बनाते हैं, और बस देखते हैं कि किसके पास होवर स्टेट है) जैसे टिम डाउन का विचार ऊपर है, और यह बहुत तेजी से काम करता है। अफसोस की बात है, KDE पर Chrome 32 पर काम नहीं करता है।
jsfiddle.net/5XzeE/4/
कर्सर के स्थान को प्राप्त करने के लिए आपको माउस को स्थानांतरित करने की आवश्यकता नहीं है । स्थान भी चूहे के अलावा अन्य घटनाओं पर बताया गया है । यहाँ एक उदाहरण के रूप में एक क्लिक-इवेंट है :
document.body.addEventListener('click',function(e)
{
console.log("cursor-location: " + e.clientX + ',' + e.clientY);
});
@ सुपरनोवा के उत्तर पर भरोसा करते हुए , यहां ES6 कक्षाओं का उपयोग करने का एक तरीका this
है जो आपके कॉलबैक में संदर्भ को सही रखता है :
class Mouse {
constructor() {
this.x = 0;
this.y = 0;
this.callbacks = {
mouseenter: [],
mousemove: [],
};
}
get xPos() {
return this.x;
}
get yPos() {
return this.y;
}
get position() {
return `${this.x},${this.y}`;
}
addListener(type, callback) {
document.addEventListener(type, this); // Pass `this` as the second arg to keep the context correct
this.callbacks[type].push(callback);
}
// `handleEvent` is part of the browser's `EventListener` API.
// https://developer.mozilla.org/en-US/docs/Web/API/EventListener/handleEvent
handleEvent(event) {
const isMousemove = event.type === 'mousemove';
const isMouseenter = event.type === 'mouseenter';
if (isMousemove || isMouseenter) {
this.x = event.pageX;
this.y = event.pageY;
}
this.callbacks[event.type].forEach((callback) => {
callback();
});
}
}
const mouse = new Mouse();
mouse.addListener('mouseenter', () => console.log('mouseenter', mouse.position));
mouse.addListener('mousemove', () => console.log('mousemove A', mouse.position));
mouse.addListener('mousemove', () => console.log('mousemove B', mouse.position));
यहाँ मेरा समाधान है। यह Window.currentMouseX और window.currentMouseY प्रॉपर्टीज को आप कहीं भी उपयोग कर सकते हैं। यह शुरू में और बाद में सही मूल्यों को सेट करने के लिए माउस आंदोलनों को सुनता है एक hovered तत्व (यदि कोई हो) की स्थिति का उपयोग करता है।
(function () {
window.currentMouseX = 0;
window.currentMouseY = 0;
// Guess the initial mouse position approximately if possible:
var hoveredElement = document.querySelectorAll(':hover');
hoveredElement = hoveredElement[hoveredElement.length - 1]; // Get the most specific hovered element
if (hoveredElement != null) {
var rect = hoveredElement.getBoundingClientRect();
// Set the values from hovered element's position
window.currentMouseX = window.scrollX + rect.x;
window.currentMouseY = window.scrollY + rect.y;
}
// Listen for mouse movements to set the correct values
document.addEventListener('mousemove', function (e) {
window.currentMouseX = e.pageX;
window.currentMouseY = e.pageY;
});
}())
रचना सीएमएस स्रोत: https://github.com/ocproducts/composr/commit/a851c19f925be20bc16bfe016be42924989f262e#diff-b162cc9c35a97618a96748639ff41251R1202
var x = 0;
var y = 0;
document.addEventListener('mousemove', onMouseMove, false)
function onMouseMove(e){
x = e.clientX;
y = e.clientY;
}
function getMouseX() {
return x;
}
function getMouseY() {
return y;
}
मुझे लगता है कि मेरे पास काउंटिंग डिव और पिक्सल..लोल के साथ एक उचित समाधान हो सकता है
बस एनीमेशन फ्रेम या एक समारोह के समय अंतराल का उपयोग करें। आपको अभी भी केवल आरंभ करने के लिए एक बार एक माउस ईवेंट की आवश्यकता होगी, लेकिन तकनीकी रूप से आप इसे कभी भी पसंद करते हैं।
अनिवार्य रूप से हम माउस आंदोलन के साथ हर समय एक डमी div पर नज़र रख रहे हैं।
// create a div(#mydiv) 1px by 1px set opacity to 0 & position:absolute;
नीचे तर्क है ..
var x,y;
$('body').mousemove(function( e ) {
var x = e.clientX - (window.innerWidth / 2);
var y = e.clientY - (window.innerHeight / 2);
}
function looping (){
/* track my div position 60 x 60 seconds!
with out the mouse after initiation you can still track the dummy div.x & y
mouse doesn't need to move.*/
$('#mydiv').x = x; // css transform x and y to follow
$('#mydiv)'.y = y;
console.log(#mydiv.x etc)
requestAnimationFrame( looping , frame speed here);
}