$ .focus () çalışmıyor


155

JQuery'nin son örneği focus()belgeleri devletler

$('#id').focus()

girdiyi odaklanmış (etkin) yapmalıdır. Bu çalışmayı başaramıyorum.

Bu sitedeki konsolda bile, arama kutusu için deniyorum

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

ve hiçbir şey almıyorum. Herhangi bir fikir?


2
Bize kodunuzu gösterebilir misiniz?
Adil

Daha fazlasını bilmek zorundayız, çünkü benim için iyi çalışıyor: jsfiddle.net/G7hwR/1 sadece sağ panelde herhangi bir yere tıklayın ve odaklanıyor ...
Rob G

Yine de bu sayfaya odaklanılmamalı mı? Verdiğim pasaj?
Sam Selikoff

İçinde ne olduğuna bağlı; herhangi bir şeyin içinde değilse, büyük olasılıkla sayfa görüntülenmeden önce yayınlanır ...
Rob G

Buraya aramadan gelenler için: tarayıcının yerleşik geliştirici araçları focus()işlevlerini etkileyebilir . Daha fazla bilgi
aexl

Yanıtlar:


392

Aslında, bu siteye odaklanmak için verdiğiniz örnek, konsolda odaklanmadığınız sürece gayet iyi çalışıyor. Çalışmamasının nedeni, dev konsolundan odak çalmamasıdır. Konsolunuzda aşağıdaki kodu çalıştırır ve ardından tarayıcı pencerenizi hızlıca tıklarsanız, arama kutusuna odaklandığını görürsünüz:

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

Diğerine gelince, geçmişte bana sorun çıkaran tek şey olayların sırası. DOM'ya bağlı olmayan bir öğeye odak () yöntemini çağıramazsınız. Odaklamaya çalıştığınız öğe zaten DOM'a eklenmiş mi?


1
Harika! Bu her iki sorununuza da yardımcı oldu mu? Öyleyse, doğru cevap olarak işaretleyebilir misiniz? Çok takdir ediyorum: D
Justin Warkentin

4
geliştirici araçlarını yalnızca $ ('input [name = "q"]') kullanırken odaklamayın (); ya da çalışmıyor
Amitābha

12
Vay be, aylardır bununla uğraşıyordum, sadece bunun geliştirici konsolunun açık olmasından kaynaklandığını gördüm. Benimki hep öyle. Teşekkür ederim!
Alex Turpin

20
+1, "DOM'a eklenmemiş bir öğeye odaklanmayı () çağıramazsınız." Ayrıca, onu gizli elemanlar olarak adlandıramazsınız.
tandrewnichols

1
setTimeoutOperasyon problemlerinin sırasını çözmek için kullanmak , patootide sürdürülmesi büyük bir ağrı haline getirir. Bir hata ortaya çıkarsa hata ayıklamak gerçekten zordur. Öğeyi DOM'a her nereye eklerseniz, orayı çağırmalıdır .focus().
Kevin Beal

55

Net başka bir yerde bir çözüm bulundu ...

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

işe yaramadı.

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

Iş yaptı.


4
Bu çözümü sadece bu sayfadaki daha popüler çözüm işe yaramadığında benim için çalıştığı için destekledim. ;-)
chriv

İkinci seçenek sadece dom öğesini kapıyor ve jquery sürümü yerine normal javascript sürümünü kullanıyor gibi görünüyor.
danielson317

7
Sayfanızda "id" kimliğine sahip birden çok öğeniz olabilir mi? DOM bu durumda kırılmaz, ancak birden fazla öğeye odak atayamazsınız
DerpyNerd

Ben 0 bir gecikme ile bir window.setTimeout ile yapmak zorunda buldum ve sonra hepsi iyi. Teşekkürler. Denediğim diğer her şey bir önyükleme modelinde başarısız oldu.
Wade Hatler

23

Buradaki bazı cevaplar setTimeout, hedef öğeye odaklanma sürecini geciktirmek için kullanılmasını önermektedir . Bunlardan biri hedefin kalıcı bir diyalog içinde olduğunu belirtiyor. setTimeoutNerede kullanıldığına dair spesifik ayrıntıları bilmeden çözümün doğruluğu hakkında daha fazla yorum yapamam . Ancak, burada olduğu gibi bu konuya giren insanlara yardım etmek için burada bir cevap vermeliyim diye düşündüm

Meselenin basit gerçeği, henüz görünür olmayan bir öğeye odaklanamamanızdır . Bu sorunla karşılaşırsanız, odaklanma denemesi yapıldığında hedefin gerçekten görünür olduğundan emin olun . Kendi durumumda bu çizgiler boyunca bir şeyler yapıyordum

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

