Kimliğinden bağımsız bir HTML biçimindeki ilk giriş öğesine odağı nasıl ayarlayabilirim?


88

Bir web sayfasının odağını (giriş imleci), sayfanın yüklenmesinde öğenin kimliğini bilmek zorunda kalmadan ilk giriş öğesine (metin kutusu, açılır liste, ...) ayarlamanın basit bir yolu var mı ?

Bunu, web uygulamamın tüm sayfalarım / formları için ortak bir komut dosyası olarak uygulamak istiyorum.


7
HATIRLATMA Form, kullanıcının formu görmek için sayfayı aşağı kaydırması gerektiği şekilde sayfaya yerleştirilirse, odak ayarlandığında bir bağlantının yapacağı gibi sayfayı otomatik olarak aşağı kaydırır. Bu çok iyi değil çünkü kullanıcının böyle bir sayfaya ulaşması, hemen form konumuna kaydırıldığını görecektir. Safari ve FF'de test ettim (IE7 sayfa kaydırmayı gerçekleştirmiyor).
Marco Demaio 05

@Marco_Demaio Web uygulamam, her sayfanın pencerenin üst kısmına yakın bir yerde giriş kutuları olacak şekilde yapılandırılmıştır.
splattne

3
kullanıcı tarayıcı penceresi yüksekliğini 768 pikselden daha küçük bir boyuta yeniden boyutlandırırsa ne olur? Sayfa, odağı ayarladığınız yere kaydırılır. Her neyse, sadece bu kadar küçük bir konuyu bilmiyorsanız sizi uyarmak istedim, ben de bazı testler yapmadan önce bilmiyordum.
Marco Demaio

Yanıtlar:


97

Ayrıca jQuery tabanlı yöntemi de deneyebilirsiniz:

$(document).ready(function() {
    $('form:first *:input[type!=hidden]:first').focus();
});

İşe yarıyor! JQuery'yi web uygulamama entegre etmeye başlıyorum. Bu yüzden, bu yaklaşıma bağlı kalacağımı düşünüyorum! Çok teşekkürler, Marko!
splattne

3
Bu durumda sayfadaki ilk form gizlenirse ne olur? Veya formdaki ilk öğe CSS aracılığıyla gizlenmişse? Elbette bu başarısız olur. Elbette bilgiçlik yapıyorum ama böyle yuvarlanıyorum.
James Hughes

Benim durumumda (ASP.NET kullanarak) asla gizli olmayan sadece BİR formum var. Bu benim için çalışıyor.
splattne

@Jame Hughes, bunu bir fonksiyon olarak yazıp ihtiyaç duyduğunuzda çağırabilir, istisnalar yapabilirsiniz. Benim için bu çözüm gerçekten yardımcı oldu.
Luci

bu nedense benim için çalışmıyor. bir imleç görmemeli miyim?
Chris

141

Bu, soruyu yanıtlamasa da (ortak bir komut dosyası gerektirir), HTML5'in "otomatik odaklama" özelliğini sunduğunu başkalarının bilmesinin yararlı olabileceğini düşündüm:

<form>
  <input type="text" name="username" autofocus>
  <input type="password" name="password">
  <input type="submit" value="Login">
</form>

HTML5'e dalın daha fazla bilgi var.


2
otomatik odak, öznitelik adıdır. Otomatik netleme gibi bir şey = doğru gerekli değil mi? Herhangi bir değer belirlememek ne demektir?
Geek

4
HTML5'te, bazı özniteliklerin bir değere sahip olması gerekmez, "işaretlendi", bu durumda başka bir özniteliktir. Değer bırakıldığında bunun adla aynı olduğu ima edildiğine inanıyorum (örn. Autofocus = "autofocus" ve checkered = "kontrol edildi").
Jacob Stanley

autofocusHiçbir değer olmadan kullanmaya çalıştığımda Spring uygulamam bozuluyor spring:form. autofocus="autofocus"yine de iyi çalışıyor. Teşekkürler @ Jacob.
Sergei Tachenov

2
@Geek Otomatik odaklama niteliği, diğerleri gibi, bir boole öznitelik türüdür. Bu nedenle, ona bir değer atanarak değil, yalnızca bildirime dayalı olarak kullanılır. W3c
n1kkou

35
document.forms[0].elements[0].focus();

Bu, örneğin bir döngü kullanılarak rafine edilebilir. belirli alan türlerine, engelli alanlara vb. odaklanmayın. Gerçekten odaklanmak istediğiniz alana bir class = "autofocus" eklemek ve bu className'i arayan [i] .elements [j] formları üzerinde döngü yapmak daha iyi olabilir .

Her neyse: Bunu her sayfada yapmak normalde iyi bir fikir değildir. Bir girdiye odaklandığınızda, kullanıcı örneğin yapma yeteneğini kaybeder. sayfayı klavyeden kaydırın. Beklenmedikse, bu can sıkıcı olabilir, bu nedenle yalnızca form alanını kullanmanın kullanıcının yapmak istediği şey olacağından oldukça emin olduğunuzda otomatik odaklanma. yani. Google iseniz.


3
Doğru cevap olmalı, çünkü sorunun jquery etiketi yok.
Kalle H. Väravas

@ KalleH.Väravas hayır, söz konusu hiçbir yerde bulunamayacak varsayımlarda bulunduğu için olumsuz oy verilmelidir, örn. en az bir form var. Genellikle işe yaramaz.
9ilsdx 9rvj 0lo

18

Çalıştığım bulundu en kapsamlı jQuery ifadesi (aşırı yardımıyla geçer burada )

