$ .focus () ไม่ทำงาน


155

ตัวอย่างสุดท้ายของของ jQuery focus()เอกสารรัฐ

$('#id').focus()

ควรทำให้อินพุตถูกโฟกัส (แอ็คทีฟ) ฉันไม่สามารถทำงานนี้ได้

แม้ในคอนโซลของไซต์นี้ฉันก็ลองใช้มันสำหรับช่องค้นหา

$('input[name="q"]').focus()

และฉันก็ไม่ได้อะไรเลย ความคิดใด ๆ


2
คุณช่วยแสดงรหัสของคุณให้เราดูได้ไหม
Adil

เราจะต้องรู้มากกว่านี้เพราะมันใช้งานได้ดีสำหรับฉัน: jsfiddle.net/G7hwR/1เพียงคลิกที่ใดก็ได้ในแผงด้านขวาและมุ่งเน้น ...
Rob G

ควรให้ความสำคัญกับหน้านี้หรือไม่ ตัวอย่างที่ฉันให้ไว้
Sam Selikoff

ขึ้นอยู่กับสิ่งที่บรรจุอยู่ ถ้ามันไม่ได้อยู่ในสิ่งใดมันก็น่าจะถูกเรียกใช้ก่อนที่หน้าจะแสดงผล ...
Rob G

สำหรับผู้ที่มาที่นี่จากการค้นหา: เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของเบราว์เซอร์ในตัวอาจรบกวนการทำงานของfocus()funcionality ข้อมูลเพิ่มเติม
aexl

คำตอบ:


392

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

setTimeout(function() { $('input[name="q"]').focus() }, 3000);

สำหรับอีกคนหนึ่งสิ่งหนึ่งที่ทำให้ฉันมีปัญหาในอดีตคือลำดับเหตุการณ์ คุณไม่สามารถเรียกโฟกัส () บนองค์ประกอบที่ไม่ได้แนบกับ DOM องค์ประกอบที่คุณพยายามจะโฟกัสนั้นถูกแนบไปกับ DOM แล้วหรือยัง?


1
ที่ดี! สิ่งนั้นช่วยคุณได้ทั้งสองปัญหาหรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องได้หรือไม่? ฉันจะขอบคุณมันมาก: D
Justin Warkentin

4
อย่าใช้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์เมื่อใช้เพียง $ ('input [name = "q"]'). focus (); or not work
Amitābha

12
ว้าวฉันกำลังดิ้นรนกับสิ่งนี้เป็นเวลาหลายเดือนฉันเพิ่งเห็นว่ามันเกิดจากการเปิดคอนโซลนักพัฒนาซอฟต์แวร์ ของฉันอยู่เสมอ ขอบคุณ!
Alex Turpin

20
+1 สำหรับ "คุณไม่สามารถเรียกโฟกัส () บนองค์ประกอบที่ไม่ได้แนบกับ DOM" นอกจากนี้ดูเหมือนว่าคุณไม่สามารถเรียกมันว่าองค์ประกอบที่ซ่อนอยู่
tandrewnichols

1
การใช้setTimeoutเพื่อแก้ไขปัญหาของการปฏิบัติงานทำให้เป็นปัญหาใหญ่ในการรักษา หากมีข้อบกพร่องปรากฏขึ้นมันเป็นเรื่องยากที่จะแก้ปัญหา เมื่อใดก็ตามที่คุณแทรกองค์ประกอบลงใน DOM ก็ควรเรียกที่.focus()นั่น
Kevin Beal

55

พบวิธีแก้ปัญหาที่อื่นบนเน็ต ...

$('#id').focus();

ไม่ทำงาน.

$('#id').get(0).focus();

ทำงานได้ดี


4
ฉันยกระดับโซลูชันนี้เพียงเพราะใช้งานได้สำหรับฉันเมื่อโซลูชันที่เป็นที่นิยมในหน้านี้ไม่ทำงาน ;-)
chriv

