2011-05-23 6 views
5

Tôi có mã jQuery tạo một mảng các phần tử có thể đặt tiêu điểm và liên kết .keydown cho các mũi tên trái và phải để duyệt qua chúng. Trong Chrome, IE và Safari bắt đầu với preventDefault() hoặc kết thúc bằng một sai lầm trở lại (mà về mặt kỹ thuật tôi không muốn sử dụng vì tôi không có nhu cầu stopPropagation()) ngăn chặn các sự kiện mặc định của các mũi tên, nhưng trong Firefox nó không.Ngăn sự kiện mặc định cho khóa phím jQuery trong Firefox

Làm thế nào tôi có thể ngăn chặn hành động mặc định trong Firefox không?

Đây là mã, hoạt động như mong đợi, ngoại trừ trong Firefox, nơi sự kiện mặc định kích hoạt ngoài cuộc gọi lại của tôi.

$(function() { 
    var focusables = $(":focusable"); 
    focusables.eq(0).focus(); 
    focusables.eq(0).select(); 
    focusables.each(function() { 
     $(this).keydown(function (e) { 
      if (e.which == '37') { // left-arrow 
       e.preventDefault(); 
       var current = focusables.index(this), 
        next = focusables.eq(current - 1).length ? focusables.eq(current - 1) : focusables.eq(0); 
       next.focus(); 
       next.select(); 
      } 
      if (e.which == '39') { // right-arrow 
       e.preventDefault(); 
       var current = focusables.index(this), 
        next = focusables.eq(current + 1).length ? focusables.eq(current + 1) : focusables.eq(0); 
       next.focus(); 
       next.select(); 
      } 
     }); 
    }); 
}); 

Trả lời

7

Sự kiện nhấn phím là sự kiện cần hủy, nhưng Firefox bỏ qua preventDefault() trong trường hợp này. Vì vậy, giải pháp là làm mờ thả xuống hiện nay, để cho các sự kiện cháy bấm phím trên các tài liệu và thiết lập focus cho thả xuống mới qua thời gian chờ.

var focusables = $(":focusable"); 
focusables.eq(0).focus().select(); 
focusables.each(function() { 
    $(this).keydown(function (e) { 
     if (e.which == '37') { // left-arrow 
      e.preventDefault(); 
      var current = focusables.index(this), 
       next = focusables.eq(current - 1).length ? focusables.eq(current - 1) : focusables.eq(0); 
      this.blur(); 
      setTimeout(function() { next.focus().select(); }, 50); 
     } 
     if (e.which == '39') { // right-arrow 
      e.preventDefault(); 
      var current = focusables.index(this), 
       next = focusables.eq(current + 1).length ? focusables.eq(current + 1) : focusables.eq(0); 
      this.blur(); 
      setTimeout(function() { next.focus().select(); }, 50); 
     } 
    }); 
}); 

Demo tại http://jsfiddle.net/roberkules/3vA53/

+0

này không làm việc cho tôi. Có lẽ vì lý do đó này đang làm việc cho mã của bạn là bởi vì bạn là sử dụng các hộp văn bản đầu vào, trong khi đó tôi chủ yếu hướng hộp thả xuống. Khi tôi tìm đến tiếp theo hộp thả xuống, giá trị của những thay đổi danh sách mới tập trung-on với giá trị tiếp theo. – Brandon

+0

tôi nhìn thấy, một khi jsfiddle đã trở lại trực tuyến, tôi sẽ có một cái nhìn. – roberkules

+0

tôi đã thêm mã của tôi trong OP. – Brandon

0

Bạn đã thử cái này chưa?

$(selector).click(function(event) { 
    event.preventDefault(); 
}); 
+2

Vâng, nó không hoạt động cho Firefox. :( – Brandon

+0

@Brandon [xem này] (http://stackoverflow.com/a/31206759/1185136) để hỗ trợ Firefox. –