JQuery: как найти первый видимый вход /select/textarea, исключая кнопки?

Я пробовал

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

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

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

UPD: Я выполняю это на $(document).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>

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

UPD2: Я нахожусь на странице ASP.NET, работающей под Sharepoint.

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

Ответ 1

Почему бы не просто настроить те, которые вам нужны (demo)?

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

Edit

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Код:

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

Ответ 6

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

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