เลื่อนตัวชี้เมาส์ไปยังตำแหน่งเฉพาะหรือไม่?


127

ฉันกำลังสร้างเกม HTML5 และฉันพยายามวางเคอร์เซอร์ของเมาส์ไว้เหนือการควบคุมบางอย่างในเหตุการณ์หนึ่ง ๆ เพื่อให้การเคลื่อนที่ไปในทิศทางที่เฉพาะเจาะจงจะได้ผลลัพธ์เดียวกันเสมอ เป็นไปได้หรือไม่


ถ้าฉันเข้าใจถูกต้องคุณต้องการเลื่อนเคอร์เซอร์ของเมาส์โดยใช้ JS ซึ่งเป็นไปไม่ได้ คุณจะต้องหาวิธีอื่น
สามสิบดอท

1
HTML5 มีเหตุการณ์เมาส์ใหม่ ๆ แต่ไม่มีอะไรให้ขยับเมาส์ คุณสามารถ window.moveBy (x, y); เพื่อย้ายหน้าต่างข้างใต้ที่เมาส์เลื่อน .. นั่นจะเป็นเกมที่ค่อนข้างขี้ขลาด :) วิธีเดียวที่ฉันเห็นว่ามันกำลังทำผ่าน ActiveX - ewwww, yuk!
Jeremy Thompson

1
ไม่ - JavaScript ไม่ยอมให้คุณทำอย่างนั้น แต่ฉันเดาว่าอาจมีวิธีแก้ปัญหาที่เกี่ยวข้องกับการย้ายเพจไปยังตำแหน่งเฉพาะซึ่งจะ "ย้าย" เคอร์เซอร์เช่นกันโดยใช้หน้าต่าง scrollTo () - ดู w3Schools ที่w3schools.com/jsref/met_win_scrollto.asp
Stardust

1
ขอให้โชคดีกับการเลื่อนเมาส์บนสมาร์ทโฟน
Cœur

สามารถเลื่อนภาพของตัวชี้เมาส์ไปรอบ ๆ และตั้งค่าเคอร์เซอร์: ไม่มี ไม่ใช่ความเสี่ยงด้านความปลอดภัยเนื่องจากคุณเป็นโปรแกรมเมอร์ หากคุณสามารถสร้างเกมได้คุณยังสามารถหลีกเลี่ยงความเสี่ยงในการคลิกเข้าสู่บัญชีธนาคารของคุณในขณะที่คุณกำลังเล่นเกมได้

คำตอบ:


20

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่ก่อนอื่นฉันจะบอกว่ามันเป็นไปไม่ได้ สิ่งที่ใกล้เคียงที่สุดในขณะนี้คือการล็อคเมาส์ไว้ที่ตำแหน่งเดียวและติดตามการเปลี่ยนแปลงของ x และ y แนวคิดนี้ถูกนำมาใช้โดย - ดูเหมือนว่า - Chrome และ Firefox มันถูกจัดการโดยสิ่งที่เรียกว่าMouse Lockและการกดปุ่ม Escape จะทำให้มันพัง จากการอ่านข้อมูลสั้น ๆของฉันฉันคิดว่าแนวคิดคือมันล็อกเมาส์ไว้ที่ตำแหน่งเดียวและรายงานเหตุการณ์การเคลื่อนไหวที่คล้ายกับเหตุการณ์คลิกแล้วลาก

นี่คือเอกสารเผยแพร่:
FireFox: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Chrome: http://www.chromium.org/developers/design-documents/mouse-lock

และนี่คือการสาธิตที่ค่อนข้างเรียบร้อย: http://media.tojicode.com/q3bsp/


ฉันรับสิ่งนี้เป็นคำตอบใหม่ที่ได้รับการยอมรับเนื่องจากนี่เป็นกรณีการใช้งานที่ฉันขอแม้ว่าจะไม่รองรับในทุกเบราว์เซอร์ก็ตาม
Dennkster

188

คุณไม่สามารถเลื่อนตัวชี้เมาส์ด้วยจาวาสคริปต์

