2016-02-29 13 views
14

tôi có mã này:Sử dụng Jquery, tại sao chức năng này được gọi khi tôi chỉ bấm vào một trong hai phím?

$(document).bind('keydown', 'ctrl+1', function() { 
    alert('You found the hotkey ctrl+1!'); 
}); 

nhưng nếu tôi bấm vào kiểm soát hoặc 1 chìa khóa, mã này có vẻ để bắn. Tôi chỉ muốn mã này kích hoạt khi các phím BOTH được nhấn.

Có ai có thể làm rõ những gì tôi bị thiếu không?

+4

Bạn đang sử dụng một số loại plugin cho điều đó? Ràng buộc là '.bind (eventType [, eventData], handler)' không có bộ lọc nào cho các phím được nhấn. – epascarello

+0

Còn các phím còn lại trong bàn phím của bạn thì sao? Chúng không kích hoạt cảnh báo của bạn()? –

+0

@epascarello Dường như họ đang sử dụng (hoặc nghĩ rằng họ đang sử dụng) plugin jQuery Hotkeys https://github.com/jeresig/jquery.hotkeys/blob/master/README.md –

Trả lời

18

Như bạn có thể nhìn thấy trong documentation, đối số thứ hai đến bind chức năng là eventData, đó là

Một đối tượng chứa dữ liệu đó sẽ được thông qua để xử lý sự kiện.

Điều này được sử dụng để truy cập các biến từ bên ngoài hàm bên trong mà bạn dùng làm trình xử lý, để tránh sự cố khi truy cập các biến có thể thay đổi được.

Nếu bạn muốn lọc các phím kích hoạt hành động chỉ xử lý nó bên trong chức năng.

$(document).bind("keydown", function(ev){ // notice the function argument 
    if(ev.ctrlKey && ev.keyCode == 49){ // 49 being the keyCode for "1" 
     alert("Foo!"); 
    } 
}); 
+0

Điều này cũng sẽ không xử lý Ctrl + Alt + 1, cũng như Ctrl + Shift + 1? –

+0

@RolandIllig có, nó sẽ được kích hoạt vì nó chỉ kiểm tra nếu Ctrl && 1 được nhấn.Miễn là tổ hợp phím không nhận được * nhặt * bởi một lớp cao hơn mà sẽ ngăn chặn nó nhận được mã của bạn nó sẽ được kích hoạt. Ví dụ: nếu chúng tôi mong chờ Ctrl + L và bạn nhấn Ctrl + Alt + L thì sự kết hợp sẽ được Windows xử lý trước tiên như một hành động khóa và sẽ không được chuyển sang trình duyệt nếu tôi không nhầm. Tôi chắc rằng bạn nhận được quan điểm của tôi ở đây. Điều tương tự có thể xảy ra ở cấp JS khi một hành động đơn giản ngăn cản sự kiện đang được xử lý bởi một trình xử lý khác - ev.stopPropagation() – Dropout

2

Trực tiếp sử dụng sự kiện jquery thay vì liên kết. Sử dụng thuộc tính ctrlKey của đối tượng sự kiện để biết liệu ctrl có được nhấn hay không.

$(document).keydown("1",function(e){ 
    if(e.ctrlKey) 
      alert("Ctrl+1 pressed"); 
}); 

Không kiểm tra, nhưng tôi đoán nó sẽ hoạt động.

2

Bạn có thể sử dụng chức năng keydown của jQuery trực tiếp và kiểm tra các phím được nhấn.

$('body').keydown(function (e){ 
    if (e.ctrlKey && e.keyCode == 49) 
    alert("Ctrl+1 pressed"); 
}); 
1

Sử dụng Jquery hotKeys. Nó sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều. Bạn sẽ có thể làm điều gì đó như:

$(document).bind('keydown', 'ctrl+1', function() { 
    alert('You found the hotkey ctrl+1!'); 
}); 

thư viện khác là Mouse trap, nó cho phép bạn làm những việc như:

Mousetrap.bind('command+shift+k', function(e) { 
    highlight([6, 7, 8, 9]); 
    return false; 
}); 
-2

