Những yếu tố HTML nào có thể nhận được trọng tâm?


248

Tôi đang tìm kiếm một danh sách chính xác các yếu tố HTML được phép tập trung, tức là yếu tố nào sẽ được đặt vào trọng tâm khi focus()được gọi vào chúng?

Tôi đang viết một phần mở rộng jQuery hoạt động trên các phần tử có thể được tập trung. Tôi hy vọng câu trả lời cho câu hỏi này sẽ cho phép tôi được cụ thể về các yếu tố tôi nhắm mục tiêu.

Câu trả lời:


337

Không có một danh sách xác định, nó tùy thuộc vào trình duyệt. Tiêu chuẩn duy nhất chúng tôi có là HTML Cấp 2 DOM , theo đó các yếu tố duy nhất có focus()phương thức là HTMLInputEuity, HTMLSelectEuity, HTMLTextAreaEuity và HTMLAnchorEuity. Điều này đáng chú ý bỏ qua HTMLButtonEuity và HTMLAreaEuity.

Các trình duyệt ngày nay xác định focus()trên HTMLEuity, nhưng một yếu tố sẽ không thực sự tập trung trừ khi đó là một trong:

  • HTMLAnchorEuity / HTMLAreaE bổ sung với an href
  • HTMLInputEuity / HTMLSelectEuity / HTMLTextAreaEuity / HTMLButtonEuity nhưng không phải với disabled(IE thực sự gây ra lỗi cho bạn nếu bạn thử) và tải lên tệp có hành vi bất thường vì lý do bảo mật
  • HTMLIFrameE bổ sung (mặc dù tập trung nó không làm gì hữu ích). Các yếu tố nhúng khác cũng có thể, tôi đã không kiểm tra tất cả.
  • Bất kỳ yếu tố nào với một tabindex

Có thể có những ngoại lệ và bổ sung tinh tế khác cho hành vi này tùy thuộc vào trình duyệt.


2
Tôi đã tìm thấy một số kết quả thú vị: jsfiddle.net/B7gn6 gợi ý cho tôi rằng attrib "tabindex" không đủ để hoạt động trong Chrome ít nhất ..
Jon z

19
Thuộc tính tabindex "cho phép các tác giả kiểm soát xem một phần tử được cho là có thể lấy nét được" được tiêu chuẩn hóa trong HTML5: w3.org/TR/html5/. Về cơ bản, giá trị 0 làm cho phần tử có thể tập trung được nhưng để lại thứ tự cho trình duyệt .
natevw

7
Tất cả các yếu tố với có element.isContentEditable === truethể tập trung quá. Lưu ý rằng IE -10 (11+?) Có thể tập trung bất kỳ phần tử nào với khối hoặc bảng hiển thị (div, span, v.v.).
mems

14
Một phần tử có tabindex -1 có thể nhận được tiêu điểm theo chương trình thông qua phương pháp lấy nét; nó chỉ không thể được gắn thẻ.
jliebeach

5
Nếu không có tabindex là -1, điều này làm cho không thể lấy nét >> không đúng, nếu tabindex là -1, thì việc lấy nét bằng cách NHẤP là có thể, nhưng việc lấy nét bằng cách nhấn "tab" là không thể. -1 làm cho một phần tử có thể tập trung, chỉ là nó không được thêm vào theo thứ tự tab. Xem: jsfiddle.net/0jz0kd1a , trước tiên hãy thử nhấp vào phần tử, sau đó thay đổi tabindex thành 0 và thử sử dụng tab.
daremkd

37

Ở đây tôi có bộ chọn CSS dựa trên câu trả lời của bobince để chọn bất kỳ phần tử HTML có thể tập trung nào:

  a[href]:not([tabindex='-1']),
  area[href]:not([tabindex='-1']),
  input:not([disabled]):not([tabindex='-1']),
  select:not([disabled]):not([tabindex='-1']),
  textarea:not([disabled]):not([tabindex='-1']),
  button:not([disabled]):not([tabindex='-1']),
  iframe:not([tabindex='-1']),
  [tabindex]:not([tabindex='-1']),
  [contentEditable=true]:not([tabindex='-1'])
  {
      /* your CSS for focusable elements goes here */
  }

