องค์ประกอบ HTML ใดที่สามารถรับโฟกัสได้


248

ฉันกำลังมองหารายการที่ชัดเจนขององค์ประกอบ HTML ที่ได้รับอนุญาตให้มุ่งเน้นคือองค์ประกอบใดบ้างที่จะถูกนำมาโฟกัสเมื่อfocus()ถูกเรียกใช้

ฉันกำลังเขียนส่วนขยาย jQuery ซึ่งทำงานกับองค์ประกอบที่สามารถโฟกัสได้ ฉันหวังว่าคำตอบสำหรับคำถามนี้จะช่วยให้ฉันมีความเฉพาะเจาะจงเกี่ยวกับองค์ประกอบที่ฉันกำหนดเป้าหมาย

คำตอบ:


337

ไม่มีรายการแน่นอนมันขึ้นอยู่กับเบราว์เซอร์ มาตรฐานเดียวที่เรามีคือHTML ระดับ 2 HTMLซึ่งเป็นองค์ประกอบเดียวที่มีfocus()วิธีการคือ HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement และ HTMLAnchorElement สิ่งนี้จะละเว้น HTMLButtonElement และ HTMLAreaElement โดยเฉพาะ

เบราว์เซอร์ของวันนี้กำหนดfocus()HTMLElement แต่องค์ประกอบจะไม่ให้ความสำคัญเว้นแต่จะเป็นหนึ่งใน:

  • HTMLAnchorElement / HTMLAreaElement พร้อม href
  • HTMLInputElement / HTMLSelectElement / HTMLTextAreaElement / HTMLButtonElement แต่ไม่ใช่disabled(IE ให้ข้อผิดพลาดกับคุณจริง ๆ ถ้าคุณลอง) และการอัปโหลดไฟล์มีพฤติกรรมที่ผิดปกติด้วยเหตุผลด้านความปลอดภัย
  • HTMLIFrameElement (แม้ว่าการโฟกัสจะไม่มีประโยชน์อะไรเลย) องค์ประกอบการฝังอื่น ๆ ด้วยบางทีฉันยังไม่ได้ทดสอบทั้งหมด
  • องค์ประกอบใด ๆ ที่มี tabindex

มีแนวโน้มว่าจะมีข้อยกเว้นและข้อมูลเพิ่มเติมอื่น ๆ เกี่ยวกับพฤติกรรมนี้ขึ้นอยู่กับเบราว์เซอร์


2
ผมพบว่าผลที่น่าสนใจ: jsfiddle.net/B7gn6แนะนำให้ฉันว่า "TabIndex" attrib ไม่เพียงพอที่จะทำงานใน Chrome อย่างน้อย ..
จอน Z

19
แอตทริบิวต์ tabindex "อนุญาตให้ผู้เขียนควบคุมว่าองค์ประกอบควรจะสามารถโฟกัสได้" ได้มาตรฐานใน HTML5: w3.org/TR/html5/โดยทั่วไปค่า 0 จะทำให้องค์ประกอบสามารถโฟกัสได้ .
natevw

7
องค์ประกอบทั้งหมดที่element.isContentEditable === trueสามารถโฟกัสได้เช่นกัน โปรดทราบว่า IE -10 (11+?) สามารถเน้นองค์ประกอบใด ๆ กับบล็อกการแสดงผลหรือตาราง (div, span, ฯลฯ )
mems

14
องค์ประกอบที่มี tabindex -1 อาจได้รับการโฟกัสโดยทางโปรแกรมโดยวิธีการโฟกัส; มันไม่สามารถแท็บได้
jessebeach

5
…เว้นแต่ว่า tabindex เป็น -1 ซึ่งทำให้ไม่สามารถโฟกัสได้ >> ไม่เป็นความจริงหาก tabindex เป็น -1 การโฟกัสด้วย CLICKING นั้นเป็นไปได้ แต่การโฟกัสด้วยการกด "tab" เป็นไปไม่ได้ -1 ทำให้องค์ประกอบสามารถโฟกัสได้ แต่จะไม่ถูกเพิ่มในลำดับการแท็บ ดู: jsfiddle.net/0jz0kd1aก่อนอื่นให้ลองคลิกที่องค์ประกอบจากนั้นเปลี่ยน tabindex เป็น 0 และลองใช้แท็บ
daremkd

37

ที่นี่ฉันมีตัวเลือก CSS ตามคำตอบของbobinceเพื่อเลือกองค์ประกอบ HTML ที่สามารถโฟกัสได้:

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