ลองคิดถึงความหมายสักครู่ถ้าคุณทำได้;)

  1. ผู้ใช้คิดว่า: "เฮ้ฉันต้องการคลิกลิงก์นี้"
  2. Javascript ย้ายเมาส์เคอร์เซอร์ไปยังลิงค์อื่น
  3. ผู้ใช้คลิกลิงก์ผิดและดาวน์โหลดมัลแวร์ที่จัดรูปแบบ c-drive โดยไม่ได้ตั้งใจและกินขนมของเขา

74
clickjacking จริง
Blender

15
ลองคิดดูสิมันจะเจ๋งมาก: P
Martin Jespersen

24
เฮ้ฉันเกลียดการต่อสู้เพื่อควบคุมเคอร์เซอร์เมาส์ของฉัน: กลับคุณโฆษณากลับฉันพูด!
Blender

78
หน้าเว็บสามารถบังคับให้ดาวน์โหลดได้โดยไม่ต้องให้ใครคลิกลิงก์ดังนั้นสิ่งที่คุณอ้างจึงไม่ใช่ปัญหาด้านความปลอดภัย แม้ว่าจะไม่สามารถย้ายออกนอกหน้าต่างหน้าเว็บได้
dionyziz

11
@dionyziz: มีความแตกต่างอย่างมากระหว่างการบังคับให้ดาวน์โหลดลงในแซนด์บ็อกซ์และการดาวน์โหลด userspace เริ่มต้นโดยการโต้ตอบของผู้ใช้ ผลกระทบด้านความปลอดภัยเป็นเรื่องใหญ่มาก
Martin Jespersen

88
  1. เรียกใช้เว็บเซิร์ฟเวอร์ขนาดเล็กบนเครื่องไคลเอนต์ สามารถเป็นสิ่งเล็ก ๆ 100kb สคริปต์ Python / Perl ฯลฯ
  2. รวมไฟล์ปฏิบัติการ C ขนาดเล็กที่คอมไพล์ไว้ล่วงหน้าที่สามารถเลื่อนเมาส์ได้
  3. เรียกใช้เป็นสคริปต์ CGI ผ่านการเรียก http แบบธรรมดา AJAX อะไรก็ได้ - ด้วยพิกัดที่คุณต้องการเลื่อนเมาส์ไปเช่น:

    http://localhost:9876/cgi/mousemover?x=200&y=450

PS: สำหรับปัญหาใด ๆ มีข้อแก้ตัวหลายร้อยข้อว่าทำไมและอย่างไร - ทำไม่ได้และไม่ควรทำ .. แต่ในจักรวาลที่ไม่มีที่สิ้นสุดนี้มันเป็นเรื่องของความมุ่งมั่นจริงๆ - ว่าคุณ จะทำให้มันเกิดขึ้น


13
ฉันคิดว่าเราทุกคนอยู่บนเรือจนถึง "c ปฏิบัติการ" ... xD
dGRAMOP

1
เว็บเซิร์ฟเวอร์? บางทีคุณอาจหมายถึงโปรแกรมที่มีอินเตอร์เฟส http .. ไม่จำเป็นต้องมีเว็บ ภาษาการเขียนโปรแกรม Go อาจมีข้อได้เปรียบเหนือ C เนื่องจากอาจทำให้ง่ายต่อการเพิ่มส่วน http หรืออีกทางหนึ่งล่าม nodejs จะเรียกใช้โค้ดที่อาจรวมอินเตอร์เฟส http ได้ค่อนข้างง่ายเนื่องจากตัวแปล nodejs สร้างขึ้นเพื่อให้ง่ายต่อการ เขียนโปรแกรมเซิร์ฟเวอร์
barlop

3
C = 0 การอ้างอิง เว็บคือ http ไม่มีโฮมเพจน่ารัก ๆ ที่นี่ .. เพียงขนส่ง.
Alex Gray

+1 สำหรับ PS. เราสามารถเรียกใช้ CGI โดยใช้ node dev-server หรือnpmjs.com/package/http-server ที่คล้ายกันได้หรือไม่?
ATHER

1
มีใครสังเกตเห็นJavascriptแท็กด้านล่างคำถามไหม

80

ฉันคิดว่าคุณสามารถวางเคอร์เซอร์ของเมาส์ไปยังพื้นที่ที่กำหนดของหน้าจอได้หากคุณไม่ได้ใช้เคอร์เซอร์ของเมาส์ (ระบบ) จริง

