JavaScript: ตรวจสอบว่าปุ่มเมาส์ลงหรือไม่?


136

มีวิธีตรวจสอบว่าปุ่มเมาส์ค้างใน JavaScript หรือไม่?

ฉันรู้เกี่ยวกับเหตุการณ์ "มูสดาวน์" แต่นั่นไม่ใช่สิ่งที่ฉันต้องการ บางครั้งหลังจากกดปุ่มเมาส์ฉันต้องการตรวจจับว่ายังกดอยู่หรือไม่

เป็นไปได้หรือไม่


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

1
@ แจ็คมันตอบคำถามของฉัน โปรดอ่านคำถามของฉันแล้วอ่านคำตอบ เห็นได้ชัดว่าคนอื่น ๆ กว่า 100 คนยอมรับว่าเป็นคำตอบที่ดี
TM.

4
เออ .. แต่ฉันอัลเฟรดและอีก 8 คนบอกคุณว่าการติดตามการวางเมาส์และการเลื่อนเมาส์ไม่ใช่วิธีที่ถูกต้อง คำตอบที่ถูกต้องควรเกี่ยวข้องกับการวิเคราะห์วัตถุเหตุการณ์ในตัวจัดการที่คุณเลือกหรือการวิเคราะห์เหตุการณ์ที่เกี่ยวข้องกับเมาส์ทั้งหมด (เช่นการเข้า / ออก) หากคุณต้องการการตรวจสอบตามเวลาแทนการตรวจสอบที่ขับเคลื่อนด้วยเหตุการณ์
แจ็ค

1
คำถามนี้ถูกถามและตอบเมื่อ 7+ ปีที่แล้ว ฉันไม่ได้รับการแจ้งเตือนเมื่อมีคำตอบใหม่ ๆ (แต่ฉันทำเพื่อแสดงความคิดเห็น) เขียนคำตอบที่ดีกว่าแล้วชุมชนจะโหวตให้เป็นอันดับต้น ๆ :) ข้อมูลจำนวนมากหายไปและสิ่งต่างๆก็เปลี่ยนไป
TM.

2
@TM. ขออภัยที่ไม่จำเป็น แต่ ... ไม่ข้อมูลนั้นจะไม่มีทางไปถึงจุดสูงสุด คนที่ไม่เห็นแก่ตัวเมื่อได้รับการยอมรับจะเกาะติดอยู่ที่จุดสูงสุดตลอดไป นอกจากนี้ "คนจำนวนมากโหวตให้คนนี้" ไม่ได้หมายความว่าคำตอบจะดี มันหมายความว่ามีคนจำนวนมากเห็นมันคิดว่ามันดูดีและกดโหวตเพราะดูเหมือนว่าจะได้ผลสำหรับพวกเขา
คดีของ Fund Monica

คำตอบ:


152