ตัวเลือกที่สองดูเหมือนว่าจะคว้าองค์ประกอบ dom และใช้รุ่นจาวาสคริปต์ปกติแทนรุ่น jquery
danielson317

7
เป็นไปได้ไหมว่าคุณมีองค์ประกอบหลายอย่างพร้อมด้วยรหัส "id" ในหน้าเว็บของคุณ? DOM จะไม่แตกในกรณีนี้ แต่คุณไม่สามารถกำหนดโฟกัสไปที่องค์ประกอบหลายรายการได้เช่นกัน
DerpyNerd

ฉันพบว่าฉันต้องทำสิ่งนี้กับ window.setTimeout โดยมีความล่าช้าเป็น 0 แล้วทั้งหมดก็ดี ขอบคุณ ทุกอย่างอื่นที่ฉันพยายามล้มเหลวใน modal bootstrap
ลุย Hatler

23

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

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

$('#elementid').animate({left:0,duration:'slow'});
$('#elementid').focus();

สิ่งนี้ไม่ได้ผล ฉันรู้เพียงสิ่งที่เกิดขึ้นเมื่อผมดำเนินการ $ ( '# elementid'). โฟกัส () `จากคอนโซลที่ไม่ได้ทำงาน ความแตกต่าง - ในรหัสของฉันสูงกว่าเป้าหมายไม่มีความมั่นใจว่าเป้าหมายจะ Infact สามารถมองเห็นได้ตั้งแต่การเคลื่อนไหวอาจจะไม่สมบูรณ์ และมีร่องรอยอยู่

$('#elementid').animate({left:0,duration:'slow',complete:focusFunction});

function focusFunction(){$('#elementid').focus();}

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


คำแนะนำที่เกี่ยวข้องสำหรับฉันคือ "ทำให้แน่ใจว่าสามารถมองเห็นเป้าหมายได้จริง" สิ่งนี้จะเกี่ยวข้องเมื่อพยายามเน้นองค์ประกอบที่แสดงผลแบบมีเงื่อนไข
charlie carver

หรือเมื่อองค์ประกอบที่จะทำการโฟกัสvisibility:hidden- มันจะไม่ได้รับการโฟกัส
bakrall

“ คุณไม่สามารถมุ่งเน้นองค์ประกอบที่ยังไม่สามารถมองเห็นได้” - ฉันรักคุณ เพียงเพิ่มการหมดเวลา 100 มิลลิวินาทีฉันสามารถกระตุ้นการค้นหาในช่องค้นหาที่ซ่อนอยู่ของฉัน ขอบคุณ!
LuBre

ระวังการหมดเวลา สิ่งที่ใช้ได้กับเครื่องพัฒนาของคุณอาจใช้งานไม่ได้กับเครื่องอื่น
DroidOS

15

ถ้าคุณใช้ bootstrap + modal สิ่งนี้ใช้ได้กับฉัน:

  $(myModal).modal('toggle');
  $(myModal).on('shown.bs.modal', function() {
    $('#modalSearchBox').focus()
  });

8

ในกรณีที่คนอื่นสะดุดในคำถามนี้และมีสถานการณ์เดียวกันกับที่ฉันมี - ฉันพยายามกำหนดโฟกัสหลังจากคลิกที่องค์ประกอบอื่น แต่โฟกัสไม่ได้ทำงาน ปรากฎว่าฉันต้องการe.preventDefault();- นี่คือตัวอย่าง:

$('#recipients ul li').mousedown(function(e) {
    // add recipient to list
    ...
    // focus back onto the input
    $('#message_recipient_input').focus();
    // prevent the focus from leaving
    e.preventDefault();
});

สิ่งนี้ช่วย:

หากคุณโทร HTMLElement.focus () จากตัวจัดการเหตุการณ์ mousedown คุณจะต้องเรียกใช้ event.preventDefault () เพื่อป้องกันไม่ให้โฟกัสออกจาก HTMLElement ที่มา: https://developer.mozilla.org/en/docs/Web/API/HTMLElement/focus


2
งานเดียวเท่านั้น! Trigger เป็นป๊อปอัป div, คลิกที่ซ่อน div และใส่ค่าบางอย่างลงในกล่องข้อความ (ไม่ใช่อันที่จำเป็นต้องโฟกัส) โดยไม่มีการป้องกันค่าเริ่มต้นกล่องข้อความนั้นจะถูกเน้นเสมอไม่ว่า -__-
rlatief

4

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


ฉันด้วย! และความยาวของการหมดเวลาสร้างความแตกต่างอย่างแท้จริง IE ที่โง่
eaglei22

1
แต่มันไม่ทำงานบนอุปกรณ์มือถือ เบราว์เซอร์บนมือถือจะไม่สนใจในส่วนของทุกกรณีสิ่งที่อยู่ภายใน setTimeout
Kosmonaft

1
ตามกฎของหัวแม่มือการใช้setTimeoutเป็นวิธีแก้ปัญหาที่ไม่ดี คุณไม่สามารถรับประกันเวลาดำเนินการบนเครื่องของผู้ใช้ดังนั้นเนื้อหาที่ขึ้นอยู่กับเวลาจึงเปราะบางอย่างยิ่ง
นาธาน

3

ฉันยังมีปัญหานี้ โซลูชันที่ทำงานในกรณีของฉันคือการใช้คุณสมบัติ tabindex ในองค์ประกอบ HTML

ฉันกำลังใช้ ng-repeatองค์ประกอบ li บางอย่างในรายการและฉันไม่สามารถโฟกัสไปยัง li แรกที่ใช้. โฟกัส () ดังนั้นฉันเพียงแค่เพิ่มแอตทริบิวต์ tabindex ให้กับแต่ละ li ในระหว่างการวนซ้ำ

ดังนั้นตอนนี้ <li ng-repeat="user in users track by $index" tabindex="{{$index+1}}"></li>

+1 นั้นคือดัชนีเริ่มจาก 0 นอกจากนี้ตรวจสอบให้แน่ใจว่าองค์ประกอบนั้นมีอยู่ใน DOM ก่อนที่จะเรียกใช้ฟังก์ชัน. focus ()

ฉันหวังว่านี่จะช่วยได้.


2

สำหรับผู้ที่มีปัญหาการไม่ทำงานเพราะคุณใช้ "$ (องค์ประกอบ) .show ()" ฉันแก้ไขมันด้วยวิธีต่อไป:

 var textbox = $("#otherOption");
 textbox.show("fast", function () {
    textbox[0].focus();
  });

ดังนั้นคุณไม่ต้องการตัวจับเวลามันจะทำงานหลังจากวิธีการแสดงเสร็จสมบูรณ์


นี้ใช้กับการเปลี่ยนแปลงอื่น ๆ : slideDown(), fadeIn()ฯลฯ
ÁlvaroGonzález

2

เพิ่มความล่าช้าก่อนโฟกัส () 200 ms ก็เพียงพอแล้ว

function focusAndCursor(selector){
  var input = $(selector);
  setTimeout(function() {
    // this focus on last character if input isn't empty
    tmp = input.val(); input.focus().val("").blur().focus().val(tmp);
  }, 200);
}

0

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


0

ตรวจสอบให้แน่ใจว่าองค์ประกอบและผู้ปกครองนั้นสามารถมองเห็นได้ คุณไม่สามารถใช้การมุ่งเน้นองค์ประกอบที่ซ่อนอยู่


-1

การแก้ไขปัญหาเพิ่มเติมมีปัญหาเดียวกับที่โฟกัส () ดูเหมือนจะไม่ทำงาน แต่ในที่สุดมันกลับกลายเป็นว่าสิ่งที่จำเป็นคือการเลื่อนไปยังตำแหน่งที่ถูกต้อง:


-1

สำหรับกรณีของฉันฉันต้องระบุดัชนีแท็บ ( -1หากสามารถโฟกัสผ่านสคริปต์ได้เท่านั้น)

<div tabindex='-1'>
<!-- ... -->
</div>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.