Bu işe yaramadı. Ben sadece $ çalıştırıldığında neler olduğunu fark ( '# elementID'). Focus () `konsolundan yaptığımız işi. Fark - hedefin üzerindeki kodumda, animasyonun tamamlanamayacağı için hedefin etkileneceğinin kesinliği yoktur . Ve ipucu yatıyor

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

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

beklendiği gibi çalışır. Ben de başlangıçta bir setTimeoutçözüm buldum ve o da işe yaradı. Bununla birlikte, keyfi olarak seçilen bir zaman aşımı, ana cihazın hedef öğenin görünür olmasını sağlama sürecine ne kadar yavaş gittiğine bağlı olarak çözümü er ya da geç kırmak zorundadır.


Benim için ilgili ipucu "hedefin gerçekten görünür olmasını sağlamak" idi. bu, koşullu olarak oluşturulmuş öğelere odaklanmaya çalışırken geçerli olur.
charlie carver

Ya da odaklanacak unsur olduğunda visibility:hidden- odaklanmayacaktır.
bakrall

`` henüz görünür olmayan bir öğeye odaklanamazsınız '' - Seni seviyorum. Sadece 100 ms zaman aşımı ekleyerek gizli arama kutuma odaklanmayı tetikleyebilirim. Teşekkürler!
LuBre

Zaman aşımlarına dikkat edin. Geliştirme makinenizde işe yarayan başka bir makinede işe yaramayabilir.
DroidOS

15

bootstrap + modal kullanıyorsanız, bu benim için çalıştı:

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

8

Başka birinin bu soruya rastlaması ve sahip olduğum durumun aynısı olması durumunda - başka bir öğeye tıkladıktan sonra odağı ayarlamaya çalışıyordum, ancak odak işe yaramadı. Sadece ihtiyacım olduğu ortaya çıktı e.preventDefault();- işte bir örnek:

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

Bu yardımcı oldu:

Fareyle kaplanmış bir olay işleyicisinden HTMLElement.focus () öğesini çağırırsanız, odağın HTMLElement öğesinden ayrılmasını önlemek için event.preventDefault () öğesini çağırmanız gerekir. Kaynak: https://developer.mozilla.org/en/docs/Web/API/HTMLElement/focus


2
Tek çalışan! Tetikleyici bir açılır div öğesidir, tıklatma div öğesini gizler ve bir metin kutusuna bir değer koyar (odaklanılması gerekmez). PreventDefault olmadan, ne olursa olsun bu metin kutusu her zaman odaklanır -__-
rlatief

4

Bunun eski olduğunu anlıyorum, ama bugün rastladım. Cevapların hiçbiri benim için işe yaramadı, işe yaradığını bulduğum şey setTimeout oldu. Ben setTimeout çalıştı kullanarak, bir kipte dosyalanmış girdi üzerine odaklanmak istedim. Bu yardımcı olur umarım!


Ben de! VE zaman aşımı süresi gerçekten bir fark yarattı. Aptal IE.
eaglei22

1
Ancak mobil cihazlarda çalışmıyor. Mobil tarayıcılar çoğu durumda
setin

1
Kullanarak Pratik bir kural olarak, setTimeoutbir olan kötü çözüm. Kullanıcının makinesinde yürütme süresini garanti edemezsiniz, bu nedenle zamana bağlı şeyler son derece kırılgandır.
Nathan

3

Ben de bu sorunu yaşadım. Benim durumumda çalışan çözüm, HTML öğesinde tabindex özelliğini kullanmaktı.

Ben kullanıyordum ng-repeatbir liste içindeki bazı li elemanları ve ben sadece döngü sırasında her li için tabindex niteliğini eklendi, böylece ilk li kullanılarak .focus () odak getirmek mümkün değildi.

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

Bu +1, dizin 0'dan başlar. Ayrıca .focus () işlevini çağırmadan önce öğenin DOM'da bulunduğundan emin olun

Umarım bu yardımcı olur.


2

"$ (Element) .show ()" kullandığınız için çalışmama sorunu olanlar için. Bir sonraki yolu çözdüm:

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

Böylece bir zamanlayıcıya ihtiyacınız yoktur, show yöntemi tamamlandıktan sonra yürütülür.


Bu slideDown(), diğer tüm geçişler için geçerlidir:, fadeIn()vb.
Álvaro González

2

Odaklanmadan önce bir gecikme ekleyin (). 200 ms yeterlidir

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

Şimdi bu sorunu tekrar ettim ve inanın ya da inanmayın, tek yapmam gereken geliştirici araçlarını kapatmaktı. Görünüşe göre Konsol sekmesi, sayfa içeriğine göre odak önceliğine sahiptir.


0

Öğenin ve ebeveynlerinin görünür olduğundan emin olun. Gizli öğelere odaklanamazsınız



-1

Benim durumum için bir sekme dizini belirtmem gerekiyordu ( -1yalnızca komut dosyasıyla odaklanabilirse)

<div tabindex='-1'>
<!-- ... -->
</div>
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.