2013-05-22 31 views
5

Tôi đang tạo thứ gì đó có phím tắt, ví dụ: bạn nhấn Ctrl + m để mở menu. Tôi sử dụng jQuery và plugin jwerty cho điều đó, điều này trông giống như mã sau:Kiểm tra xem có đầu vào nào có tiêu điểm

jwerty.key('m', function() { 
    toggleMenu(); 
}); 

Khai thác phím "m" sẽ kích hoạt chức năng toggleMenu.

Bây giờ tôi đã tự hỏi làm thế nào để ngăn chặn chức năng này được kích hoạt trong khi người dùng đang gõ vào một lĩnh vực đầu vào hoặc textarea.

+0

Tôi thấy điều này trong [tài liệu] (https: // github. com/keithamus/jwerty) trong Git. _Nếu bạn đang ràng buộc với một bộ chọn và không cần bối cảnh, bạn có thể ommit nó: 'jwerty.key ('⌃ + ⇧ + P/⌘ + ⇧ + P', function() {[...] }, 'input.email', '#myForm'); '_ Hãy thử và cho chúng tôi biết. –

+0

chức năng toggleMenu() {alert ('ok');} jwerty.key ('m', toggleMenu, "body: not (input)"); điều này sẽ làm việc nhưng không phải vì nó cháy ngay cả trong đầu vào – dt192

Trả lời

5

Tôi chưa bao giờ sử dụng jwerty, nhưng tôi muốn đề nghị:

jwerty.key('m', function (e) { 
    if (e.target.tagName.toLowerCase() !== 'input') { 
     toggleMenu(); 
    } 
}); 

này kiểm tra các mục tiêu của sự kiện này, và nếu đó là không một input, gọi toggleMenu() chức năng; nếu nó an input, nó không có gì (mặc dù bạn rõ ràng có thể return false nếu bạn muốn).

Để giải thích cho textarea, như tôi thực sự cần phải làm, bên trên có thể được mở rộng (thêm một khoản để đánh giá if, hoặc những điều sau đây, switch cách tiếp cận dựa trên có thể được thực hiện:

jwerty.key('m', function (e) { 
    switch (e.target.tagName.toLowerCase()) { 
     case 'input': 
     case 'textarea': 
      break; 
     default: 
      toggleMenu(); 
      break; 
    } 
}); 

Nếu phần tử mục tiêu là một trong hai một input hoặc textarea, nhấn m không có gì, trong khi đó nếu không một trong hai yếu tố trạng thái mặc định đã được nhập và toggleMenu() được gọi.

+0

Đừng quên về 'textarea' – Prinzhorn

+0

@Prinzhorn: bạn có một điểm tốt. * Cập nhật. * –

+1

Tôi cũng tính chọn trong mã mới của tôi dựa trên điều này vì bạn có thể sử dụng 'm' để chuyển đến mục bắt đầu bằng 'm', ví dụ: 'monaco'. Cảm ơn! – Wolfr

0

Một cách sẽ là thêm một trình xử lý sự kiện khác vào các đầu vào và văn bản của bạn gọi event.stopPropagation() (hoặc nếu bạn sử dụng jQuery, return false). Bằng cách đó, trình xử lý sự kiện sẽ được kích hoạt trước tiên, và nó sẽ ngăn chặn sự kiện "lan truyền" tới trình xử lý hiện có của bạn.

Một tùy chọn khác là kiểm tra sự kiện bên trong trình xử lý hiện có của bạn để xem sự kiện có xuất phát từ đầu vào/văn bản hay không (xem các câu trả lời khác nếu bạn muốn thực hiện phương pháp này; bạn sẽ muốn sử dụng câu trả lời của David, vì activeElement không được các trình duyệt cũ hỗ trợ: Which browsers support document.activeElement?).

+0

Cũ hơn IE4? [mdn] (https://developer.mozilla.org/en-US/docs/Web/API/document.activeElement) – Andreas

+0

Tôi đã chỉnh sửa câu trả lời của mình để thay đổi "cũ" thành "thực sự" cũ :-) – machineghost

0

Bạn có thể sử dụng :focus chọn được cung cấp bởi jQuery (và một số trình duyệt) và is chức năng để kiểm tra nếu một mục có tập trung:

$(".my-thing").is(':focus') 
+0

Điều này ngược lại, tôi muốn kiểm tra xem không có gì ở tiêu điểm – Wolfr

+0

$ (": focus"). length == 0 – Crisfole

+0

Hơi tắt chủ đề, nhưng điều này dường như không hoạt động trong PhantomJS – Mansiemans

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