hoặc đẹp hơn một chút trong SASS:

a[href],
area[href],
input:not([disabled]),
select:not([disabled]),
textarea:not([disabled]),
button:not([disabled]),
iframe,
[tabindex],
[contentEditable=true]
{
    &:not([tabindex='-1'])
    {
        /* your SCSS for focusable elements goes here */
    }
}

Tôi đã thêm nó dưới dạng câu trả lời, bởi vì đó là, điều tôi đang tìm kiếm, khi Google chuyển hướng tôi đến câu hỏi Stackoverflow này.

EDIT: Có thêm một bộ chọn, có thể lấy nét:

[contentEditable=true]

Tuy nhiên, điều này được sử dụng rất hiếm khi.


@TWiStErRob - bộ chọn của bạn không nhắm mục tiêu các phần tử giống như bộ chọn của @ ReeCube, bởi vì bộ chọn của bạn không bao gồm các phần tử không được đặt rõ ràng. Ví dụ <a href="foo.html">Bar</a>chắc chắn có thể tập trung vì nó là một ayếu tố có hrefthuộc tính. Nhưng bộ chọn của bạn không bao gồm nó.
jbyrd

@jbyrd đó chỉ là một lời kêu gọi chỉnh sửa dựa trên tuyên bố của bobince: "trừ khi tabindex là -1, điều này khiến không thể tập trung.", nó không bao giờ được yêu cầu thay thế câu trả lời của ReeCube; xem lịch sử chỉnh sửa.
TWiStErRob

SASS (hoặc CSS) là một hình thức phù hợp để cung cấp một câu trả lời nghiêm ngặt cho câu hỏi trên (chặn sự không nhất quán của trình duyệt).
Roy Tinker

tabindex="-1"không không làm cho một yếu tố unfocusable, nó chỉ có thể không được tập trung bằng cách chạm. Nó vẫn có thể nhận được trọng tâm bằng cách nhấp vào nó hoặc lập trình với HTMLElement.focus(); tương tự cho bất kỳ số âm khác. Xem: developer.mozilla.org/en-US/docs/Web/HTML/Global_attribut/iêu
Lazzaro

Tôi sẽ không loại trừ các mục với tabindex-1. Người dùng sẽ không thể lấy nét thông qua bất kỳ thiết bị đầu vào nào, nhưng bạn có thể muốn thiết lập theo chương trình và hiển thị tiêu điểm đó.
James Westgate

7
$focusable:
  'a[href]',
  'area[href]',
  'button',
  'details',
  'input',
  'iframe',
  'select',
  'textarea',

  // these are actually case sensitive but i'm not listing out all the possible variants
  '[contentEditable=""]',
  '[contentEditable="true"]',
  '[contentEditable="TRUE"]',

  '[tabindex]:not([tabindex^="-"])',
  ':not([disabled])';

Tôi đang tạo một danh sách SCSS gồm tất cả các yếu tố có thể tập trung và tôi nghĩ rằng điều này có thể giúp ích cho ai đó do xếp hạng Google của câu hỏi này.

Một số điều cần lưu ý:

  • Tôi đã thay đổi :not([tabindex="-1"])đến :not([tabindex^="-"])bởi vì nó hoàn toàn đáng tin cậy để tạo ra -2bằng cách nào đó. An toàn tốt hơn xin lỗi phải không?
  • Thêm :not([tabindex^="-"])vào tất cả các bộ chọn tập trung khác là hoàn toàn vô nghĩa. Khi sử dụng [tabindex]:not([tabindex^="-"])nó đã bao gồm tất cả các yếu tố mà bạn đang phủ nhận :not!
  • Tôi bao gồm :not([disabled])bởi vì các yếu tố khuyết tật không bao giờ có thể được tập trung. Vì vậy, một lần nữa thật vô ích khi thêm nó vào từng yếu tố.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.