$ .fokus () tidak berfungsi

155

Contoh terakhir darifocus() status dokumentasi jQuery

$('#id').focus()

harus membuat input terfokus (aktif). Sepertinya saya tidak bisa membuatnya bekerja.

Bahkan di konsol di situs ini, saya mencobanya untuk kotak pencarian

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

dan aku tidak mendapatkan apa-apa. Ada ide?

Sam Selikoff
sumber
2
Bisakah Anda menunjukkan kepada kami kode Anda?
Adil
Kita harus tahu lebih banyak, karena itu berfungsi dengan baik untuk saya: jsfiddle.net/G7hwR/1 klik saja di mana saja di panel kanan dan itu berfokus ...
Rob G
Tidakkah seharusnya fokus pada halaman ini berfungsi? Cuplikan yang saya berikan?
Sam Selikoff
Itu tergantung pada apa yang terkandung di dalamnya; jika tidak ada di dalam apa-apa, kemungkinan dijalankan sebelum halaman merender ...
Rob G
Bagi mereka yang datang ke sini dari pencarian: alat pengembang yang dibangun di browser mungkin mengganggu fungsi focus(). Info lebih lanjut
aexl

Jawaban:

392

Sebenarnya contoh yang Anda berikan untuk fokus pada situs ini berfungsi dengan baik, selama Anda tidak fokus di konsol. Alasan yang tidak berfungsi adalah hanya karena itu tidak mencuri fokus dari konsol dev. Jika Anda menjalankan kode berikut di konsol Anda dan kemudian dengan cepat mengklik di jendela browser Anda setelahnya, Anda akan melihatnya memfokuskan kotak pencarian:

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

Adapun yang lainnya, satu hal yang telah membuat saya kesulitan di masa lalu adalah urutan kejadian. Anda tidak dapat memanggil fokus () pada elemen yang belum dilampirkan ke DOM. Sudahkah elemen yang Anda coba fokuskan telah melekat pada DOM?

Justin Warkentin
sumber
1
Bagus! Apakah itu membantu kedua masalah Anda? Jika demikian, dapatkah Anda menandainya sebagai jawaban yang benar? Saya akan sangat menghargainya: D
Justin Warkentin
4
jangan gunakan alat pengembang saat hanya menggunakan $ ('input [nama = "q"]'). fokus (); atau tidak berfungsi
Amitābha
12
Wow, saya telah berjuang dan mati-matian dengan ini selama berbulan-bulan, saya hanya melihat bahwa ini disebabkan oleh konsol pengembang yang terbuka. Punyaku selalu begitu. Terima kasih!
Alex Turpin
20
+1 untuk "Anda tidak dapat memanggil fokus () pada elemen yang belum dilampirkan ke DOM." Juga, sepertinya Anda tidak dapat menyebutnya pada elemen tersembunyi.
tandrewnichols
1
Menggunakan setTimeoutuntuk memecahkan urutan masalah operasi membuatnya sangat sakit di patooty untuk mempertahankan. Jika bug muncul, sangat sulit untuk melakukan debug. Di mana pun Anda memasukkan elemen ke DOM, itu harus menelepon ke .focus()sana.
Kevin Beal
55

Menemukan solusi di tempat lain di internet ...

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

tidak bekerja.

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

berhasil.

Cymro
sumber
4
Saya memutakhirkan solusi ini hanya karena itu berfungsi untuk saya ketika solusi yang lebih populer di halaman ini tidak. ;-)
chriv
Opsi kedua sepertinya mengambil elemen dom dan menggunakan versi javascript biasa, bukan versi jquery.
danielson317
7
Mungkinkah Anda memiliki beberapa elemen dengan id "id" di halaman Anda? DOM tidak akan pecah dalam kasus ini tetapi Anda tidak dapat menetapkan fokus ke beberapa elemen juga
DerpyNerd
Saya menemukan saya harus melakukan ini dengan window.setTimeout dengan penundaan 0, dan kemudian semuanya baik-baik saja. Terima kasih. Segala sesuatu yang saya coba gagal dalam modal bootstrap.
Wade Hatler
23

Beberapa jawaban di sini menyarankan setTimeoutuntuk menunda proses pemfokusan pada elemen target. Salah satunya menyebutkan bahwa target ada di dalam dialog modal. Saya tidak dapat berkomentar lebih lanjut tentang kebenaran dari setTimeoutsolusi tanpa mengetahui detail spesifik di mana ia digunakan. Namun, saya pikir saya harus memberikan jawaban di sini untuk membantu orang-orang yang mengalami thread ini sama seperti saya

Fakta sederhananya adalah bahwa Anda tidak dapat fokus pada elemen yang belum terlihat . Jika Anda mengalami masalah ini, pastikan target benar-benar terlihat saat upaya memfokuskannya. Dalam kasus saya sendiri, saya melakukan sesuatu seperti itu

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