ตัวอย่างเช่นคุณสามารถสร้างภาพเพื่อทำหน้าที่แทนเคอร์เซอร์ของคุณจัดการเหตุการณ์ที่เมื่อตรวจพบการวางเมาส์เข้าไปในฉากของคุณตั้งค่ารูปแบบบนเคอร์เซอร์ของระบบเป็น 'ไม่มี' ( sceneElement.style.cursor = 'none') จากนั้นจะแสดงองค์ประกอบภาพที่ซ่อนอยู่ เป็นเคอร์เซอร์ได้ทุกที่ที่คุณต้องการในฉากตามการแปลแกน / กรอบขอบเขตที่กำหนดไว้ล่วงหน้า

วิธีนี้ไม่ว่าคุณจะย้ายเคอร์เซอร์จริงอย่างไรวิธีการแปลของคุณจะเก็บเคอร์เซอร์รูปภาพของคุณไว้ทุกที่ที่คุณต้องการ

แก้ไข: ตัวอย่างใน jsFiddle โดยใช้การแสดงภาพและการบังคับเมาส์


5
ใช่คุณสามารถ. คุณเพียงแค่ตั้งค่ารูปแบบเคอร์เซอร์ในองค์ประกอบที่กำหนดเป็น 'ไม่มี' ให้มันลอง.
Xaxis

14
นี่คือคำตอบที่น่าคิดที่สุด และให้คำตอบที่แท้จริงในขณะที่คำตอบอื่น ๆ dot จะเพิ่มมูลค่าได้จริง ๆ :) แต่ webgl จะนำเกมที่น่าสนใจเช่น FPS และอื่น ๆ มาใช้ได้อย่างไรในเมื่อเราไม่สามารถล็อคเมาส์ได้มันฟังดู จำกัด มาก ...
Dennkster

3
ที่ยังคงมีปัญหาในการ "เลื่อน" เมาส์ไปทางซ้ายไม่ได้ เมื่อเมาส์ออกจากหน้าเว็บคุณจะไม่สามารถควบคุมได้
dionyziz

2
นี่เป็นวิธีแก้ปัญหาที่สมบูรณ์แบบสำหรับปัญหานี้ เหตุผลเดียวที่มีคนบ่นเพราะมันไม่ใช่วิธีแก้ปัญหาที่น่าเบื่อ บางครั้งคุณต้องเขียนโปรแกรมบ้าง!
Marty

5
เล่นกับแนวคิดนี้และสร้างตัวอย่างใน JSFiddle jsfiddle.net/jaakkytt/9uczV
Jaak Kütt

65

คำถามที่ดี นี่คือสิ่งที่ขาดหายไปจาก Javascript browser API ฉันกำลังทำงานกับเกม WebGL ร่วมกับทีมของฉันและเราต้องการคุณสมบัตินี้ ฉันเปิดปัญหาเกี่ยวกับ bugzilla ของ Firefox เพื่อที่เราจะได้เริ่มพูดคุยเกี่ยวกับความเป็นไปได้ที่จะมี API เพื่ออนุญาตให้ล็อคเมาส์ สิ่งนี้จะเป็นประโยชน์สำหรับนักพัฒนาเกม HTML5 / WebGL ทั้งหมดที่นั่น

หากคุณต้องการมาแสดงความคิดเห็นพร้อมกับข้อเสนอแนะของคุณและโหวตให้ปัญหา:

https://bugzilla.mozilla.org/show_bug.cgi?id=630979

ขอบคุณ!


9
อัปเดต: bugzilla.mozilla.org/show_bug.cgi?id=633602และข้อมูลจำเพาะ w3 สำหรับการล็อกตัวชี้: dvcs.w3.org/hg/pointerlock/raw-file/default/index.html
Chris Anderson

51
หากเกิดเหตุการณ์นี้ฉันจะเลิกใช้เบราว์เซอร์ :-P อย่างจริงจังเว็บไซต์ไม่ต้องการความยินยอมที่คุณให้เมื่อคุณติดตั้งแอปพลิเคชัน นี่จะเป็นคุณสมบัติที่ยอดเยี่ยมหากเราทุกคนเป็นคนดีเพียงแค่ใช้การควบคุมระดับนี้เพื่อปรับปรุงประสบการณ์ของผู้ใช้ น่าเสียดายที่อินเทอร์เน็ตเป็นศูนย์กลางซึ่งเป็นเหตุผลว่าทำไมจึงมีคุณสมบัติที่เป็นระเบียบมากมายที่เราหวังว่าจะไม่เคยเห็นในเบราว์เซอร์ ดังที่กล่าวไว้: API แบบเต็มหน้าจอจะทำงานเพื่อ "ล็อก" ระบบปฏิบัติการที่เหลือ
ใครบางคน