หรือสวยขึ้นเล็กน้อยใน 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 */
    }
}

ฉันได้เพิ่มเป็นคำตอบเพราะนั่นคือสิ่งที่ฉันกำลังมองหาเมื่อ Google เปลี่ยนเส้นทางฉันไปที่คำถาม Stackoverflow

แก้ไข:มีตัวเลือกอีกหนึ่งตัวเลือกซึ่งสามารถโฟกัสได้:

[contentEditable=true]

อย่างไรก็ตามนี่ใช้น้อยมาก


@TWiStErRob - ตัวเลือกของคุณไม่ได้กำหนดเป้าหมายองค์ประกอบเดียวกับตัวเลือกของ @ ReeCube เนื่องจากคุณไม่ได้รวมองค์ประกอบที่ไม่มีการตั้งค่า Tabindex ไว้อย่างชัดเจน ตัวอย่างเช่น<a href="foo.html">Bar</a>สามารถโฟกัสได้อย่างแน่นอนเพราะเป็นaองค์ประกอบที่มีhrefแอตทริบิวต์ แต่ตัวเลือกของคุณไม่ได้รวมไว้
jbyrd

@ jbyrd ที่เป็นเพียงการเรียกร้องให้แก้ไขตามแถลงการณ์ของ bobince: "... เว้นแต่ว่า tabindex เป็น -1 ซึ่งทำให้ไม่สามารถโฟกัสได้" มันไม่ควรจะแทนที่คำตอบของ ReeCube ดูประวัติการแก้ไข
TWiStErRob

SASS (หรือ CSS) เป็นรูปแบบที่เหมาะสมในการให้คำตอบที่เข้มงวดกับคำถามข้างต้น (ยกเว้นความไม่สอดคล้องของเบราว์เซอร์)
Roy Tinker

tabindex="-1"ไม่ได้ทำให้องค์ประกอบ unfocusable ก็แค่ไม่สามารถโดยเน้นการแท็บ มันยังอาจได้รับโฟกัสโดยคลิกที่มันหรือโดยทางโปรแกรมด้วยHTMLElement.focus(); เหมือนกันสำหรับจำนวนลบอื่น ๆ ดูที่: developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/…
Lazzaro

ฉันจะไม่แยกรายการด้วย tabindex-1 ผู้ใช้จะไม่สามารถโฟกัสผ่านอุปกรณ์อินพุตใด ๆ แต่คุณอาจต้องการตั้งค่าโดยทางโปรแกรมและแสดงโฟกัสนั้น
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])';

ฉันกำลังสร้างรายการ SCSS ขององค์ประกอบที่สามารถโฟกัสได้ทั้งหมดและฉันคิดว่าสิ่งนี้อาจช่วยคนได้เนื่องจากอันดับ Google ของคำถามนี้

สิ่งที่ควรทราบ:

  • ฉันเปลี่ยน:not([tabindex="-1"])เป็น:not([tabindex^="-"])เพราะมันเป็นไปได้อย่างสมบูรณ์ที่จะสร้าง-2อย่างใด ปลอดภัยกว่าดีกว่าขออภัยใช่ไหม
  • การเพิ่ม:not([tabindex^="-"])ตัวเลือกที่โฟกัสได้อื่นทั้งหมดนั้นไม่มีจุดหมายอย่างสมบูรณ์ เมื่อใช้[tabindex]:not([tabindex^="-"])แล้วจะมีองค์ประกอบทั้งหมดที่คุณจะปฏิเสธ:not !
  • ฉันรวมไว้:not([disabled])เพราะองค์ประกอบที่ปิดใช้งานไม่สามารถโฟกัสได้ ดังนั้นมันไม่มีประโยชน์อะไรที่จะเพิ่มเข้าไปในทุก ๆ องค์ประกอบ


1

บางทีนี่อาจช่วยได้:

function focus(el){
	el.focus();
	return el==document.activeElement;
}

ส่งคืนค่า: true = success, false = ล้มเหลว

Reff: https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus


-2

กระบวนการ: ตัวเลือกโฟกัสได้รับอนุญาตในองค์ประกอบที่ยอมรับเหตุการณ์แป้นพิมพ์หรืออินพุตของผู้ใช้อื่น

http://www.w3schools.com/cssref/sel_focus.asp


6
": โฟกัส" หมายถึงองค์ประกอบที่มุ่งเน้นอยู่ในปัจจุบันไม่ใช่ว่าจะสามารถโฟกัสได้
jwebb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.