Hangi HTML öğeleri odak alabilir?


248

Odaklanmasına izin verilen HTML öğelerinin kesin bir listesini arıyorum, yani bunlara focus()çağrıldığında hangi öğeler odaklanacaktır ?

Odaklanabilecek öğeler üzerinde çalışan bir jQuery uzantısı yazıyorum. Umarım bu sorunun cevabı hedeflediğim öğeler hakkında spesifik olmamı sağlayacaktır.

Yanıtlar:


337

Kesin bir liste yok, tarayıcıya bağlı. Sahip olduğumuz tek standart DOM Level 2focus() HTML'dir, buna göre yöntemi olan tek eleman HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement ve HTMLAnchorElement'dir. Bu, HTMLButtonElement ve HTMLAreaElement öğelerini özellikle atlar.

Bugünün tarayıcıları focus()HTMLElement üzerinde tanımlanıyor, ancak bir öğe aşağıdakilerden biri olmadıkça aslında odaklanmayacak:

  • Bir href ile HTMLAnchorElement / HTMLAreaElement
  • HTMLInputElement / HTMLSelectElement / HTMLTextAreaElement / HTMLButtonElement ile birlikte değil ancak disabled(IE denerseniz aslında size bir hata verir) ve dosya yüklemelerinin güvenlik nedeniyle olağandışı davranışları vardır
  • HTMLIFrameElement (odaklanmak yararlı bir şey yapmaz). Diğer gömme elemanları da, belki hepsini test etmedim.
  • Herhangi bir öğeye sahip tabindex

Tarayıcıya bağlı olarak bu davranışa başka ince istisnalar ve eklemeler olması muhtemeldir.


2
Bazı ilginç sonuçlar buldum: jsfiddle.net/B7gn6 bana "tabindex" özelliğinin en azından Chrome'da çalışmak için yeterli olmadığını gösteriyor ..
Jon z

19
Tabindex özelliğinin "yazarların bir öğenin odaklanıp odaklanmayacağını kontrol etmesine izin verdiğini" HTML5'te standartlaştırıldığını gösterir: w3.org/TR/html5/… Temelde 0 değeri, öğeyi odaklanabilir hale getirir, ancak siparişini tarayıcıya bırakır .
natevw

7
element.isContentEditable === trueİle tüm öğeler de odaklanabilir. IE -10'un (11+?) Herhangi bir öğeyi görüntüleme bloğu veya tablo (div, span vb.) İle odaklayabileceğini unutmayın.
mems

14
Tabindex değeri -1 olan bir öğe, odaklama yöntemiyle programlı olarak odak alabilir; sekmeye sekilemez.
jessebeach

5
… Tabindex -1 değilse, bu da odağı imkansız kılar >> doğru değil, tabindex -1 ise CLICKING ile odaklama mümkündür, ancak “sekme” tuşuna basarak odaklanmak mümkün değildir. -1 bir öğeyi odaklanabilir yapar, yalnızca sekme sırasına eklenmez. Bkz. Jsfiddle.net/0jz0kd1a , önce öğeyi tıklamayı deneyin, ardından tabindex'i 0 olarak değiştirin ve sekmeyi kullanmayı deneyin.
daremkd

37

Burada CSS-seçici dayalı olması bobince 'ın cevabı herhangi odaklanabilir HTML öğesi seçmek için:

  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 */
  }

ya da SASS'ta biraz daha güzel:

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 */
    }
}

Bunu bir cevap olarak ekledim, çünkü Google beni bu Stackoverflow sorusuna yönlendirdiğinde aradığım şey buydu.

EDIT: Odaklanabilen bir tane daha seçici var:

[contentEditable=true]

Ancak, bu çok nadiren kullanılır.


@TWiStErRob - Seçiciniz @ ReeCube seçicileriyle aynı öğeleri hedeflemez, çünkü sizinki açıkça ayarlanmış bir tabindex içermeyen öğeleri içermez. Örneğin <a href="foo.html">Bar</a>, kesinlikle odaklanabiliyor çünkü abir hrefniteliği olan bir element . Ancak seçiciniz içermiyor.
jbyrd

@jbyrd, bobince'nin ifadesine dayanarak sadece bir düzenleme çağrısı oldu: "… tabindex -1 değilse, bu da odaklanmayı imkansız kılar." düzenleme geçmişine bakın.
TWiStErRob

SASS (veya CSS), yukarıdaki soruya (tarayıcı tutarsızlıklarını engelleme) titiz bir yanıt vermek için uygun bir formdur.
Roy Tinker

tabindex="-1"yok değil bir eleman unfocusable yapmak, sadece sekme tarafından odaklanmış edilemez. Hala üzerine tıklayarak veya programlı olarak odak alabilir HTMLElement.focus(); diğer herhangi bir negatif sayı için aynıdır. Bakınız: developer.mozilla.org/tr-TR/docs/Web/HTML/Global_attributes/…
Lazzaro

Tabindex-1 içeren öğeleri hariç tutmazdım. Kullanıcılar herhangi bir giriş aygıtı üzerinden odaklanamayacaktır, ancak programlı olarak bu odağı ayarlayıp göstermek isteyebilirsiniz.
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üm odaklanabilir öğelerin bir SCSS listesini oluşturuyorum ve bunun bu sorunun Google sıralaması nedeniyle birisine yardımcı olabileceğini düşündüm.

Unutulmaması gereken birkaç nokta:

  • Değiştim :not([tabindex="-1"])için :not([tabindex^="-"])onu üretmek için mükemmel derecede mantıklı çünkü -2nasılsa. Üzgün ​​olmaktan daha güvenli.
  • :not([tabindex^="-"])Diğer tüm odaklanabilir seçicilere eklemek tamamen anlamsızdır. Kullanırken [tabindex]:not([tabindex^="-"])zaten reddettiğiniz tüm öğeleri içerir :not!
  • Dahil ettim :not([disabled])çünkü engelli öğeler asla odaklanamaz. Bu yüzden, yine her bir öğeye eklemek işe yaramaz.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.