Về giải pháp của Pax: nó không hoạt động nếu người dùng nhấp nhiều hơn một nút cố ý hoặc vô tình. Đừng hỏi tôi làm sao tôi biết :-(.
Mã chính xác phải như thế:
var mouseDown = 0;
document.body.onmousedown = function() {
++mouseDown;
}
document.body.onmouseup = function() {
--mouseDown;
}
Với bài kiểm tra như thế này:
if(mouseDown){
// crikey! isn't she a beauty?
}
Nếu bạn muốn biết nút nào được nhấn, hãy chuẩn bị để tạo chuộtDown một mảng các bộ đếm và đếm riêng cho các nút riêng biệt:
// 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;
}
Bây giờ bạn có thể kiểm tra những nút nào được nhấn chính xác:
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!
}
}
}
Bây giờ được cảnh báo rằng mã ở trên sẽ chỉ hoạt động đối với các trình duyệt tuân thủ tiêu chuẩn cho bạn số nút bắt đầu từ 0 trở lên. IE sử dụng một mặt nạ bit của các nút hiện đang nhấn:
- 0 cho "không có gì được nhấn"
- 1 cho trái
- 2 cho đúng
- 4 cho giữa
- và bất kỳ kết hợp nào ở trên, ví dụ: 5 cho trái + giữa
Vì vậy, điều chỉnh mã của bạn cho phù hợp! Tôi để nó như một bài tập.
Và hãy nhớ rằng: IE sử dụng một đối tượng sự kiện toàn cầu có tên là "sự kiện".
Ngẫu nhiên IE có một tính năng hữu ích trong trường hợp của bạn: khi các trình duyệt khác chỉ gửi "nút" cho các sự kiện nút chuột (onclick, onmousedown và onmouseup), IE cũng gửi nó với onmousemove. Vì vậy, bạn có thể bắt đầu nghe onmousemove khi bạn cần biết trạng thái nút và kiểm tra evt.button ngay khi bạn nhận được nó - bây giờ bạn biết nút chuột nào được nhấn:
// for IE only!
document.body.onmousemove = function(){
if(event.button){
// aha! we caught a feisty little sheila!
}
};
Tất nhiên bạn chẳng nhận được gì nếu cô ấy chơi chết và không di chuyển.
Các liên kết có liên quan:
Cập nhật # 1 : Tôi không biết lý do tại sao tôi mang theo tài liệu. Kiểu mã của mọi người. Sẽ tốt hơn nếu đính kèm xử lý sự kiện trực tiếp vào tài liệu.