কোনও মাউস চলাচল ইভেন্ট ছাড়াই পৃষ্ঠা লোড হওয়ার পরে (মাউস না সরানো) জাভাস্ক্রিপ্টের সাহায্যে মাউসের অবস্থান পাওয়া সম্ভব?
mousemove
ইভেন্ট যুক্ত করে ব্রাউজারটি ধীর করতে চান না ।
কোনও মাউস চলাচল ইভেন্ট ছাড়াই পৃষ্ঠা লোড হওয়ার পরে (মাউস না সরানো) জাভাস্ক্রিপ্টের সাহায্যে মাউসের অবস্থান পাওয়া সম্ভব?
mousemove
ইভেন্ট যুক্ত করে ব্রাউজারটি ধীর করতে চান না ।
উত্তর:
আসল উত্তর: না, এটা সম্ভব নয়।
ঠিক আছে, আমি একটি উপায় চিন্তা করেছি। আপনার পৃষ্ঠাটি একটি ডিবের সাথে ওভারলে দিন যা পুরো ডকুমেন্টকে coversেকে দেয় এর অভ্যন্তরে, 2 হাজার x 2 টি <a>
উপাদান তৈরি করুন (বলুন) যাতে :hover
সিউডো-ক্লাস IE 6 এ কাজ করবে, দেখুন), প্রতিটি 1 পিক্সেল আকারের। সম্পত্তি পরিবর্তন করে :hover
এমন <a>
উপাদানগুলির জন্য একটি সিএসএস বিধি তৈরি করুন (আসুন আমরা বলি font-family
)। আপনার লোড হ্যান্ডলারটিতে, 4 মিলিয়ন <a>
উপাদানগুলির প্রত্যেকের মধ্যে চক্র করুন , পরীক্ষা করুন currentStyle
/ getComputedStyle()
যতক্ষণ না আপনি হোভার ফন্টের সাথে একটি খুঁজে পান। ডকুমেন্টের মধ্যে সমন্বয় পেতে এই উপাদান থেকে ফিরে এক্সট্রোপোলেট করুন।
এনবি এটি করবেন না ।
<a>
প্রদত্ত আয়তক্ষেত্রগুলিকে আচ্ছাদন করার জন্য লুপ তৈরি করে (আকারের <img>
উপাদানগুলির নিখুঁত অবস্থান ব্যবহার করে, আমি মনে করি), প্রতিটি সময় আয়তক্ষেত্র সঙ্কুচিত করে। হ্যাঁ, এটি হাস্যকর, তবে প্রথম মাউসমেভের আগে এই তথ্যটি অর্জন করতে সক্ষম হচ্ছে না।
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
ঘটনা যে সেট 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,000 x 2,000 <a>
উপাদান রেন্ডার করেন :
ঠিক আছে, আমি কেবল একটি উপায় চিন্তা করেছি। আপনার পৃষ্ঠাটি একটি ডিবের সাথে ওভারলে করুন যা পুরো ডকুমেন্টটি কভার করে। এর অভ্যন্তরে, 2,000 x 2,000 উপাদান তৈরি করুন (বলুন) (যাতে: হোভার সিউডো-ক্লাস IE 6 এ কাজ করবে, দেখুন), প্রতিটি 1 পিক্সেল আকারের। একটি CSS তৈরি করুন: সেই উপাদানগুলির জন্য হোভার রুল করুন যা কোনও সম্পত্তি পরিবর্তন করে (আসুন ফন্ট-পরিবার বলি)। আপনার লোড হ্যান্ডলারটিতে, হোভার ফন্টের সাথে একটি না পাওয়া পর্যন্ত বর্তমান স্টাইল / গেটকম্পিউড স্টাইল () পরীক্ষা করে 4 মিলিয়ন উপাদানগুলির প্রত্যেকের মধ্যে চক্র করুন। ডকুমেন্টের মধ্যে সমন্বয় পেতে এই উপাদান থেকে ফিরে এক্সট্রোপোলেট করুন।
এনবি এটি করবেন না।
তবে আপনাকে একবারে 4 মিলিয়ন উপাদান রেন্ডার করতে হবে না, পরিবর্তে বাইনারি অনুসন্ধান ব্যবহার করুন। <a>
পরিবর্তে 4 টি উপাদান ব্যবহার করুন:
<a>
উপাদানগুলিতে ভাগ করুনgetComputedStyle()
কোন আয়তক্ষেত্রের মাউস ঘোরাচ্ছে তা নির্ধারণ করে ফাংশনটি ব্যবহার করেআপনার পর্দা 2048px এর চেয়ে বেশি প্রশস্ত নয় বিবেচনা করে আপনাকে এই পদক্ষেপগুলি সর্বোচ্চ 11 বার পুনরাবৃত্তি করতে হবে।
সুতরাং আপনি সর্বাধিক 11 x 4 = 44 টি <a>
উপাদান তৈরি করবেন।
আপনার যদি পিক্সেলের ঠিক মাউস অবস্থান নির্ধারণ করতে না হয় তবে 10px যথার্থতা ঠিক আছে বলে দিন। আপনি পদক্ষেপগুলি সর্বাধিক 8 বার পুনরাবৃত্তি করতে পারেন, তাই আপনাকে সর্বোচ্চ 8 x 4 = 32 <a>
উপাদান আঁকতে হবে ।
এছাড়াও <a>
ডিওএম সাধারণত ধীর গতির কারণে উপাদানগুলি তৈরি এবং তারপরে ধ্বংসগুলি সম্পাদন করা হয় না। পরিবর্তে, আপনি শুধু প্রাথমিক 4 পুনরায় ব্যবহার করতে পারেন <a>
উপাদান এবং শুধু তাদের সমন্বয় top
, left
, width
এবং height
পদক্ষেপের মধ্য দিয়ে যেমন লুপ।
এখন, 4 তৈরি <a>
করাও ওভারকিল is পরিবর্তে, প্রতিটি আয়তক্ষেত্রের <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
কাজ করছে. আমি জিসফিল ব্যবহার করছিলাম এবং আপনি ঠিক বলেছেন, এটি কখনই হোভার ইভেন্টে আঘাত করে না কারণ প্রতিবার আপনি খেললে এটি ডমকে পুনরায় আঁকায়। আমি অন্যদের জন্য এই ইঙ্গিতটি যুক্ত করার পরামর্শ দেব।
আমি ভাবছি যে আপনার একটি টাইমার সহ একটি প্যারেন্ট পৃষ্ঠা রয়েছে এবং নির্দিষ্ট সময় বা কোনও কাজ শেষ হওয়ার পরে আপনি ব্যবহারকারীকে একটি নতুন পৃষ্ঠায় ফরোয়ার্ড করেছেন। এখন আপনি কার্সার অবস্থানটি চান, এবং যেহেতু তারা অপেক্ষা করছে, তারা অগত্যা মাউস স্পর্শ করছে না। সুতরাং স্ট্যান্ডার্ড ইভেন্টগুলি ব্যবহার করে প্যারেন্ট পৃষ্ঠায় মাউসকে ট্র্যাক করুন এবং একটি গিটে বা পোস্টের ভেরিয়েবলের নতুন পৃষ্ঠায় শেষ মানটি দিন।
আপনি জেহর্ডিংয়ের কোডগুলি আপনার প্যারেন্ট পৃষ্ঠায় ব্যবহার করতে পারেন যাতে সর্বশেষতম অবস্থানটি সর্বদা বিশ্বব্যাপী চলকটিতে উপলভ্য থাকে:
var cursorX;
var cursorY;
document.onmousemove = function(e){
cursorX = e.pageX;
cursorY = e.pageY;
}
এটি আপনার অভিভাবক পৃষ্ঠা ব্যতীত অন্য কোনও উপায়ে এই পৃষ্ঠায় নেভিগেট করা ব্যবহারকারীদের সহায়তা করবে না।
আমি একটি অনুভূমিক / উল্লম্ব অনুসন্ধান প্রয়োগ করেছি, (প্রথমে অনুভূমিকভাবে সাজানো উল্লম্ব লাইন লিঙ্কগুলিতে একটি ডিভি পূর্ণ করুন, তারপরে উল্লম্বভাবে সাজানো অনুভূমিক রেখার লিঙ্কগুলিতে একটি ডিভি পূর্ণ করুন, এবং কেবল টিউম ডাউনের মত মত টিউম ডাউনের মত দেখতে পাবেন) এটি বেশ দ্রুত কাজ করে। দুঃখজনকভাবে, কেডিএতে ক্রোম 32 এ কাজ করে না।
jsfiddle.net/5XzeE/4/
অন দ্য রিফিং @ SuperNova এর উত্তর , এখানে 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));
এখানে আমার সমাধান। এটি উইন্ডো। কর্নারমাউসএক্স এবং উইন্ডো ক্রন্টমাউসওয়্যার বৈশিষ্ট্যগুলি আপনি যে কোনও জায়গায় ব্যবহার করতে পারবেন রফতানি করে । এটি প্রাথমিকভাবে একটি আটকানো উপাদানটির অবস্থান (যদি থাকে তবে) ব্যবহার করে এবং তারপরে সঠিক মানগুলি সেট করতে মাউস গতিবিধি শোনায়।
(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-b162dc9c35a97618a96748639ff41251R1202
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;
}
আমি মনে করি ডিভ এবং পিক্সেল গণনা সহ আমার একটি যুক্তিসঙ্গত সমাধান থাকতে পারে..লল
কেবল অ্যানিমেশন ফ্রেম বা কোনও ফাংশনের একটি সময়ের ব্যবধান ব্যবহার করুন। আপনার কেবলমাত্র একবার শুরু করার জন্য মাউস ইভেন্টের প্রয়োজন হবে তবে প্রযুক্তিগতভাবে আপনি যেখানে চান সেখানে এটি অবস্থান করুন।
মূলত আমরা মাউস চলাচল করে সর্বদা একটি ডামি ডিভাইস ট্র্যাক করছি।
// 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);
}