jQuery: как найти первый видимый ввод/выбор/textarea исключая кнопки?


пробовал

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

но он ничего не находит.

в чем моя ошибка?

UPD: я выполняю это на $(документ).нагрузки()

<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>

и в отладке я вижу, что firstInput пуст.

UPD2: Я в деле. ASP.NET страница работает под Sharepoint.

Я нашел до сих пор, что для некоторых элементов он находит их (для фиксированных), а для некоторых нет. : (

6 78

6 ответов:

почему бы просто не нацелиться на те, которые вы хотите (демо)?

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

Edit

или использовать jQuery : input селектор для фильтрации форма потомков.

$('form').find('*').filter(':input:visible:first');

код JQuery в порядке. Вы должны выполнить в обработчике ready, а не в событии загрузки окна.

<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>

обновление

я попробовал на примере Karim79 (спасибо за пример) и он отлично работает:http://jsfiddle.net/2sMfU/

Это мое резюме выше, и отлично работает для меня. Спасибо за информацию!

<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>

это улучшение по сравнению с ответом @Mottie, потому что по состоянию на jQuery 1.5.2 :text выбирает input элементы, которые не указаны type атрибут (в этом случае type="text" подразумевается):

$('form').find(':text,textarea,select').filter(':visible:first')

вот мое решение. Код должен быть достаточно легко следовать, но вот идея:

  • получить все входы, выделяет и текстовые области
  • все кнопки и скрытые поля
  • фильтр только для включенных, видимых полей
  • выберите первый
  • сфокусируйте выбранное поле

код:

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

затем просто вызовите focusFirst с вашим родительским элементом или селектор.

селектор:

focusFirst('form#aspnetForm');

элемент:

var el = $('form#aspnetForm');
focusFirst(el);

Вы можете попробовать ниже код...

$(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>