4
@ จะมีการขอความยินยอมจากใครบางคนก่อนที่แอปพลิเคชันจะสามารถล็อกได้ (คล้ายกับการขอความยินยอมแบบเต็มหน้าจอในเว็บเบราว์เซอร์ยอดนิยม) นอกจากนี้ผู้ใช้สามารถเพิกถอนคำยินยอมได้ตลอดเวลาโดยการกดปุ่ม ESC
dionyziz

7
มันเกิดขึ้น และมันก็ยอดเยี่ยมมาก (ถ้ายังมีคำนำหน้าผู้ขาย): mdn.github.io/pointer-lock-demo
ericsoco

1
@ericsoco น่าเศร้าที่ลิงค์เสีย สิ่งนี้อาจช่วยได้: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Tian van Heerden

46

คุณสามารถตรวจจับตำแหน่งของตัวชี้เมาส์จากนั้นเลื่อนหน้าเว็บ (โดยมีตำแหน่งของร่างกายสัมพันธ์กัน) เพื่อให้พวกเขาวางเมาส์เหนือสิ่งที่คุณต้องการให้คลิก

ตัวอย่างเช่นคุณสามารถวางโค้ดนี้บนหน้าปัจจุบันในคอนโซลเบราว์เซอร์ของคุณ (และรีเฟรชในภายหลัง)

var upvote_position = $('#answer-12878316').position();
$('body').mousemove(function (event) {
    $(this).css({
        position: 'relative',
        left: (event.pageX - upvote_position.left - 22) + 'px',
        top: (event.pageY - upvote_position.top - 35) + 'px'
    });        
});

2
โพสต์ของคุณจะมีคุณค่ามากขึ้นหากคุณสามารถโพสต์ตัวอย่างโค้ดที่ทำได้ นอกจากนี้ฉันขอแนะนำให้คุณดูคำถามที่พบบ่อย: stackoverflow.com/faq
ForceMagic

คุณคลิกองค์ประกอบที่ถูกต้องได้อย่างไรเมื่อผู้ใช้คลิก
mmm

@momomo คุณสามารถใช้document.getElementByID('thingtoclick').click();
แบบลดหลั่น

1
นั่นเป็นตัวเอกโดยสิ้นเชิง! วิธีคิดนอกกรอบ! ฉันสงสัยว่ามันให้สิ่งที่ผู้ถามต้องการจริงๆ แต่เจ๋งเหมือนเดิมใครจะสนล่ะ?
gcdev

12

คุณไม่สามารถเลื่อนเมาส์ได้ แต่สามารถล็อกได้ หมายเหตุ: คุณต้องเรียก requestPointerLock ในเหตุการณ์คลิก

ตัวอย่างเล็ก ๆ :

var canvas = document.getElementById('mycanvas');
canvas.requestPointerLock = canvas.requestPointerLock || canvas.mozRequestPointerLock || canvas.webkitRequestPointerLock;
canvas.requestPointerLock();

ตัวอย่างเอกสารและโค้ดฉบับเต็ม:

https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API


4

คุณไม่สามารถเลื่อนตัวชี้เมาส์โดยใช้จาวาสคริปต์ได้และด้วยเหตุผลด้านความปลอดภัยที่ชัดเจน วิธีที่ดีที่สุดในการบรรลุเอฟเฟกต์นี้คือวางตัวควบคุมไว้ใต้ตัวชี้เมาส์


1
ผลกระทบด้านความปลอดภัยยังห่างไกลจากความชัดเจน ในความเป็นจริงการเพิ่มมาตรฐานล่าสุดทำให้เกิดความสามารถนี้โดยไม่มีปัญหาด้านความปลอดภัยที่ร้ายแรง
dionyziz

แต่แล้วมันเป็นไปได้อย่างไรใน API แบบลากแล้วปล่อย?
oldboy

0

