jQuery: jak znaleźć pierwsze widoczne wejście / zaznaczenie / obszar tekstu z wyłączeniem przycisków?

87

próbowałem

$(":input:not(input[type=button],input[type=submit],button):visible:first")

ale nic nie znajduje.

Jaki jest mój błąd?

UPD: wykonuję to na $ (dokument) .load ()

<script type="text/javascript">
$(window).load(function () {
  var aspForm  = $("form#aspnetForm");
  var firstInput = $(":input:not(input[type=button],input[type=submit],button):visible:first", aspForm);
  firstInput.focus();
});
</script>

aw debugowaniu widzę, że firstInput jest puste.

UPD2: Jestem na stronie ASP.NET działającej w programie Sharepoint.

Do tej pory odkryłem, że dla niektórych elementów je znajduje (dla naprawionych), a dla niektórych nie. :(

Artem
źródło
Spróbuj wpisać „input” zamiast „: input”?
Alec
Powinno działać dobrze. Twój problem leży gdzie indziej. Czy to nie wykonując przed$(document) jest ready()?
BalusC
Czy masz określony kod HTML do przeszukania?
Shiki
Może pierwsze wejście to type="hidden"? Kliknij stronę prawym przyciskiem myszy i wyświetl źródło. Wygenerowany kod HTML również ma znaczenie. Bez niego i odpowiedniego SSCCE kręci się w ciemności.
BalusC

Odpowiedzi:

166

Dlaczego nie skupić się na tych, których chcesz ( wersja demonstracyjna )?

$('form').find('input[type=text],textarea,select').filter(':visible:first');

Edytować

Lub użyj jQuery : selektor danych wejściowych , aby odfiltrować elementy podrzędne.

$('form').find('*').filter(':input:visible:first');
Mottie
źródło
5
Pole wyboru? Radio? Hasło? Nie wspominając o wielu nowych typach wprowadzania HTML5.
BalusC
9
@BalusC $ ('form'). Find (': input'). Filter (': visible: first')
Abe Petrillo
1
Chociaż działa to do pewnego stopnia, ignoruje atrybut tabindex.
eoleary
2
Mały chwytak, ale przydatny dodatek: zamiast ': visible: first', ': visible: enabled: first' będzie znacznie lepszym filtrem, ponieważ górny element może być w niektórych przypadkach wyłączony i fokus nie może się tam przenieść.
Prahlad Yeri
1
@PrahladYeri Być może także wykluczyć tylko do odczytu':input:visible:enabled:not([readonly]):first'
JustinStolle
13

Kod JQuery jest w porządku. Musisz wykonać w gotowym module obsługi, a nie w zdarzeniu ładowania okna.

<script type="text/javascript">
$(function(){
  var aspForm  = $("form#aspnetForm");
  var firstInput = $(":input:not(input[type=button],input[type=submit],button):visible:first", aspForm);
  firstInput.focus();
});
</script>

Aktualizacja

Próbowałem na przykładzie Karim79 (dzięki za przykład) i działa dobrze: http://jsfiddle.net/2sMfU/

PeterFromCologne
źródło
3
Dzięki @BalusC. Idę się teraz zastrzelić. Nienawidzę siebie. Mogłem spędzić ostatnią godzinę nie majstrując przy działającym kodzie. Mogłem nakarmić swoje psy, posprzątać kuchnię. Mogłem osiągnąć wiele rzeczy. Teraz mam tylko ból. Do widzenia, na zawsze… I tak, powinienem był posłuchać.
karim79
@karim: rofl. Nie ma za co :) Przy okazji: wykąpałem już swoje dzieci, przyniosłem je do łóżka, nakarmiłem psy i koty i wziąłem sobie coca colę;)
BalusC
7

To jest moje podsumowanie powyższego i działa idealnie dla mnie. Dzięki za informację!

<script language='javascript' type='text/javascript'>
    $(document).ready(function () {
        var firstInput = $('form').find('input[type=text],input[type=password],input[type=radio],input[type=checkbox],textarea,select').filter(':visible:first');
        if (firstInput != null) {
            firstInput.focus();
        }
    });
</script>
Ben Foster
źródło
3

Jest to poprawa w stosunku do odpowiedzi @ Mottie, ponieważ od jQuery 1.5.2 :textwybiera inputelementy, które nie mają określonego typeatrybutu (w tym przypadku type="text"jest to implikowane):

$('form').find(':text,textarea,select').filter(':visible:first')
Mike Slinn
źródło
1

Oto moje rozwiązanie. Kod powinien być łatwy do naśladowania, ale oto pomysł:

  • pobierz wszystkie dane wejściowe, zaznaczenia i obszary tekstowe
  • odfiltruj wszystkie przyciski i ukryte pola
  • filtruj tylko włączone, widoczne pola
  • wybierz pierwszą
  • zaznacz wybrane pole

Kod:

function focusFirst(parent) {
    $(parent).find('input, textarea, select')
        .not('input[type=hidden],input[type=button],input[type=submit],input[type=reset],input[type=image],button')
        .filter(':enabled:visible:first')
        .focus();
}

Następnie wywołaj po prostu focusFirst z elementem nadrzędnym lub selektorem.

Selektor:

focusFirst('form#aspnetForm');

Element:

var el = $('form#aspnetForm');
focusFirst(el);
J Adam Rogers
źródło
0

Możesz spróbować poniższego kodu ...

$(document).ready(function(){
    $('form').find('input[type=text],textarea,select').filter(':visible:first').focus();
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<form>
<input type="text" />
<input type="text" />
<input type="text" />
<input type="text" />
<input type="text" />
    
<input type="submit" />
</form>

Mahbub
źródło