2012-10-17 33 views
9

Khi bạn mở một hộp thoại phương thức bằng giao diện người dùng jQuery, bạn sẽ nhận thấy rằng nếu bạn sử dụng phím Tab, bạn có thể tập trung vào các nút của hộp thoại, nhưng bất kỳ đầu vào nào bên ngoài hộp thoại đều bị bỏ qua. Tôi đang cố gắng để đạt được hành vi tương tự này với jQuery UI Tools Overlay, nhưng tôi không chắc chắn cách jQuery UI đang làm điều đó. Nó dường như không được thiết lập chỉ mục tab của các yếu tố để -1, và bên cạnh đó, làm điều này sẽ rất tẻ nhạt vì nó sẽ liên quan đến việc tìm kiếm tất cả các yếu tố có thể tập trung mà không phải là một phần của hộp thoại. Điều này sẽ không tốt nếu bạn yêu cầu tự động hóa. Có cách nào để vô hiệu hóa tiêu điểm tất cả các phần tử của trang ngoại trừ một vài phần không?Hộp thoại Giao diện người dùng jQuery vô hiệu hóa tiêu điểm trên các đầu vào nền như thế nào?

Trả lời

9

Tiện ích hộp thoại thực sự xử lý sự kiện keypress và thực hiện chế độ xử lý khóa riêng của mình. Quá trình xử lý này bỏ qua các yếu tố tabbable bên ngoài hộp thoại.

Mã nguồn liên quan (dòng 286-305 trong current version at the time of this post) là:

// prevent tabbing out of modal dialogs 
if (options.modal) { 
    uiDialog.bind('keypress.ui-dialog', function(event) { 
     if (event.keyCode !== $.ui.keyCode.TAB) { 
      return; 
     } 

     var tabbables = $(':tabbable', this), 
      first = tabbables.filter(':first'), 
      last = tabbables.filter(':last'); 

     if (event.target === last[0] && !event.shiftKey) { 
      first.focus(1); 
      return false; 
     } else if (event.target === first[0] && event.shiftKey) { 
      last.focus(1); 
      return false; 
     } 
    }); 
} 

Lưu ý rằng bình luận TrueBlueAussie là chính xác, và rằng phiên bản của widget thoại sử dụng để liên kết với các trường hợp sai. keydown nên được sử dụng thay vì keypress:

uiDialog.bind('keydown.ui-dialog', function(event) { 
    // ... 
}); 
+0

Ah có, có vẻ hơi khó để mô phỏng, nhưng đây là những gì tôi đang tìm kiếm. Cảm ơn – JayPea

+1

Lưu ý rằng nếu đó là bản sao chép, hoặc nguồn bạn trích dẫn khác với câu trả lời của j08691 từ cùng một ngày, nhưng để thực hiện việc xử lý khóa tab này yêu cầu phải 'khóa phím', không phải 'nhấn phím'. 'nhấn phím 'quá muộn (hoặc không thể kích hoạt cho tab). –

+0

@TrueBlueAussie, chắc chắn đó không phải là một bản nháp (tôi đã theo dõi nguồn gốc [có] (https://github.com/jquery/jquery-ui/blob/1.8/ui/jquery.ui.dialog.js)), nhưng tôi có thể đã sao chép một lỗi, có :) Tôi sẽ sửa chữa liên kết và lỗi. –

4

Dưới đây là đoạn code để xử lý này:

// prevent tabbing out of modal dialogs 
this._on(uiDialog, { 
    keydown: function(event) { 
     if (!options.modal || event.keyCode !== $.ui.keyCode.TAB) { 
      return; 
     } 
     var tabbables = $(":tabbable", uiDialog), 
      first = tabbables.filter(":first"), 
      last = tabbables.filter(":last"); 
     if (event.target === last[0] && !event.shiftKey) { 
      first.focus(1); 
      return false; 
     } else if (event.target === first[0] && event.shiftKey) { 
      last.focus(1); 
      return false; 
     } 
    } 
});​ 

Dường như jQuery UI cho biết thêm một bộ lọc (:tabbable) để động cơ selector jQuery và khi hộp thoại đang hoạt động, nó chỉ cho phép các tab để chu kỳ giữa các elet tabbable của phương thức.

Mã từ: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.dialog.js

+0

Tính đến hôm nay, 'keydown' là chính xác. Câu trả lời của 'Frédéric Hamidi' sử dụng' nhấn phím 'và không kích hoạt cho khóa 'tab'. +1 –

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