Chức năng này sẽ được gọi trên mỗi phím bấm, nhưng tôi đã kiểm tra cho mã khóa trong một điều kiện. chúng tôi có thể thực hiện chức năng được yêu cầu trong "nếu điều kiện". Điều kiện sẽ chỉ thực thi khi nhấn phím ctrl và 1.

$(document).on('keydown', 'body', function(event) { 

    if (event.ctrlKey && event.keyCode == 49) { 

     alert("Ctrl+1 pressed"); 
    } 

}); 
+0

Không giải thích? – Heberda

2

Bạn cần phải kiểm tra cho KeyDown sự kiện cũng như nếu ctrl chính là ép

$(document).keydown('1',function(e) { 
     if (e.ctrlKey) { 
      alert('ctrl 1 was pressed.'); 
     } 
    }); 

Chỉ cần làm rõ về câu hỏi của bạn, bạn bỏ lỡ kiểm tra sự kiện ctrl.

3
document.body.addEventListener('keypress', function (event) { 
    var key = event.which || event.keyCode; 
    if(key.ctrlKey && key == 49){ 
     alert("Ctrl+1 pressed); 
    } 
} 

Điều này sẽ hữu ích. Bạn thêm Trình xử lý sự kiện vào phần Thân của mã HTML và nghe phím nào đã được nhấn.

$(document).ready(function() { 
 
    document.body.addEventListener('keypress', function (event) { 
 
    var key = event.which || event.keyCode; 
 
    if (key.ctrlKey || key == 49) { 
 
     alert("Ctrl+1 pressed"); 
 
    } 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
</head> 
 
<body> 
 
<p>empty page</p> 
 
</body> 
 
</html>

3

Đầu tiên xin lỗi vì anh nghèo của tôi, từ khóa "+" trở thành một selector css, không phải là một người biết lắng nghe sự kiện bàn phím. (keydown, keypress, keyup)

Trong ngữ cảnh này bạn không cần bộ chọn css để phát hiện khóa, ma thuật này tương ứng với một sự kiện, vì lý do này có chức năng nhận sự kiện ... function (event) hoặc chức năng (e), thông số đó chứa mọi thứ bạn cần.

Bây giờ sự kiện indetifies phím bằng tài sản "mà" hoặc tài sản "keyCode", đây là một loại phức tạp, bởi vì Mà và keycode, phụ thuộc của sự hỗ trợ trình duyệt

Còn bây giờ có lẽ phải kiểm tra sự kiện keydown trong trang jquery, quan sát dòng 41, và kết quả khi bạn nhấn một phím, đặc biệt là mã khóa và các thuộc tính đó.

Cuối cùng mục tiêu là phát hiện khóa ctrl đồng thời với một khóa khác, điều quan trọng là khóa đặc biệt và số đó phải được thay thế bằng ctrlKey và đánh giá số đó bằng thuộc tính hoặc mã khóa.

Jquery liên kết đến KeyDown và gương sáng mà làm cho bạn biết những gì phím số (mà hay keycode) bạn đang nhấn là here

Mã của bạn cuối cùng như thế này

 $(document).bind('keydown', function (e) { 
     if((e.crtlKey && (e.which==49)) || (e.crtlKey && (e.which==97)) ){ 
       alert('You found the hotkey ctrl+1!'); 
     } 
    }); 

Số 49 trong các mã tương ứng tại số = "1" trong phần bàn phím chữ cái.

Số 97 tương ứng với số = "1" trong phần bàn phím số

0

Bạn đang làm sai. Sự kiện ngừng hoạt động chính vào lúc bạn nhấn một phím và nó không quan tâm nếu bạn đang nhấn một phím khác. Vui lòng sử dụng sự kiện keyup.

$(document).bind('keyup', 'ctrl+1', function() { 
 
     alert('You found the hotkey ctrl+1!'); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

0

Hãy thử điều này:

$(document).keypress("1",function(e) { 
 
    if(e.ctrlKey) 
 
    alert("You found the hotkey ctrl+1!"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 
 
<p>Press CTRL+1 to show alert.</p>

Thông tin thêm here.

Các vấn đề liên quan