$(document).ready(function() {
    $('input:visible:enabled:first').focus();
});

1
Bunu kullanıyordum, bir tabloda çok sayıda> 1000 onay kutusu olduğunda IE'de çok yavaş çalıştığını fark ettim. Bu konuda ne yapacağınızdan emin değilsiniz, sadece ilk giriş alanına odaklanmayı bırakmanız gerekebilir.
Sam Watkins



5

Ayrıca tüm gizli girişleri atlamanız gerekir.

for (var i = 0; document.forms[0].elements[i].type == 'hidden'; i++);
document.forms[0].elements[i].focus();

Yanılıyor olabilirim, ancak formların [0] hiçbir gizli girdisi yoksa bu döngü tanımlanmış bir davranışa sahip değildir.
xtofl

Kesinlikle. Baştaki herhangi bir gizli girişi atlamak için kullanılır. Formda gizli olmayan alanlar olduğu varsayımı altında yazılmıştır. Bunu jQuery ile de yapabilirdim (başka bir cevap göndereceğim) ama jQuery'nin dahil olmasını istediğinizden bahsetmediniz.
Marko Dumic

1
@MarkoDumic Bir whileifade kullanabiliyorsanız neden hafızayı boşa harcayasınız ?
Lucio

3

Bu kodu bodyetiketinizin sonuna koymak , ilk görünür, gizli olmayan etkin öğeyi otomatik olarak ekrana odaklayacaktır. Kısa sürede bulabileceğim çoğu davayı halledecek.

<script>
    (function(){
        var forms = document.forms || [];
        for(var i = 0; i < forms.length; i++){
            for(var j = 0; j < forms[i].length; j++){
                if(!forms[i][j].readonly != undefined && forms[i][j].type != "hidden" && forms[i][j].disabled != true && forms[i][j].style.display != 'none'){
                    forms[i][j].focus();
                    return;
                }
            }
        }
    })();
</script>

1
Burada dikkate alınması gereken bir şey, kendileri gizli olmayan ama bir atanın olduğu unsurlarla eşleşebileceğidir. Bu, DOM'un yedeklenmesinin izlenmesini ve her ata görünürlüğünün test edilmesini gerektiriyor ki bu tür bir durum için ciddi olduğunu düşünüyorum.
James Hughes

Peki ya <input type = "text" readonly = "readonly"> Kodunuza böyle bir durum eklemeniz gerektiğini düşünüyorum. Normalde insanlar salt okunur giriş metin alanına odaklanmak istemezler. Her neyse, güzel kod ve +1 teşekkürler!
Marco Demaio

Test edilmedi, ancak onu! Formlarıyla güncelledim [i] [j]. Salt okunur! = Tanımsız
James Hughes


3

Bunu kullanıyorum:

$("form:first *:input,select,textarea").filter(":not([readonly='readonly']):not([disabled='disabled']):not([type='hidden'])").first().focus();

2

Bu, metin alanları ve seçim kutuları dahil olmak üzere görünür herhangi bir ortak girdinin ilkini alır. Bu aynı zamanda gizli, devre dışı veya salt okunur olmadıklarından emin olmanızı sağlar. yazılımımda kullandığım bir hedef div'e de izin veriyor (yani, bu formun içine ilk girdi).

$("input:visible:enabled:not([readonly]),textarea:visible:enabled:not([readonly]),select:visible:enabled:not([readonly])", 
    target).first().focus();

1

JSF2.2 + kullanan ve otomatik netlemeyi, değeri olmayan bir öznitelik olarak geçiremeyenler için şunu kullanın:

 p:autofocus="true"

Ve bunu ad alanına ekleyin p (Ayrıca sıklıkla pt kullanılır. Ne isterseniz isteyin).

<html ... xmlns:p="http://java.sun.com/jsf/passthrough">

1

jquery olmadan, örneğin normal javascript ile:

document.querySelector('form input:not([type=hidden])').focus()

Safari'de çalışıyor ancak Chrome 75'te değil (Nisan 2019)


0

İle AngularJS:

angular.element('#Element')[0].focus();

0

Bu, metin alanlarını içerir ve radyo düğmelerini hariç tutar

$(document).ready(function() {
    var first_input = $('input[type=text]:visible:enabled:first, textarea:visible:enabled:first')[0];
    if(first_input != undefined){ first_input.focus(); }
});

0

Bir üst öğe bu öğeyi gizleyebileceğinden, display özniteliğini kontrol etmek yerine clientHeight kullanabilmelisiniz:

function setFocus() {
    var forms = document.forms || [];
        for (var i = 0; i < forms.length; i++) {
            for (var j = 0; j < forms[i].length; j++) {
            var widget = forms[i][j];
                if ((widget && widget.domNode && widget.domNode.clientHeight > 0) && typeof widget.focus === "function")
                 && (typeof widget.disabled === "undefined" || widget.disabled === false)
                 && (typeof widget.readOnly === "undefined" || widget.readOnly === false)) {
                        widget.focus();
                        break;
                }
            }
        }
    }   
}

0

Üçüncü taraf kitaplıklar olmadan, aşağıdaki gibi bir şey kullanın

  const inputElements = parentElement.getElementsByTagName('input')
  if (inputChilds.length > 0) {
    inputChilds.item(0).focus();
  }

Tüm form öğesi etiketlerini dikkate aldığınızdan, diğer yanıtlarda olduğu gibi gizli / devre dışı olanları ekarte ettiğinizden emin olun.

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.