हालांकि cursor: noneसीएसएस समाधान निश्चित रूप से एक ठोस और आसान समाधान है , यदि आपका वास्तविक लक्ष्य डिफ़ॉल्ट कर्सर को हटाना है , जबकि आपके वेब एप्लिकेशन का उपयोग किया जा रहा है, या कच्चे माउस आंदोलन की अपनी व्याख्या लागू करें (उदाहरण के लिए, एफपीएस गेम), तो आप कर सकते हैं इसके बजाय पॉइंटर लॉक एपीआई का उपयोग करने पर विचार करना चाहते हैं ।
आप कर्सर को हटाने के लिए एक तत्व पर requestPointerLock का उपयोग कर सकते हैं , और सभी mousemoveघटनाओं को उस तत्व पर पुनर्निर्देशित कर सकते हैं (जिसे आप संभाल सकते हैं या नहीं संभाल सकते हैं):
document.body.requestPointerLock();
अवरोध खोल करने के लिए, आप उपयोग कर सकते exitPointerLock :
document.exitPointerLock();
अतिरिक्त नोट्स
कोई कर्सर नहीं, असली के लिए
यह एक बहुत शक्तिशाली एपीआई कॉल है। यह न केवल आपके कर्सर को अदृश्य रूप से प्रस्तुत करता है, बल्कि यह वास्तव में आपके ऑपरेटिंग सिस्टम के मूल कर्सर को हटा देता है । आप पाठ का चयन करें, या ऐसा करने में सक्षम नहीं होगा कुछ भी जब तक पॉइंटर लॉक (का उपयोग करके या तो जारी किया गया है (अपने कोड में कुछ माउस की घटनाओं को सुनने को छोड़कर) अपने माउस के साथ exitPointerLockया दबाने ESCकुछ ब्राउज़रों में)।
अर्थात्, आप फिर से दिखाने के लिए अपने कर्सर के साथ खिड़की नहीं छोड़ सकते, क्योंकि कोई कर्सर नहीं है।
प्रतिबंध
जैसा कि ऊपर उल्लेख किया गया है, यह एक बहुत शक्तिशाली एपीआई कॉल है, और इस प्रकार केवल वेब पर कुछ प्रत्यक्ष उपयोगकर्ता-इंटरैक्शन के जवाब में बनाया जा सकता है, जैसे कि एक क्लिक; उदाहरण के लिए:
document.addEventListener("click", function () {
document.body.requestPointerLock();
});
इसके अलावा, requestPointerLockएक सैंडबॉक्स से काम नहीं करेगा iframeजब तक कि allow-pointer-lockअनुमति सेट है।
उपयोगकर्ता-सूचनाएं
कुछ ब्राउज़र लॉक लगे होने से पहले पुष्टि के लिए उपयोगकर्ता को संकेत देंगे, कुछ बस एक संदेश प्रदर्शित करेंगे। इसका मतलब है कि सूचक लॉक कॉल के तुरंत बाद सक्रिय नहीं हो सकता है। हालांकि, पॉइंटर लॉकिंग की वास्तविक सक्रियता pointerchangeको उस तत्व पर घटना को सुनकर सुना जा सकता है जिस requestPointerLockपर कहा गया था:
document.body.addEventListener("pointerlockchange", function () {
if (document.pointerLockElement === document.body) {
// Pointer is now locked to <body>.
}
});
अधिकांश ब्राउज़र केवल एक बार संदेश प्रदर्शित करेंगे, लेकिन फ़ायरफ़ॉक्स कभी-कभी हर एक कॉल पर संदेश को स्पैम कर देगा। AFAIK, यह केवल उपयोगकर्ता-सेटिंग्स द्वारा काम किया जा सकता है, फ़ायरफ़ॉक्स में डिसएबल पॉइंटर-लॉक अधिसूचना देखें ।
कच्चे माउस आंदोलन को सुनकर
पॉइंटर लॉक एपीआई न केवल माउस को हटाता है, बल्कि कच्चे माउस आंदोलन डेटा को तत्व requestPointerLockपर पुनर्निर्देशित करता है। इसे केवल mousemoveघटना का उपयोग करके सुना जा सकता है , फिर घटना वस्तु पर गुणों movementXऔर movementYगुणों तक पहुंच बनाई जा सकती है :
document.body.addEventListener("mousemove", function (e) {
console.log("Moved by " + e.movementX + ", " + e.movementY);
});