Ini tidak berhasil. Aku hanya menyadari apa yang terjadi ketika saya dieksekusi $ ( '# elementid'). Focus () `dari konsol yang melakukan pekerjaan. Perbedaannya - dalam kode saya di atas target tidak ada kepastian bahwa target akan terlihat karena animasi mungkin tidak lengkap . Dan di situlah letak petunjuknya

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

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

bekerja seperti yang diharapkan. Pada awalnya saya juga memberikan setTimeoutsolusi dan itu berhasil juga. Namun, batas waktu yang dipilih secara sewenang-wenang terikat untuk memecahkan solusi cepat atau lambat tergantung pada seberapa lambat perangkat host berjalan tentang proses memastikan bahwa elemen target terlihat.

DroidOS
sumber
Petunjuk yang relevan bagi saya adalah "memastikan bahwa target benar-benar terlihat". ini menjadi relevan ketika mencoba untuk fokus pada elemen yang diberikan secara kondisional.
charlie carver
Atau ketika elemen untuk fokus telah visibility:hidden- itu tidak akan fokus.
bakrall
`kamu tidak bisa fokus pada elemen yang belum terlihat` - Aku mencintaimu. Dengan hanya menambahkan batas waktu 100 ms saya dapat memicu fokus pada kotak pencarian saya yang tersembunyi. Terima kasih!
LuBre
Waspadalah terhadap batas waktu. Apa yang berfungsi pada mesin pengembangan Anda mungkin tidak berfungsi pada yang lain.
DroidOS
15

jika Anda menggunakan bootstrap + modal, ini berfungsi untuk saya:

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

Untuk berjaga-jaga jika ada orang lain yang menemukan pertanyaan ini dan memiliki situasi yang sama dengan saya - saya mencoba untuk mengatur fokus setelah mengklik pada elemen lain, namun fokus tampaknya tidak berfungsi. Ternyata saya hanya butuh e.preventDefault();- inilah contohnya:

$('#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();
});

Ini membantu:

Jika Anda memanggil HTMLElement.focus () dari pengendali acara mousedown, Anda harus menghubungi event.preventDefault () untuk menjaga fokus agar tidak meninggalkan HTMLElement. Sumber: https://developer.mozilla.org/en/docs/Web/API/HTMLElement/focus

Ben
sumber
2
Satu-satunya yang berfungsi! Pemicu adalah div popup, klik sembunyikan div dan masukkan beberapa nilai dalam kotak teks (bukan yang perlu difokuskan). Tanpa preventDefault, kotak teks itu selalu fokus tidak peduli apa -__-
rlatief
4

Saya menyadari ini sudah tua, tetapi menemukan hari ini. Tidak ada jawaban yang berfungsi untuk saya, apa yang saya temukan ternyata berhasil adalah setTimeout. Saya ingin fokus saya ditempatkan pada input yang diajukan dari modal, menggunakan setTimeout bekerja. Semoga ini membantu!

pengguna3861385
sumber
Saya juga! DAN lamanya waktu tunggu benar-benar membuat perbedaan. IE yang bodoh.
eaglei22
1
Tapi itu tidak berfungsi pada perangkat seluler. Peramban seluler mengabaikan sebagian besar kasus, semua yang ada di dalam setTimeout
Kosmonaft
1
Sebagai aturan praktis, menggunakan setTimeoutadalah solusi yang buruk . Anda tidak dapat menjamin waktu eksekusi pada mesin pengguna, sehingga hal-hal yang tergantung waktu sangat rapuh.
Nathan
3

Saya juga punya masalah ini. Solusi yang berhasil dalam kasus saya adalah menggunakan properti tabindex pada elemen HTML.

Saya menggunakan ng-repeatbeberapa elemen li di dalam daftar dan saya tidak dapat membawa fokus ke li pertama menggunakan .focus (), jadi saya cukup menambahkan atribut tabindex ke setiap li selama loop.

jadi sekarang <li ng-repeat="user in users track by $index" tabindex="{{$index+1}}"></li>

+1 adalah indeks yang dimulai dari 0. Pastikan juga elemen tersebut ada dalam DOM sebelum memanggil fungsi .focus ()

Saya harap ini membantu.

Kumar Shubham
sumber
2

Bagi mereka dengan masalah tidak berfungsi karena Anda menggunakan "$ (elemen) .show ()". Saya memecahkannya dengan cara berikut:

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

Jadi Anda tidak perlu timer, itu akan dijalankan setelah metode pertunjukan selesai.

Rolando Retana
sumber
Hal ini berlaku untuk setiap transisi lainnya: slideDown(), fadeIn(), dll
Alvaro González
2

Tambahkan penundaan sebelum fokus (). 200 ms sudah cukup

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);
}
Abel
sumber
0

Punya masalah ini lagi sekarang, dan percaya atau tidak, yang harus saya lakukan adalah menutup alat pengembang. Rupanya tab Konsol memiliki prioritas fokus di atas konten halaman.

aexl
sumber
0

Pastikan elemen dan orang tuanya terlihat. Anda tidak dapat menggunakan fokus pada elemen tersembunyi

mariovials
sumber
-1

SOLUSI TAMBAHAN Memiliki masalah yang sama di mana fokus () tampaknya tidak berfungsi tetapi akhirnya ternyata yang diperlukan adalah menggulir ke posisi yang benar:

Martin
sumber
-1

Untuk kasus saya, saya harus menentukan indeks tab ( -1jika hanya dapat fokus melalui skrip)

<div tabindex='-1'>
<!-- ... -->
</div>
Alexandre Daubricourt
sumber