เกี่ยวกับโซลูชันของ Pax: จะไม่ทำงานหากผู้ใช้คลิกมากกว่าหนึ่งปุ่มโดยตั้งใจหรือไม่ตั้งใจ อย่าถามฉันว่าฉันรู้ได้อย่างไร :-(.

รหัสที่ถูกต้องควรเป็นเช่นนั้น:

var mouseDown = 0;
document.body.onmousedown = function() { 
  ++mouseDown;
}
document.body.onmouseup = function() {
  --mouseDown;
}

ด้วยการทดสอบดังนี้:

if(mouseDown){
  // crikey! isn't she a beauty?
}

หากคุณต้องการทราบว่าปุ่มใดถูกกดให้เตรียม mouseDown อาร์เรย์ของตัวนับและนับแยกต่างหากสำหรับปุ่มแยกกัน:

// let's pretend that a mouse doesn't have more than 9 buttons
var mouseDown = [0, 0, 0, 0, 0, 0, 0, 0, 0],
    mouseDownCount = 0;
document.body.onmousedown = function(evt) { 
  ++mouseDown[evt.button];
  ++mouseDownCount;
}
document.body.onmouseup = function(evt) {
  --mouseDown[evt.button];
  --mouseDownCount;
}

ตอนนี้คุณสามารถตรวจสอบว่าปุ่มใดถูกกดอย่างแน่นอน:

if(mouseDownCount){
  // alright, let's lift the little bugger up!
  for(var i = 0; i < mouseDown.length; ++i){
    if(mouseDown[i]){
      // we found it right there!
    }
  }
}

ตอนนี้ขอเตือนว่าโค้ดด้านบนจะใช้ได้เฉพาะกับเบราว์เซอร์ที่เข้ากันได้มาตรฐานที่ส่งหมายเลขปุ่มให้คุณโดยเริ่มจาก 0 ขึ้นไป IE ใช้มาสก์บิตของปุ่มที่กดในปัจจุบัน:

  • 0 สำหรับ "ไม่มีอะไรกด"
  • 1 สำหรับด้านซ้าย
  • 2 สำหรับขวา
  • 4 สำหรับกลาง
  • และชุดค่าผสมใด ๆ ข้างต้นเช่น 5 สำหรับซ้าย + กลาง

ดังนั้นปรับรหัสของคุณให้เหมาะสม! ฉันปล่อยให้เป็นแบบฝึกหัด

และอย่าลืมว่า IE ใช้วัตถุเหตุการณ์ส่วนกลางที่เรียกว่า ... "เหตุการณ์"

อนึ่ง IE มีคุณลักษณะที่เป็นประโยชน์ในกรณีของคุณ: เมื่อเบราว์เซอร์อื่นส่ง "ปุ่ม" เฉพาะสำหรับเหตุการณ์ปุ่มเมาส์ (onclick, onmousedown และ onmouseup) IE จะส่งด้วย onmousemove ด้วย ดังนั้นคุณสามารถเริ่มฟัง onmousemove เมื่อคุณต้องการทราบสถานะปุ่มและตรวจสอบปุ่ม evt. ทันทีที่คุณได้รับ - ตอนนี้คุณรู้แล้วว่าปุ่มเมาส์ใดถูกกด:

// for IE only!
document.body.onmousemove = function(){
  if(event.button){
    // aha! we caught a feisty little sheila!
  }
};

แน่นอนว่าคุณจะไม่ได้อะไรเลยถ้าเธอเล่นตายและไม่เคลื่อนไหว

ลิงค์ที่เกี่ยวข้อง:

อัปเดต # 1 : ฉันไม่รู้ว่าทำไมฉันถึงดำเนินการกับเอกสารรูปแบบของโค้ด จะดีกว่าถ้าแนบตัวจัดการเหตุการณ์เข้ากับเอกสารโดยตรง


1
หลังจากการทดสอบปรากฏว่า evt.button ไม่มีอยู่จริงบนเว็บมูฟด้วย IE7 ...
TM

5
ฉันคิดว่าสิ่งนี้จะใช้ไม่ได้ใน Chrome เนื่องจาก Chrome ไม่สร้างเหตุการณ์การวางเมาส์หากการเลื่อนลงเดิมเกิดขึ้นบนแถบเลื่อน ตัวอย่างจากปัญหา Chrome / โครเมี่ยมนี้ ดังนั้นปุ่มซ้ายของเมาส์จะลดลงตลอดไปหากมีแถบเลื่อนที่มีคนใช้! (ใน Chrome)
KajMagnus

1
ฉันชอบวิธีแก้ปัญหาของคุณ แต่จะเกิดอะไรขึ้นถ้าเมาส์มาจากแอปพลิเคชันอื่นให้พูดคำว่า ms และลากข้อความบางส่วน คุณจะตรวจสอบได้อย่างไรว่าเมาส์ไม่ทำงาน
Shadrack B.Orina

6
ฉันไม่เข้าใจว่าทำไมคุณถึงเพิ่มอาร์เรย์แบบเลื่อนลงในตัวอย่างที่สอง ทำไมตัวนับสำหรับแต่ละปุ่มแทนที่จะเป็นบูลสำหรับแต่ละปุ่ม?
amwinter

2
นี่เป็นคำถามยอดนิยม (และคำตอบ) ฉันแปลกใจที่ยังไม่เกิดขึ้น แต่คุณไม่จำเป็นต้องเก็บข้อมูลเมาส์เลย คุณสามารถเสียบevent.buttonsเข้ากับทริกเกอร์เหตุการณ์ที่คุณใช้โดยไม่ต้องใช้ตัวแปรที่บันทึกไว้ภายนอก ฉันถามคำถามใหม่เอี่ยม (เนื่องจากเหตุการณ์เมาส์อัพของฉันไม่ได้เกิดขึ้นเสมอไปดังนั้นวิธีนี้จึงไม่ได้ผลสำหรับฉัน) และได้รับคำตอบนั้นภายใน 5 นาที
RoboticRenaissance

36

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

อย่างไรก็ตามMouseEvent (ตอนนี้) จะระบุว่าปุ่มใดถูกผลักในขณะนี้:

  • สำหรับเบราว์เซอร์สมัยใหม่ทั้งหมด (ยกเว้น Safari) ให้ใช้ MouseEvent.buttons
  • สำหรับ Safari ให้ใช้MouseEvent.which( buttonsจะไม่ได้กำหนดไว้สำหรับ Safari) หมายเหตุ: whichใช้ตัวเลขที่แตกต่างกันbuttonsสำหรับคลิกขวาและกลาง

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

การใช้งานอย่างง่ายอาจมีลักษณะดังนี้:

var leftMouseButtonOnlyDown = false;

function setLeftButtonState(e) {
  leftMouseButtonOnlyDown = e.buttons === undefined 
    ? e.which === 1 
    : e.buttons === 1;
}

document.body.onmousedown = setLeftButtonState;
document.body.onmousemove = setLeftButtonState;
document.body.onmouseup = setLeftButtonState;

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


7
รหัสนี้จะตรวจสอบว่ามีการกดปุ่มหลักเท่านั้นและต้องการให้กดปุ่มอื่น ๆ ทั้งหมดหรือไม่ (เช่นถ้าทั้งประถมศึกษาและมัธยมศึกษาจะกดe.buttonsจะเป็น1+2=3ดังนั้นe.buttons === 1จะเป็นเท็จ) หากคุณต้องการตรวจสอบว่าปุ่มหลักหยุดทำงานหรือไม่ แต่ไม่สนใจสถานะปุ่มอื่น ๆ ให้ทำดังนี้(e.buttons & 1) === 1
AJ Richardson

ฉันมีสถานการณ์ที่ฉันคาดหวังว่าในระหว่างการย้ายมูสฉันควรได้รับรหัสปุ่มเป็น '1' แต่มันสร้าง '7' - งานทั้งหมดอยู่บน Chrome ใครมีความคิดบ้าง?
Vasily Hall

@VasilyHall ดูเอกสาร MDN สำหรับMouseEvent.buttonsดูเหมือนว่า7มันคิดว่าปุ่ม Primary, Secondary และ Auxilary ทั้งหมดถูกกดเข้าด้วยกัน ฉันไม่แน่ใจว่าทำไมถึงเป็นเช่นนั้น - คุณใช้เมาส์ขั้นสูงหรือไม่? ถ้าเป็นเช่นนั้นอาจคุ้มค่าที่จะลองใช้แบบพื้นฐาน หากคุณเพียงแค่ต้องการดำเนินการต่อคุณสามารถใช้การตรวจสอบแบบบิตเพื่อให้แน่ใจว่ากดปุ่มซ้ายและไม่สนใจสิ่งอื่นใด เช่น. MouseEvent.buttons & 1 === 1.
Jono Job

ขอบคุณฉันใช้ JavaScript ของฉันในเบราว์เซอร์พิเศษ: Chrome แบบฝัง (ium?) ภายในแอปพลิเคชัน Adobe Illustrator - ฉันพนันได้เลยว่าการรวมกันของสิ่งต่างๆทั้งหมดจะนำไปสู่ ​​7 แม้ว่าจะกดเพียงปุ่มเดียวก็ตาม . เมื่อเห็นว่าสิ่งนี้สอดคล้องกันอย่างไรในแอปพลิเคชันของฉันฉันเพียงแค่ทำการตรวจสอบ 1 หรือ 7 เพื่ออำนวยความสะดวกในการโต้ตอบของฉัน ฉันจะเพิ่มแม้ว่าฉันจะใช้เมาส์แทร็กบอล Logitech M570 (หรืออะไรก็ตาม) แต่มันก็ลงทะเบียน 1 ในเบราว์เซอร์ทั่วไปอย่างถูกต้อง แต่ 7 ตัวใน Illustrator
Vasily Hall

16

ฉันคิดว่าแนวทางที่ดีที่สุดคือการเก็บบันทึกสถานะปุ่มเมาส์ของคุณเองดังนี้:

var mouseDown = 0;
document.body.onmousedown = function() { 
    mouseDown = 1;
}
document.body.onmouseup = function() {
    mouseDown = 0;
}

จากนั้นในรหัสของคุณในภายหลัง:

if (mouseDown == 1) {
    // the mouse is down, do what you have to do.
}

+1 และขอบคุณ ฉันคิดว่าฉันอาจต้องใช้วิธีนี้ แต่ฉันหวังว่าจะมีคุณสมบัติบางอย่างที่ช่วยให้คุณตรวจสอบสถานะได้โดยตรง
TM.

12
มีเหตุผลที่ไม่ใช้บูลีนหรือไม่?
moala

1
@moala ฉันคิดว่า Int ดูเหมือนจะพิมพ์น้อยลงและในที่สุดก็มีประสิทธิภาพที่ดีขึ้นเล็กน้อย: jsperf.com/bool-vs-int
Johnathan Elmore

12

วิธีแก้ปัญหาไม่ดี เราสามารถ "ติดเมาส์" บนเอกสารจากนั้นจึง "วางเมาส์" นอกเบราว์เซอร์และในกรณีนี้เบราว์เซอร์จะยังคงคิดว่าเมาส์ไม่ทำงาน

ทางออกเดียวที่ดีคือการใช้วัตถุ IE.event


13
ฉันเห็นว่าคุณมาจากไหน แต่การมีโซลูชันที่ใช้ได้กับ IE ก็ไม่ใช่ทางออกที่ดีเช่นกัน
TM.

@alfred ในบางกรณีอาจช่วยให้ทราบได้ว่า mousemove อยู่นอกหน้าต่างหรือไม่ ถ้า (event.target.nodeName.toLowerCase === 'html') ลง = 0;
BF

6

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันคิดว่าการติดตามปุ่มเมาส์โดยใช้เมาส์ขึ้น / ลงรู้สึกอึดอัดเล็กน้อยดังนั้นฉันจึงพบทางเลือกที่อาจดึงดูดใจบางคน

<style>
    div.myDiv:active {
        cursor: default;
    }
</style>

<script>
    function handleMove( div ) {
        var style = getComputedStyle( div );
        if (style.getPropertyValue('cursor') == 'default')
        {
            // You're down and moving here!
        }
    }
</script>

<div class='myDiv' onmousemove='handleMove(this);'>Click and drag me!</div>

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

คุณสามารถใช้อะไรก็ได้ในออบเจ็กต์ที่ส่งคืนโดย getComputedStyle ที่คุณสามารถใช้เป็นแฟล็กโดยไม่ทำให้หน้าตาของเพจของคุณเสียไปเช่น border-color

ฉันต้องการตั้งค่ารูปแบบที่ผู้ใช้กำหนดเองในส่วน: active แต่ฉันไม่สามารถใช้งานได้ มันจะดีกว่าถ้าเป็นไปได้


ขอบคุณสำหรับการแบ่งปันสิ่งนี้ ฉันใช้แนวคิดนี้สำหรับตรรกะการจัดแต่งทรงผมแบบลาก n-drop แต่ประสบปัญหาใน IE และต้องรวมตรรกะเพิ่มเติม
Eyup Yusein

4

ตัวอย่างต่อไปนี้จะพยายามเรียกใช้ฟังก์ชัน "doStuff" 2 วินาทีหลังจากเหตุการณ์ mouseDown เกิดขึ้นใน document.body หากผู้ใช้ยกปุ่มขึ้นเหตุการณ์ mouseUp จะเกิดขึ้นและยกเลิกการดำเนินการที่ล่าช้า

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

function doStuff() {
  // does something when mouse is down in body for longer than 2 seconds
}

var mousedownTimeout;

document.body.onmousedown = function() { 
  mousedownTimeout = window.setTimeout(doStuff, 2000);
}

document.body.onmouseup = function() {
  window.clearTimeout(mousedownTimeout);
}

ขอบคุณ แต่นี่ไม่ใช่พฤติกรรมที่ฉันกำลังมองหา (แม้ว่าฉันจะเห็นว่าคำถามของฉันบ่งชี้ว่านี่คือสิ่งที่ฉันกำลังพยายามทำอยู่)
TM.

3

สั้นและหวาน

ฉันไม่แน่ใจว่าทำไมคำตอบก่อนหน้านี้ไม่ได้ผลสำหรับฉัน แต่ฉันคิดหาวิธีแก้ปัญหานี้ในช่วงเวลาที่ยูเรก้า ไม่เพียง แต่ใช้งานได้ แต่ยังหรูหราที่สุด:

เพิ่มในแท็กเนื้อหา:

onmouseup="down=0;" onmousedown="down=1;"

จากนั้นทดสอบและดำเนินการmyfunction()ถ้าdownเท่ากับ1:

onmousemove="if (down==1) myfunction();"

4
คุณเป็นคนใหม่ดังนั้นฉันจะช่วยคุณเล็กน้อยที่นี่ ก่อนอื่นให้คำนึงถึงไวยากรณ์ของคุณในโพสต์ของคุณ - ฉันอาจใช้เวลาแก้ไขมากกว่าที่คุณใส่ไว้ ประการที่สองโซลูชันของคุณเป็นเพียงเวอร์ชันอื่นที่ระบุไว้ข้างต้นซึ่งไม่มีอะไรใหม่ ประการที่สามวิธีแก้ปัญหาของคุณใช้เทคนิคที่เรียกว่า "การใช้แฟล็ก" ซึ่ง Thomas Hansen แนะนำไว้ข้างต้น โปรดตรวจสอบไวยากรณ์ของคุณและอย่าใช้วิธีแก้ปัญหาซ้ำเมื่อโพสต์ไปยังโพสต์เก่า ๆ โดยไม่ได้ให้คำอธิบายว่าเหตุใดโซลูชันอื่นจึงไม่เหมาะกับคุณ
Zachary Kniebel

5
อย่างไรก็ตามฉันโหวตวิธีแก้ปัญหาของคุณเนื่องจากมันถูกต้องและคุณยังใหม่กับ SO
Zachary Kniebel

3

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

นอกจากนี้คุณอาจต้องการตรวจสอบเพื่อให้แน่ใจว่าคุณกำลังจัดการโต้ตอบกับผู้ใช้จริงและไม่ได้เหตุการณ์ของเมาส์เช่นevent.whichelem.dispatchEvent(new Event('mousedown'))

var isMouseDown = false;

document.addEventListener('mousedown', function(event) { 
    if ( event.which ) isMouseDown = true;
}, true);

document.addEventListener('mouseup', function(event) { 
    if ( event.which ) isMouseDown = false;
}, true);

เพิ่มตัวจัดการในเอกสาร (หรือหน้าต่าง) แทน document.body มีความสำคัญ b / c เพื่อให้แน่ใจว่าเหตุการณ์การวางเมาส์นอกหน้าต่างยังคงถูกบันทึกไว้


2

คุณสามารถรวม @Pax และคำตอบของฉันเพื่อให้ได้ระยะเวลาที่เมาส์หยุดทำงาน:

var mousedownTimeout,
    mousedown = 0;

document.body.onmousedown = function() {
  mousedown = 0; 
  window.clearInterval(mousedownTimeout);
  mousedownTimeout = window.setInterval(function() { mousedown += 200 }, 200);
}

document.body.onmouseup = function() {
  mousedown = 0;
  window.clearInterval(mousedownTimeout);
}

หลังจากนั้น:

if (mousedown >= 2000) {
  // do something if the mousebutton has been down for at least 2 seconds
}

นั่นไม่ใช่ความคิดที่ไม่ดี Jake คุณต้อง clearInterval () ใน onmouseup () ก่อนตั้งค่า mousedown เป็น 0 หรือไม่ ฉันระวังฟังก์ชั่นจับเวลาที่เริ่มทำงานระหว่างการตั้งค่าเป็น 0 และหยุดตัวจับเวลาโดยปล่อยให้หมดเวลาที่ 200 หรือไม่ ในทำนองเดียวกันใน onmousedown
paxdiablo

ลำดับของ clearIntervals จะไม่สร้างความแตกต่างเนื่องจากเธรดการดำเนินการปัจจุบันจะเสร็จสิ้นก่อนที่เหตุการณ์ใด ๆ (รวมถึงตัวจับเวลา) จะเริ่มทำงาน
Nathaniel Reinhart


1

การใช้MouseEvent api เพื่อตรวจสอบปุ่มที่กดหากมี:

document.addEventListener('mousedown', (e) => console.log(e.buttons))

กลับ :

ตัวเลขแทนปุ่มอย่างน้อยหนึ่งปุ่ม สำหรับการกดปุ่มมากกว่าหนึ่งปุ่มพร้อมกันค่าต่างๆจะรวมกัน (เช่น 3 คือหลัก + รอง)

0 : No button or un-initialized
1 : Primary button (usually the left button)
2 : Secondary button (usually the right button)
4 : Auxilary button (usually the mouse wheel button or middle button)
8 : 4th button (typically the "Browser Back" button)
16 : 5th button (typically the "Browser Forward" button)

0

เมื่อใช้ jQuery วิธีแก้ปัญหาต่อไปนี้จะจัดการแม้กระทั่ง "ลากออกจากเพจแล้วปล่อยเคส"

$(document).mousedown(function(e) {
    mouseDown = true;
}).mouseup(function(e) {
    mouseDown = false;
}).mouseleave(function(e) {
    mouseDown = false;
});

ฉันไม่รู้ว่ามันจัดการกับปุ่มเมาส์หลายปุ่มอย่างไร หากมีวิธีเริ่มการคลิกนอกหน้าต่างให้นำเมาส์ไปที่หน้าต่างสิ่งนี้อาจทำงานไม่ถูกต้องเช่นกัน


0

ด้านล่างตัวอย่าง jQuery เมื่อเมาส์มีค่ามากกว่า $ (". element") สีจะเปลี่ยนไปตามปุ่มเมาส์ที่กด

var clicableArea = {
    init: function () {
        var self = this;
        ('.element').mouseover(function (e) {
            self.handlemouseClick(e, $(this));
        }).mousedown(function (e) {
            self.handlemouseClick(e, $(this));
        });
    },
    handlemouseClick: function (e, element) {
        if (e.buttons === 1) {//left button
            element.css('background', '#f00');
        }
        if (e.buttons === 2) { //right buttom
            element.css('background', 'none');
        }
    }
};
$(document).ready(function () {
    clicableArea.init();
});

0

ตามที่กล่าวไว้ @Jack เมื่อmouseupเกิดขึ้นนอกหน้าต่างเบราว์เซอร์เราจะไม่รู้ตัว ...

รหัสนี้ (เกือบ) ใช้ได้กับฉัน:

window.addEventListener('mouseup', mouseUpHandler, false);
window.addEventListener('mousedown', mouseDownHandler, false);

น่าเสียดายที่ฉันไม่ได้รับmouseupงานในกรณีใดกรณีหนึ่ง:

  • ผู้ใช้กดแป้นคีย์บอร์ดและปุ่มเมาส์พร้อมกันปล่อยปุ่มเมาส์นอกหน้าต่างเบราว์เซอร์จากนั้นปล่อยปุ่ม
  • ผู้ใช้กดปุ่มเมาส์สองปุ่มพร้อมกันปล่อยปุ่มเมาส์หนึ่งปุ่มจากนั้นอีกปุ่มหนึ่งทั้งสองข้างนอกหน้าต่างเบราว์เซอร์

-1
        var mousedown = 0;
        $(function(){
            document.onmousedown = function(e){
                mousedown = mousedown | getWindowStyleButton(e);
                e = e || window.event;
                console.log("Button: " + e.button + " Which: " + e.which + " MouseDown: " + mousedown);
            }

            document.onmouseup = function(e){
                mousedown = mousedown ^ getWindowStyleButton(e);
                e = e || window.event;
                console.log("Button: " + e.button + " Which: " + e.which + " MouseDown: " + mousedown);
            }

            document.oncontextmenu = function(e){
                // to suppress oncontextmenu because it blocks
                // a mouseup when two buttons are pressed and 
                // the right-mouse button is released before
                // the other button.
                return false;
            }
        });

        function getWindowStyleButton(e){
            var button = 0;
                if (e) {
                    if (e.button === 0) button = 1;
                    else if (e.button === 1) button = 4;
                    else if (e.button === 2) button = 2;  
                }else if (window.event){
                    button = window.event.button;
                }
            return button;
        }

เวอร์ชันข้ามเบราว์เซอร์นี้ใช้งานได้ดีสำหรับฉัน


-2

ไม่สามารถตรวจสอบได้ว่ามันลงหลังจากเหตุการณ์หรือไม่ แต่คุณสามารถตรวจสอบได้ว่ามันขึ้น ... ถ้ามันขึ้น .. แสดงว่าไม่ลงอีกต่อไป: P lol

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


2
onMouseUp ไม่มีเหตุการณ์ด้วยเหรอ? คุณจะตรวจสอบ "คุณสมบัติ" บนMouseupอย่างไร? หรือทรัพย์สินของใครมากกว่ากัน?
Rohit

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