สิ่งนี้ไม่สามารถทำได้โดยการรับตำแหน่งจริงของตัวชี้เมาส์จากนั้นคำนวณและชดเชยการกระทำของเมาส์สไปรท์ / ฉากตามค่าตอบแทนนี้หรือไม่?

ตัวอย่างเช่นคุณต้องให้ตัวชี้เมาส์อยู่ตรงกลางด้านล่าง แต่อยู่ด้านซ้ายบน ซ่อนเคอร์เซอร์ใช้ภาพเคอร์เซอร์ที่เลื่อน เลื่อนการเคลื่อนที่ของเคอร์เซอร์และอินพุตของเมาส์แผนที่เพื่อให้ตรงกับการคลิกสไปรท์เคอร์เซอร์ที่วางตำแหน่งใหม่ (หรือ 'ควบคุม') คลิกเมื่อ / ถ้ามีการชนขอบเขตให้คำนวณใหม่ ถ้า / เมื่อเคอร์เซอร์ไปถึงจุดที่คุณต้องการให้เป็นจริงให้ลบการชดเชยออก

ข้อจำกัดความรับผิดชอบไม่ใช่ผู้พัฒนาเกม


เหมือนกับคำตอบของ Xaxis โดยพื้นฐานแล้ว
mathheadinclouds

@mathheadinclouds แน่นอน แต่ไม่ขึ้นอยู่กับการใช้งานเบราว์เซอร์ของการล็อคเมาส์ โดยพื้นฐานแล้ว; แต่ไม่. ขอบคุณสำหรับความคิดเห็นของคุณ - แก้ไข: ไม่เป็นไร ฉันเข้าใจว่าคุณกำลังพูดอะไร ฉันเดาว่าความคิดเดียวของฉันน่าจะเป็นสิ่งนี้ที่นี่ไม่ได้มีประโยชน์ มีคนธรรมดามากกว่าคำตอบของ Xaxis
Eric Shoberg

0

น่าสนใจ สิ่งนี้ไม่สามารถทำได้โดยตรงจากเหตุผลที่เรียกก่อนหน้านี้ (การคลิกสแปมและการแทรกมัลแวร์) แต่ให้พิจารณาการแฮ็กนี้ซึ่งสร้างความประทับใจในลักษณะเดียวกัน:

ขั้นตอนที่ 1: ซ่อนเคอร์เซอร์

สมมติว่าคุณเป็น div คุณสามารถใช้คุณสมบัติ css นี้เพื่อซ่อนเคอร์เซอร์จริง:

.your_div {
    cursor: none
}

ขั้นตอนที่ 2: แนะนำเคอร์เซอร์หลอก

เพียงสร้างรูปภาพเคอร์เซอร์ที่มีลักษณะเหมือนกันและวางไว้ในหน้าเว็บของคุณโดยมี position = 'absolute'

ขั้นตอนที่ 3: ติดตามการเคลื่อนไหวของเมาส์จริง

นี่เป็นเรื่องง่าย ตรวจสอบอินเทอร์เน็ตเกี่ยวกับวิธีรับตำแหน่งเมาส์จริง (พิกัด X & Y)

ขั้นตอนที่ 4: เลื่อนเคอร์เซอร์หลอก

ขณะที่เคอร์เซอร์เคลื่อนที่จริงให้เลื่อนเคอร์เซอร์หลอกของคุณตามความแตกต่าง X & Y ในทำนองเดียวกันคุณสามารถสร้างเหตุการณ์การคลิกที่ตำแหน่งใดก็ได้บนหน้าเว็บของคุณด้วย javascript magic (เพียงแค่ค้นหาอินเทอร์เน็ตตามวิธีการ)

ณ จุดนี้คุณสามารถควบคุมเคอร์เซอร์หลอกได้ตามที่คุณต้องการและผู้ใช้ของคุณจะได้รับความรู้สึกว่าเคอร์เซอร์จริงกำลังเคลื่อนที่

====

คำเตือนที่เป็นธรรม:อย่าทำ ไม่มีใครต้องการให้เคอร์เซอร์หรือคอมพิวเตอร์ควบคุมด้วยวิธีนี้เว้นแต่คุณจะใช้กรณีเฉพาะหรือตั้งใจที่จะหนีผู้ใช้ของคุณไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.