คุณจะล้างโฟกัสใน javascript ได้อย่างไร?


159

ฉันรู้ว่านี่ไม่ควรยากขนาดนั้น แต่ฉันไม่พบคำตอบใน Google

ฉันต้องการเรียกใช้งานจาวาสคริปต์ที่จะล้างการโฟกัสจากองค์ประกอบใด ๆ ที่เปิดอยู่โดยไม่ทราบล่วงหน้าว่าองค์ประกอบใดที่โฟกัสอยู่ มันต้องทำงานกับ Firefox 2 เช่นเดียวกับเบราว์เซอร์ที่ทันสมัยกว่า

มีวิธีที่ดีในการทำเช่นนี้?


การโฟกัสที่ชัดเจนหมายถึงอะไร? - มันเหมือนกับเบลอไหม
นักเลง

3
ฉันต้องการทำให้มันไม่มีองค์ประกอบในเบราว์เซอร์ที่มีโฟกัส
Andres

คำตอบ:


170

ตอบ: document.activeElement

ในการทำสิ่งที่คุณต้องการให้ใช้ document.activeElement.blur()

หากคุณต้องการรองรับ Firefox 2 คุณสามารถใช้สิ่งนี้:

function onElementFocused(e)
{
    if (e && e.target)
        document.activeElement = e.target == document ? null : e.target;
} 

if (document.addEventListener) 
    document.addEventListener("focus", onElementFocused, true);

8
หาก Firefox 2 มีส่วนแบ่งเบราว์เซอร์ 0.66% เป็นตัวจัดการข้อตกลง ... ฉันมีการแก้ไขซึ่งอยู่ในคำตอบที่แก้ไขแล้วของฉัน
jps

21
ในปี 2013 เบราว์เซอร์ส่วนแบ่งของ Firefox 2 นั้นน้อยกว่า 0.66% อย่างมากและวิธีง่าย ๆdocument.activeElement.blur()คือวิธีที่ดีที่สุดในการทำให้เกิดผลนี้
chowey

88

.focus()แล้ว.blur()อย่างอื่นในหน้าของคุณ เนื่องจากมีองค์ประกอบเดียวเท่านั้นที่สามารถโฟกัสได้จึงถูกโอนไปยังองค์ประกอบนั้นแล้วจึงลบออก


มีวิธีในการสร้างองค์ประกอบที่มองไม่เห็นที่มีโฟกัสหรือไม่?
Andres

1
ฉันไม่ใช่ผู้เชี่ยวชาญเกี่ยวกับวิธีที่ดีที่สุดในการทำเช่นนั้น แต่คุณสามารถวางตำแหน่งมันไว้นอกจอหรือนอกขอบเขตของoverflow: clipองค์ประกอบที่มีสไตล์ได้ แต่คุณสามารถใช้ฟิลด์ที่มีอยู่แล้วบนหน้า หรือสร้างเพียงเพื่อวัตถุประสงค์และลบออกอีกครั้ง
Kevin Reid

ฉันคิดว่าการตั้งค่าโฟกัสไปที่องค์ประกอบนอกหน้าจอจะบังคับให้เลื่อนไปยังองค์ประกอบนั้น อย่างไรก็ตามคุณสามารถสร้างองค์ประกอบที่มองไม่เห็นเพื่อวัตถุประสงค์ อย่างที่กล่าวไปแล้วเบราว์เซอร์บางตัวอาจมีปัญหาในการลบเครื่องหมายรูปหมวก แค่เบลอ () คงได้ผลดีกว่า คุณยังสามารถรับกุญแจด้วยตัวจัดการเหตุการณ์ keyup (keydown)
Alexis Wilke

5
คำตอบนี้ล้าสมัยและไม่มีผลบังคับใช้ในปี 2017 ใช้ activeElement แทนเช่นในstackoverflow.com/a/2520670/39808
Paul Fisher

มันยังใช้งานได้อีกต่อไปและขยับโฟกัส (ซึ่งอาจรบกวนการนำทาง TAB) นอกจากนี้ยังไม่ชัดเจนในทันทีว่า "สิ่งอื่นใดโดยพลการ" ควรเป็นอย่างไร
user202729

50
document.activeElement.blur();

ทำงานผิดพลาดบน IE9 - ทำให้เบราว์เซอร์ทั้งวินโดว์นั้นหากองค์ประกอบที่ใช้งานอยู่คือเนื้อหาของเอกสาร ดีกว่าที่จะตรวจสอบกรณีนี้:

if (document.activeElement != document.body) document.activeElement.blur();

เป็นเรื่องจริง แต่วันนี้แทบจะไม่มีใครใช้ IE9 อีกต่อไป
Donald Duck

18

ไม่มีคำตอบที่ให้ไว้ที่นี่อย่างสมบูรณ์เมื่อใช้ TypeScript เนื่องจากคุณอาจไม่ทราบประเภทขององค์ประกอบที่เลือก

สิ่งนี้จะเป็นที่ต้องการ:

if (document.activeElement instanceof HTMLElement)
    document.activeElement.blur();

ฉันจะไม่สนับสนุนการใช้โซลูชันที่ให้ไว้ในคำตอบที่ยอมรับเนื่องจากการทำให้เบลอที่เกิดขึ้นไม่ได้เป็นส่วนหนึ่งของข้อมูลจำเพาะอย่างเป็นทางการและอาจหยุดพักได้ทุกเมื่อ


6
มันสนุกที่ได้เห็นว่าคำถามที่ฉันถามกลับไปในปี 2010 ยังคงมีคำตอบที่ได้รับการพัฒนา
Andres


0

คุณสามารถเรียก window.focus ();

แต่การย้ายหรือการสูญเสียโฟกัสนั้นมีผลกระทบกับทุกคนที่ใช้ปุ่มแท็บเพื่อไปรอบ ๆ หน้า

คุณสามารถฟัง keycode 13 และนำมาใช้เอฟเฟกต์หากกดปุ่มแท็บ


-3

ด้วย jQuery เพียง: $(this).blur();


2
นี่เป็นคำตอบเก่า ๆ ดังนั้นคุณอาจจะรู้ได้ในตอนนี้ แต่มีสองเหตุผลที่คำตอบนี้ใช้ไม่ได้ 1. สมมติว่า OP ใช้ jquery 2. thisจำเป็นต้องเป็นองค์ประกอบที่มุ่งเน้นในขณะที่คำถามระบุอย่างชัดเจนว่า OP ไม่ทราบองค์ประกอบที่เน้นไว้ล่วงหน้า
Brandon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.